diff options
author | murphy <murphy@rubychan.de> | 2008-09-21 16:25:44 +0000 |
---|---|---|
committer | murphy <murphy@rubychan.de> | 2008-09-21 16:25:44 +0000 |
commit | 9a5f5e6217db0b7689b64ca0892feacf32be3d66 (patch) | |
tree | 98a25e39c452f0d7d1268810b014d929ab9930cc /test | |
parent | 41acfacb91970c8fa4e8b34f35c718eb329a3733 (diff) | |
download | coderay-9a5f5e6217db0b7689b64ca0892feacf32be3d66.tar.gz |
New: *Java Scanner* (closes #42).
* Based on JavaScript, does a good job, but may need more polish.
* Java::BuiltinTypes::List is a helper constant that contains 2389 Java types.
** The list was generated from TextMate's Java bundle with the help of SimpleRegexpScanner.
* I added the JRuby core classes as example code for testing (1.8 MB)
JavaScript Scanner:
* Fixed recognition of floats and algebraic signs.
** Still needs work - we need to distinguish i-1 from i+-1.
More changes:
* New: "SimpleRegexpScanner":http://murfy.de/simple-regexp-scanner
* Added new token class :annotation along with CSS styles.
** Should be useful for Python, too.
* coderay_suite warns if no scanner was found for this language.
* PluginHost#default can be called without parameter (will return default id)
Diffstat (limited to 'test')
-rw-r--r-- | test/scanners/coderay_suite.rb | 1 | ||||
-rw-r--r-- | test/scanners/java/jruby.expected.raydebug | 51193 | ||||
-rw-r--r-- | test/scanners/java/jruby.in.java | 51193 | ||||
-rw-r--r-- | test/scanners/java/suite.rb | 2 | ||||
-rw-r--r-- | test/scanners/javascript/script.aculo.us.expected.raydebug | 144 |
5 files changed, 102461 insertions, 72 deletions
diff --git a/test/scanners/coderay_suite.rb b/test/scanners/coderay_suite.rb index 4ad057b..2a51979 100644 --- a/test/scanners/coderay_suite.rb +++ b/test/scanners/coderay_suite.rb @@ -142,6 +142,7 @@ module CodeRay time_for_lang = Benchmark.realtime do scanner = CodeRay::Scanners[self.class.lang].new + raise "No Scanner for #{self.class.lang} found!" if scanner.is_a? CodeRay::Scanners[nil] max = ENV.fetch('max', DEFAULT_MAX).to_i random_test scanner, max unless ENV['norandom'] || ENV['only'] diff --git a/test/scanners/java/jruby.expected.raydebug b/test/scanners/java/jruby.expected.raydebug new file mode 100644 index 0000000..e5c3491 --- /dev/null +++ b/test/scanners/java/jruby.expected.raydebug @@ -0,0 +1,51193 @@ +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +directive(public) type(enum) ident(CompatVersion) operator({) + + ident(RUBY1_8)operator(,) ident(RUBY1_9)operator(,) ident(BOTH)operator(;) + + directive(public) directive(static) ident(CompatVersion) ident(getVersionFromString)operator(()type(String) ident(compatString)operator(\)) operator({) + keyword(if) operator(()ident(compatString)operator(.)ident(equalsIgnoreCase)operator(()string<delimiter(")content(RUBY1_8)delimiter(")>operator(\))operator(\)) operator({) + keyword(return) ident(CompatVersion)operator(.)ident(RUBY1_8)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(compatString)operator(.)ident(equalsIgnoreCase)operator(()string<delimiter(")content(RUBY1_9)delimiter(")>operator(\))operator(\)) operator({) + keyword(return) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(;) + operator(}) keyword(else) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Damian Steer <pldms@mac.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +comment(/** + * An almost entirely useless interface for those objects that we _really_ want + * to finalise. + * + * @author pldms + * + */) +directive(public) type(interface) ident(Finalizable) operator({) + directive(public) type(void) ident(finalize)operator(()operator(\))operator(;) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) +comment(/** + * Error numbers. + * @fixme + * this interface is a big hack defining a bunch of arbitrary valor as system call error numbers + * this is actually because I need them but will probably need to be changed to something smarter + * sooner or later. + * The purpose of this class it to help implement the Errno module which in turn in needed by rubicon. + * @author Benoit Cerrina + **/) +directive(public) type(interface) ident(IErrno) +operator({) + type(int) ident(EPERM) operator(=) integer(1)operator(;) + type(int) ident(ENOENT) operator(=) integer(2)operator(;) + type(int) ident(ESRCH) operator(=) integer(3)operator(;) + type(int) ident(EINTR) operator(=) integer(4)operator(;) + type(int) ident(EIO) operator(=) integer(5)operator(;) + type(int) ident(ENXIO) operator(=) integer(6)operator(;) + type(int) ident(E2BIG) operator(=) integer(7)operator(;) + type(int) ident(ENOEXEC) operator(=) integer(8)operator(;) + type(int) ident(EBADF) operator(=) integer(9)operator(;) + type(int) ident(ECHILD) operator(=) integer(10)operator(;) + type(int) ident(EDEADLK) operator(=) integer(11)operator(;) + type(int) ident(ENOMEM) operator(=) integer(12)operator(;) + type(int) ident(EACCES) operator(=) integer(13)operator(;) + type(int) ident(EFAULT) operator(=) integer(14)operator(;) + type(int) ident(ENOTBLK) operator(=) integer(15)operator(;) + type(int) ident(EBUSY) operator(=) integer(16)operator(;) + type(int) ident(EEXIST) operator(=) integer(17)operator(;) + type(int) ident(EXDEV) operator(=) integer(18)operator(;) + type(int) ident(ENODEV) operator(=) integer(19)operator(;) + type(int) ident(ENOTDIR) operator(=) integer(20)operator(;) + type(int) ident(EISDIR) operator(=) integer(21)operator(;) + type(int) ident(EINVAL) operator(=) integer(22)operator(;) + type(int) ident(ENFILE) operator(=) integer(23)operator(;) + type(int) ident(EMFILE) operator(=) integer(24)operator(;) + type(int) ident(ENOTTY) operator(=) integer(25)operator(;) + type(int) ident(ETXTBSY) operator(=) integer(26)operator(;) + type(int) ident(EFBIG) operator(=) integer(27)operator(;) + type(int) ident(ENOSPC) operator(=) integer(28)operator(;) + type(int) ident(ESPIPE) operator(=) integer(29)operator(;) + type(int) ident(EROFS) operator(=) integer(30)operator(;) + type(int) ident(EMLINK) operator(=) integer(31)operator(;) + type(int) ident(EPIPE) operator(=) integer(32)operator(;) + type(int) ident(EDOM) operator(=) integer(33)operator(;) + type(int) ident(ERANGE) operator(=) integer(34)operator(;) + type(int) ident(EWOULDBLOCK) operator(=) integer(35)operator(;) + type(int) ident(EAGAIN) operator(=) integer(35)operator(;) + type(int) ident(EINPROGRESS) operator(=) integer(36)operator(;) + type(int) ident(EALREADY) operator(=) integer(37)operator(;) + type(int) ident(ENOTSOCK) operator(=) integer(38)operator(;) + type(int) ident(EDESTADDRREQ) operator(=) integer(39)operator(;) + type(int) ident(EMSGSIZE) operator(=) integer(40)operator(;) + type(int) ident(EPROTOTYPE) operator(=) integer(41)operator(;) + type(int) ident(ENOPROTOOPT) operator(=) integer(42)operator(;) + type(int) ident(EPROTONOSUPPORT) operator(=) integer(43)operator(;) + type(int) ident(ESOCKTNOSUPPORT) operator(=) integer(44)operator(;) + type(int) ident(EOPNOTSUPP) operator(=) integer(45)operator(;) + type(int) ident(EPFNOSUPPORT) operator(=) integer(46)operator(;) + type(int) ident(EAFNOSUPPORT) operator(=) integer(47)operator(;) + type(int) ident(EADDRINUSE) operator(=) integer(48)operator(;) + type(int) ident(EADDRNOTAVAIL) operator(=) integer(49)operator(;) + type(int) ident(ENETDOWN) operator(=) integer(50)operator(;) + type(int) ident(ENETUNREACH) operator(=) integer(51)operator(;) + type(int) ident(ENETRESET) operator(=) integer(52)operator(;) + type(int) ident(ECONNABORTED) operator(=) integer(53)operator(;) + type(int) ident(ECONNRESET) operator(=) integer(54)operator(;) + type(int) ident(ENOBUFS) operator(=) integer(55)operator(;) + type(int) ident(EISCONN) operator(=) integer(56)operator(;) + type(int) ident(ENOTCONN) operator(=) integer(57)operator(;) + type(int) ident(ESHUTDOWN) operator(=) integer(58)operator(;) + type(int) ident(ETOOMANYREFS) operator(=) integer(59)operator(;) + type(int) ident(ETIMEDOUT) operator(=) integer(60)operator(;) + type(int) ident(ECONNREFUSED) operator(=) integer(61)operator(;) + type(int) ident(ELOOP) operator(=) integer(62)operator(;) + type(int) ident(ENAMETOOLONG) operator(=) integer(63)operator(;) + type(int) ident(EHOSTDOWN) operator(=) integer(64)operator(;) + type(int) ident(EHOSTUNREACH) operator(=) integer(65)operator(;) + type(int) ident(ENOTEMPTY) operator(=) integer(66)operator(;) + type(int) ident(EUSERS) operator(=) integer(68)operator(;) + type(int) ident(EDQUOT) operator(=) integer(69)operator(;) + type(int) ident(ESTALE) operator(=) integer(70)operator(;) + type(int) ident(EREMOTE) operator(=) integer(71)operator(;) + type(int) ident(ENOLCK) operator(=) integer(77)operator(;) + type(int) ident(ENOSYS) operator(=) integer(78)operator(;) + type(int) ident(EOVERFLOW) operator(=) integer(84)operator(;) + type(int) ident(EIDRM) operator(=) integer(90)operator(;) + type(int) ident(ENOMSG) operator(=) integer(91)operator(;) + type(int) ident(EILSEQ) operator(=) integer(92)operator(;) + type(int) ident(EBADMSG) operator(=) integer(94)operator(;) + type(int) ident(EMULTIHOP) operator(=) integer(95)operator(;) + type(int) ident(ENODATA) operator(=) integer(96)operator(;) + type(int) ident(ENOLINK) operator(=) integer(97)operator(;) + type(int) ident(ENOSR) operator(=) integer(98)operator(;) + type(int) ident(ENOSTR) operator(=) integer(99)operator(;) + type(int) ident(EPROTO) operator(=) integer(100)operator(;) + type(int) ident(ETIME) operator(=) integer(101)operator(;) + type(int) ident(EOPNOTSUPP_DARWIN) operator(=) integer(102)operator(;) +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2007 William N Dortch <bill.dortch@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.Map)operator(;) + +keyword(import) include(org.jruby.internal.runtime.methods.DynamicMethod)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.builtin.Variable)operator(;) + +comment(/** + * This class is used to provide an intermediate superclass for modules and classes that include + * other modules. It inserts itself as the immediate superClass of the includer, but defers all + * module methods to the actual superclass. Multiple of these intermediate superclasses can be + * added for multiple included modules. + * + * This allows the normal superclass-based searches (searchMethod, getConstant, etc\) to traverse + * the superclass ancestors as normal while the included modules do not actually show up in + * direct inheritance traversal. + * + * @see org.jruby.RubyModule + */) +directive(public) directive(final) type(class) class(IncludedModuleWrapper) directive(extends) ident(RubyClass) operator({) + directive(private) directive(final) ident(RubyModule) ident(delegate)operator(;) + + directive(public) ident(IncludedModuleWrapper)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClass)operator(,) ident(RubyModule) ident(delegate)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(superClass)operator(,) keyword(false)operator(\))operator(;) + local_variable(this)operator(.)ident(delegate) operator(=) ident(delegate)operator(;) + local_variable(this)operator(.)ident(metaClass) operator(=) ident(delegate)operator(.)ident(metaClass)operator(;) + operator(}) + + comment(/** + * Overridden newIncludeClass implementation to allow attaching future includes to the correct module + * (i.e. the one to which this is attached\) + * + * @see org.jruby.RubyModule#newIncludeClass(RubyClass\) + */) + annotation(@Override) + directive(public) ident(IncludedModuleWrapper) ident(newIncludeClass)operator(()ident(RubyClass) ident(superClass)operator(\)) operator({) + ident(IncludedModuleWrapper) ident(includedModule) operator(=) keyword(new) ident(IncludedModuleWrapper)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(superClass)operator(,) ident(getNonIncludedClass)operator(()operator(\))operator(\))operator(;) + + comment(// include its parent (and in turn that module's parents\)) + keyword(if) operator(()ident(getSuperClass)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(includedModule)operator(.)ident(includeModule)operator(()ident(getSuperClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(includedModule)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isModule)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isClass)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isIncluded)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isImmediate)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(void) ident(setMetaClass)operator(()ident(RubyClass) ident(newRubyClass)operator(\)) operator({) + keyword(throw) keyword(new) type(UnsupportedOperationException)operator(()string<delimiter(")content(An included class is only a wrapper for a module)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(Map)operator(<)type(String)operator(,) ident(DynamicMethod)operator(>) ident(getMethods)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(getMethods)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(void) ident(addMethod)operator(()type(String) ident(name)operator(,) ident(DynamicMethod) ident(method)operator(\)) operator({) + keyword(throw) keyword(new) type(UnsupportedOperationException)operator(()string<delimiter(")content(An included class is only a wrapper for a module)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(setMethods)operator(()type(Map) ident(newMethods)operator(\)) operator({) + keyword(throw) keyword(new) type(UnsupportedOperationException)operator(()string<delimiter(")content(An included class is only a wrapper for a module)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(String) ident(getName)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(getName)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyModule) ident(getNonIncludedClass)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyClass) ident(getRealClass)operator(()operator(\)) operator({) + keyword(return) ident(getSuperClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) type(boolean) ident(isSame)operator(()ident(RubyModule) ident(module)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(isSame)operator(()ident(module)operator(\))operator(;) + operator(}) + + comment(/** + * We don't want to reveal ourselves to Ruby code, so delegate this + * operation. + */) + annotation(@Override) + directive(public) ident(IRubyObject) ident(id)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(id)operator(()operator(\))operator(;) + operator(}) + + comment(//) + comment(// VARIABLE TABLE METHODS - pass to delegate) + comment(//) + + annotation(@Override) + directive(protected) type(boolean) ident(variableTableContains)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableContains)operator(()ident(name)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) type(boolean) ident(variableTableFastContains)operator(()type(String) ident(internedName)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableFastContains)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableFetch)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableFetch)operator(()ident(name)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableFastFetch)operator(()type(String) ident(internedName)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableFastFetch)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableStore)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableStore)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableFastStore)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableFastStore)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableRemove)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableRemove)operator(()ident(name)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(VariableTableEntry)type([]) ident(variableTableGetTable)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableGetTable)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) type(int) ident(variableTableGetSize)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableGetSize)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) type(void) ident(variableTableSync)operator(()type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(vars)operator(\)) operator({) + ident(delegate)operator(.)ident(variableTableSync)operator(()ident(vars)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableReadLocked)operator(()ident(VariableTableEntry) ident(entry)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableReadLocked)operator(()ident(entry)operator(\))operator(;) + operator(}) + + comment(/** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + annotation(@Override) + annotation(@Deprecated) comment(// born deprecated) + directive(protected) type(Map) ident(variableTableGetMap)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableGetMap)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + annotation(@Override) + annotation(@Deprecated) comment(// born deprecated) + directive(protected) type(Map) ident(variableTableGetMap)operator(()type(Map) ident(map)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(variableTableGetMap)operator(()ident(map)operator(\))operator(;) + operator(}) + + comment(//) + comment(// CONSTANT TABLE METHODS - pass to delegate) + comment(//) + + annotation(@Override) + directive(protected) type(boolean) ident(constantTableContains)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(constantTableContains)operator(()ident(name)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) type(boolean) ident(constantTableFastContains)operator(()type(String) ident(internedName)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(constantTableFastContains)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(constantTableFetch)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(constantTableFetch)operator(()ident(name)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(constantTableFastFetch)operator(()type(String) ident(internedName)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(constantTableFastFetch)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(constantTableStore)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + comment(// FIXME: legal here? may want UnsupportedOperationException) + keyword(return) ident(delegate)operator(.)ident(constantTableStore)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(constantTableFastStore)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + comment(// FIXME: legal here? may want UnsupportedOperationException) + keyword(return) ident(delegate)operator(.)ident(constantTableFastStore)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(constantTableRemove)operator(()type(String) ident(name)operator(\)) operator({) + comment(// this _is_ legal (when removing an undef\)) + keyword(return) ident(delegate)operator(.)ident(constantTableRemove)operator(()ident(name)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(ConstantTableEntry)type([]) ident(constantTableGetTable)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(constantTableGetTable)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) type(int) ident(constantTableGetSize)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(constantTableGetSize)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(protected) type(void) ident(constantTableSync)operator(()type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(vars)operator(\)) operator({) + comment(// FIXME: legal here? may want UnsupportedOperationException) + ident(delegate)operator(.)ident(constantTableSync)operator(()ident(vars)operator(\))operator(;) + operator(}) + + comment(/** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + annotation(@Override) + annotation(@Deprecated) comment(// born deprecated) + directive(protected) type(Map) ident(constantTableGetMap)operator(()operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(constantTableGetMap)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + annotation(@Override) + annotation(@Deprecated) comment(// born deprecated) + directive(protected) type(Map) ident(constantTableGetMap)operator(()type(Map) ident(map)operator(\)) operator({) + keyword(return) ident(delegate)operator(.)ident(constantTableGetMap)operator(()ident(map)operator(\))operator(;) + operator(}) + +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Charles Nutter <charles.o.nutter@sun.com> + * Copyright (C\) 2008 MenTaLguY <mental@rydia.net> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.applet.Applet)operator(;) +keyword(import) include(java.awt.BorderLayout)operator(;) +keyword(import) include(java.awt.Color)operator(;) +keyword(import) include(java.awt.Container)operator(;) +keyword(import) include(java.awt.EventQueue)operator(;) +keyword(import) include(java.awt.Font)operator(;) +keyword(import) include(java.awt.Insets)operator(;) +keyword(import) include(java.awt.Graphics)operator(;) +keyword(import) include(java.awt.GraphicsConfiguration)operator(;) +keyword(import) include(java.awt.GraphicsEnvironment)operator(;) +keyword(import) include(java.awt.image.VolatileImage)operator(;) +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.InputStream)operator(;) +keyword(import) include(java.io.PrintStream)operator(;) +keyword(import) include(java.net.URL)operator(;) +keyword(import) include(java.util.Arrays)operator(;) + +keyword(import) include(java.lang.reflect.InvocationTargetException)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.demo.TextAreaReadline)operator(;) +keyword(import) include(org.jruby.javasupport.JavaUtil)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +keyword(import) include(javax.swing.JScrollPane)operator(;) +keyword(import) include(javax.swing.JTextPane)operator(;) + +comment(/** + * @author <a href="mailto:mental@rydia.net">MenTaLguY</a> + * + * The JRubyApplet class provides a simple way to write Java applets using + * JRuby without needing to create a custom Java applet class. At applet + * initialization time, JRubyApplet starts up a JRuby runtime, then evaluates + * the scriptlet given as the "eval" applet parameter. + * + * The Java applet instance is available to the Ruby script as + * JRUBY_APPLET; the script can define callbacks for applet start, stop, + * and destroy by passing blocks to JRUBY_APPLET.on_start, + * JRUBY_APPLET.on_stop, and JRUBY_APPLET.on_destroy, respectively. + * + * Ruby code can install a custom paint callback using JRUBY_APPLET.on_paint + * (the Graphics2D object is passed as an argument to the callback\). By + * default, JRubyApplet painting is double-buffered, but you can select + * single-buffered painting via JRUBY_APPLET.double_buffered = false. + * + * The applet's background color can be set via JRUBY_APPLET.background_color=. + * You may want to set it to nil if you're not using double-buffering, so that + * no background color will be drawn (your own paint code is then responsible + * for filling the area\). + * + * Beyond these things, you should be able to use JRuby's Java integration + * to do whatever you would do in Java with the applet instance. + * + */) +directive(public) type(class) class(JRubyApplet) directive(extends) type(Applet) operator({) + directive(private) ident(Ruby) ident(runtime)operator(;) + directive(private) type(boolean) ident(doubleBuffered) operator(=) keyword(true)operator(;) + directive(private) type(Color) ident(backgroundColor) operator(=) type(Color)operator(.)ident(WHITE)operator(;) + directive(private) ident(RubyProc) ident(startProc)operator(;) + directive(private) ident(RubyProc) ident(stopProc)operator(;) + directive(private) ident(RubyProc) ident(destroyProc)operator(;) + directive(private) ident(RubyProc) ident(paintProc)operator(;) + directive(private) type(Graphics) ident(priorGraphics)operator(;) + directive(private) ident(IRubyObject) ident(wrappedGraphics)operator(;) + directive(private) type(VolatileImage) ident(backBuffer)operator(;) + directive(private) type(Graphics) ident(backBufferGraphics)operator(;) + directive(private) ident(Facade) ident(facade)operator(;) + + directive(private) type(interface) ident(Facade) operator({) + directive(public) type(InputStream) ident(getInputStream)operator(()operator(\))operator(;) + directive(public) type(PrintStream) ident(getOutputStream)operator(()operator(\))operator(;) + directive(public) type(PrintStream) ident(getErrorStream)operator(()operator(\))operator(;) + directive(public) type(void) ident(attach)operator(()ident(Ruby) ident(runtime)operator(,) type(Applet) ident(applet)operator(\))operator(;) + directive(public) type(void) ident(destroy)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(RubyProc) ident(blockToProc)operator(()ident(Ruby) ident(runtime)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(RubyProc) ident(proc) operator(=) ident(block)operator(.)ident(getProcObject)operator(()operator(\))operator(;) + keyword(if) operator(()ident(proc) operator(==) keyword(null)operator(\)) operator({) + ident(proc) operator(=) ident(RubyProc)operator(.)ident(newProc)operator(()ident(runtime)operator(,) ident(block)operator(,) ident(block)operator(.)ident(type)operator(\))operator(;) + operator(}) + keyword(return) ident(proc)operator(;) + operator(}) keyword(else) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + operator(}) + + directive(private) type(boolean) ident(getBooleanParameter)operator(()type(String) ident(name)operator(,) type(boolean) ident(defaultValue)operator(\)) operator({) + type(String) ident(value) operator(=) ident(getParameter)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(() ident(value) operator(!=) keyword(null) operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(equals)operator(()string<delimiter(")content(true)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(defaultValue)operator(;) + operator(}) + operator(}) + + directive(private) type(InputStream) ident(getCodeResourceAsStream)operator(()type(String) ident(name)operator(\)) operator({) + keyword(if) operator(()ident(name) operator(==) keyword(null)operator(\)) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + keyword(try) operator({) + directive(final) type(URL) ident(directURL) operator(=) keyword(new) type(URL)operator(()ident(getCodeBase)operator(()operator(\))operator(,) ident(name)operator(\))operator(;) + keyword(return) ident(directURL)operator(.)ident(openStream)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + operator(}) + keyword(return) ident(JRubyApplet)operator(.)ident(class)operator(.)ident(getClassLoader)operator(()operator(\))operator(.)ident(getResourceAsStream)operator(()ident(name)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(safeInvokeAndWait)operator(()type(Runnable) ident(runnable)operator(\)) directive(throws) type(InvocationTargetException)operator(,) type(InterruptedException) operator({) + keyword(if) operator(()type(EventQueue)operator(.)ident(isDispatchThread)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(runnable)operator(.)ident(run)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({) + keyword(throw) keyword(new) type(InvocationTargetException)operator(()ident(e)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + type(EventQueue)operator(.)ident(invokeAndWait)operator(()ident(runnable)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(class) class(RubyMethods) operator({) + annotation(@JRubyMethod) + directive(public) directive(static) ident(IRubyObject) ident(on_start)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(JRubyApplet) ident(applet) operator(=) operator(()ident(JRubyApplet)operator(\))ident(recv)operator(.)ident(dataGetStruct)operator(()operator(\))operator(;) + directive(synchronized) operator(()ident(applet)operator(\)) operator({) + ident(applet)operator(.)ident(startProc) operator(=) ident(blockToProc)operator(()ident(applet)operator(.)ident(runtime)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) directive(static) ident(IRubyObject) ident(on_stop)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(JRubyApplet) ident(applet) operator(=) operator(()ident(JRubyApplet)operator(\))ident(recv)operator(.)ident(dataGetStruct)operator(()operator(\))operator(;) + directive(synchronized) operator(()ident(applet)operator(\)) operator({) + ident(applet)operator(.)ident(stopProc) operator(=) ident(blockToProc)operator(()ident(applet)operator(.)ident(runtime)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) directive(static) ident(IRubyObject) ident(on_destroy)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(JRubyApplet) ident(applet) operator(=) operator(()ident(JRubyApplet)operator(\))ident(recv)operator(.)ident(dataGetStruct)operator(()operator(\))operator(;) + directive(synchronized) operator(()ident(applet)operator(\)) operator({) + ident(applet)operator(.)ident(destroyProc) operator(=) ident(blockToProc)operator(()ident(applet)operator(.)ident(runtime)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) directive(static) ident(IRubyObject) ident(on_paint)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(JRubyApplet) ident(applet) operator(=) operator(()ident(JRubyApplet)operator(\))ident(recv)operator(.)ident(dataGetStruct)operator(()operator(\))operator(;) + directive(synchronized) operator(()ident(applet)operator(\)) operator({) + ident(applet)operator(.)ident(paintProc) operator(=) ident(blockToProc)operator(()ident(applet)operator(.)ident(runtime)operator(,) ident(block)operator(\))operator(;) + ident(applet)operator(.)ident(repaint)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(;) + operator(}) + operator(}) + + annotation(@Override) + directive(public) type(void) ident(init)operator(()operator(\)) operator({) + local_variable(super)operator(.)ident(init)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(getBooleanParameter)operator(()string<delimiter(")content(jruby.console)delimiter(")>operator(,) keyword(false)operator(\))operator(\)) operator({) + ident(facade) operator(=) keyword(new) ident(ConsoleFacade)operator(()ident(getParameter)operator(()string<delimiter(")content(jruby.banner)delimiter(")>operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(facade) operator(=) keyword(new) ident(TrivialFacade)operator(()operator(\))operator(;) + operator(}) + + directive(synchronized) operator(()local_variable(this)operator(\)) operator({) + keyword(if) operator(()ident(runtime) operator(!=) keyword(null)operator(\)) operator({) + keyword(return)operator(;) + operator(}) + + directive(final) ident(RubyInstanceConfig) ident(config) operator(=) keyword(new) ident(RubyInstanceConfig)operator(()operator(\)) operator({)operator({) + ident(setInput)operator(()ident(facade)operator(.)ident(getInputStream)operator(()operator(\))operator(\))operator(;) + ident(setOutput)operator(()ident(facade)operator(.)ident(getOutputStream)operator(()operator(\))operator(\))operator(;) + ident(setError)operator(()ident(facade)operator(.)ident(getErrorStream)operator(()operator(\))operator(\))operator(;) + ident(setObjectSpaceEnabled)operator(()ident(getBooleanParameter)operator(()string<delimiter(")content(jruby.objectspace)delimiter(")>operator(,) keyword(false)operator(\))operator(\))operator(;) + operator(})operator(})operator(;) + ident(Ruby)operator(.)ident(setSecurityRestricted)operator(()keyword(true)operator(\))operator(;) + ident(runtime) operator(=) ident(Ruby)operator(.)ident(newInstance)operator(()ident(config)operator(\))operator(;) + operator(}) + + directive(final) type(String) ident(scriptName) operator(=) ident(getParameter)operator(()string<delimiter(")content(jruby.script)delimiter(")>operator(\))operator(;) + directive(final) type(InputStream) ident(scriptStream) operator(=) ident(getCodeResourceAsStream)operator(()ident(scriptName)operator(\))operator(;) + directive(final) type(String) ident(evalString) operator(=) ident(getParameter)operator(()string<delimiter(")content(jruby.eval)delimiter(")>operator(\))operator(;) + + keyword(try) operator({) + directive(final) ident(JRubyApplet) ident(applet) operator(=) local_variable(this)operator(;) + ident(safeInvokeAndWait)operator(()keyword(new) type(Runnable)operator(()operator(\)) operator({) + directive(public) type(void) ident(run)operator(()operator(\)) operator({) + ident(applet)operator(.)ident(setLayout)operator(()keyword(new) type(BorderLayout)operator(()operator(\))operator(\))operator(;) + ident(applet)operator(.)ident(facade)operator(.)ident(attach)operator(()ident(applet)operator(.)ident(runtime)operator(,) ident(applet)operator(\))operator(;) + keyword(if) operator(()ident(scriptStream) operator(!=) keyword(null)operator(\)) operator({) + ident(applet)operator(.)ident(runtime)operator(.)ident(runFromMain)operator(()ident(scriptStream)operator(,) ident(scriptName)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(evalString) operator(!=) keyword(null)operator(\)) operator({) + ident(applet)operator(.)ident(runtime)operator(.)ident(evalScriptlet)operator(()ident(evalString)operator(\))operator(;) + operator(}) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(catch) operator(()type(InterruptedException) ident(e)operator(\)) operator({) + operator(}) keyword(catch) operator(()type(InvocationTargetException) ident(e)operator(\)) operator({) + keyword(throw) keyword(new) type(RuntimeException)operator(()string<delimiter(")content(Error running script)delimiter(")>operator(,) ident(e)operator(.)ident(getCause)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(invokeCallback)operator(()directive(final) ident(RubyProc) ident(proc)operator(,) directive(final) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(proc) operator(==) keyword(null)operator(\)) operator({) + keyword(return)operator(;) + operator(}) + directive(final) ident(Ruby) ident(runtime) operator(=) local_variable(this)operator(.)ident(runtime)operator(;) + keyword(try) operator({) + ident(safeInvokeAndWait)operator(()keyword(new) type(Runnable)operator(()operator(\)) operator({) + directive(public) type(void) ident(run)operator(()operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(proc)operator(.)ident(call)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(catch) operator(()type(InterruptedException) ident(e)operator(\)) operator({) + operator(}) keyword(catch) operator(()type(InvocationTargetException) ident(e)operator(\)) operator({) + keyword(throw) keyword(new) type(RuntimeException)operator(()string<delimiter(")content(Ruby callback failed)delimiter(")>operator(,) ident(e)operator(.)ident(getCause)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(synchronized) type(void) ident(setBackgroundColor)operator(()type(Color) ident(color)operator(\)) operator({) + ident(backgroundColor) operator(=) ident(color)operator(;) + ident(repaint)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(synchronized) type(Color) ident(getBackgroundColor)operator(()operator(\)) operator({) + keyword(return) ident(backgroundColor)operator(;) + operator(}) + + directive(public) directive(synchronized) type(boolean) ident(isDoubleBuffered)operator(()operator(\)) operator({) + keyword(return) ident(doubleBuffered)operator(;) + operator(}) + + directive(public) directive(synchronized) type(void) ident(setDoubleBuffered)operator(()type(boolean) ident(shouldBuffer)operator(\)) operator({) + ident(doubleBuffered) operator(=) ident(shouldBuffer)operator(;) + ident(repaint)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) directive(synchronized) type(void) ident(start)operator(()operator(\)) operator({) + local_variable(super)operator(.)ident(start)operator(()operator(\))operator(;) + ident(invokeCallback)operator(()ident(startProc)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)operator(})operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) directive(synchronized) type(void) ident(stop)operator(()operator(\)) operator({) + ident(invokeCallback)operator(()ident(stopProc)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)operator(})operator(\))operator(;) + local_variable(super)operator(.)ident(stop)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) directive(synchronized) type(void) ident(destroy)operator(()operator(\)) operator({) + keyword(try) operator({) + ident(invokeCallback)operator(()ident(destroyProc)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)operator(})operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(facade)operator(.)ident(destroy)operator(()operator(\))operator(;) + directive(final) ident(Ruby) ident(runtime) operator(=) local_variable(this)operator(.)ident(runtime)operator(;) + local_variable(this)operator(.)ident(runtime) operator(=) keyword(null)operator(;) + ident(startProc) operator(=) keyword(null)operator(;) + ident(stopProc) operator(=) keyword(null)operator(;) + ident(destroyProc) operator(=) keyword(null)operator(;) + ident(paintProc) operator(=) keyword(null)operator(;) + ident(priorGraphics) operator(=) keyword(null)operator(;) + ident(wrappedGraphics) operator(=) keyword(null)operator(;) + ident(runtime)operator(.)ident(tearDown)operator(()operator(\))operator(;) + local_variable(super)operator(.)ident(destroy)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Override) + directive(public) type(void) ident(update)operator(()type(Graphics) ident(g)operator(\)) operator({) + ident(paint)operator(()ident(g)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) directive(synchronized) type(void) ident(paint)operator(()type(Graphics) ident(g)operator(\)) operator({) + keyword(if) operator(()ident(doubleBuffered)operator(\)) operator({) + ident(paintBuffered)operator(()ident(g)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(paintUnbuffered)operator(()ident(g)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(synchronized) type(void) ident(paintBuffered)operator(()type(Graphics) ident(g)operator(\)) operator({) + keyword(do) operator({) + type(GraphicsConfiguration) ident(config) operator(=) ident(getGraphicsConfiguration)operator(()operator(\))operator(;) + type(int) ident(width) operator(=) ident(getWidth)operator(()operator(\))operator(;) + type(int) ident(height) operator(=) ident(getHeight)operator(()operator(\))operator(;) + keyword(if) operator(()ident(backBuffer) operator(==) keyword(null) operator(||) ident(width) operator(!=) ident(backBuffer)operator(.)ident(getWidth)operator(()operator(\)) operator(||) ident(height) operator(!=) ident(backBuffer)operator(.)ident(getHeight)operator(()operator(\)) operator(||) ident(backBuffer)operator(.)ident(validate)operator(()ident(config)operator(\)) operator(==) type(VolatileImage)operator(.)ident(IMAGE_INCOMPATIBLE)operator(\)) operator({) + keyword(if) operator(()ident(backBuffer) operator(!=) keyword(null)operator(\)) operator({) + ident(backBufferGraphics)operator(.)ident(dispose)operator(()operator(\))operator(;) + ident(backBufferGraphics) operator(=) keyword(null)operator(;) + ident(backBuffer)operator(.)ident(flush)operator(()operator(\))operator(;) + ident(backBuffer) operator(=) keyword(null)operator(;) + operator(}) + ident(backBuffer) operator(=) ident(config)operator(.)ident(createCompatibleVolatileImage)operator(()ident(width)operator(,) ident(height)operator(\))operator(;) + ident(backBufferGraphics) operator(=) ident(backBuffer)operator(.)ident(createGraphics)operator(()operator(\))operator(;) + operator(}) + ident(backBufferGraphics)operator(.)ident(setClip)operator(()ident(g)operator(.)ident(getClip)operator(()operator(\))operator(\))operator(;) + ident(paintUnbuffered)operator(()ident(backBufferGraphics)operator(\))operator(;) + ident(g)operator(.)ident(drawImage)operator(()ident(backBuffer)operator(,) integer(0)operator(,) integer(0)operator(,) local_variable(this)operator(\))operator(;) + operator(}) keyword(while) operator(()ident(backBuffer)operator(.)ident(contentsLost)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(synchronized) type(void) ident(paintUnbuffered)operator(()type(Graphics) ident(g)operator(\)) operator({) + keyword(if) operator(()ident(backgroundColor) operator(!=) keyword(null)operator(\)) operator({) + ident(g)operator(.)ident(setColor)operator(()ident(backgroundColor)operator(\))operator(;) + ident(g)operator(.)ident(fillRect)operator(()integer(0)operator(,) integer(0)operator(,) ident(getWidth)operator(()operator(\))operator(,) ident(getHeight)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(paintProc) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(priorGraphics) operator(!=) ident(g)operator(\)) operator({) + ident(wrappedGraphics) operator(=) ident(JavaUtil)operator(.)ident(convertJavaToUsableRubyObject)operator(()ident(runtime)operator(,) ident(g)operator(\))operator(;) + ident(priorGraphics) operator(=) ident(g)operator(;) + operator(}) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(paintProc)operator(.)ident(call)operator(()ident(context)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(wrappedGraphics)operator(})operator(\))operator(;) + operator(}) + local_variable(super)operator(.)ident(paint)operator(()ident(g)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(class) class(TrivialFacade) directive(implements) ident(Facade) operator({) + directive(public) ident(TrivialFacade)operator(()operator(\)) operator({)operator(}) + directive(public) type(InputStream) ident(getInputStream)operator(()operator(\)) operator({) keyword(return) type(System)operator(.)ident(in)operator(;) operator(}) + directive(public) type(PrintStream) ident(getOutputStream)operator(()operator(\)) operator({) keyword(return) type(System)operator(.)ident(out)operator(;) operator(}) + directive(public) type(PrintStream) ident(getErrorStream)operator(()operator(\)) operator({) keyword(return) type(System)operator(.)ident(err)operator(;) operator(}) + directive(public) type(void) ident(attach)operator(()ident(Ruby) ident(runtime)operator(,) type(Applet) ident(applet)operator(\)) operator({) + directive(final) ident(IRubyObject) ident(wrappedApplet) operator(=) ident(JavaUtil)operator(.)ident(convertJavaToUsableRubyObject)operator(()ident(runtime)operator(,) ident(applet)operator(\))operator(;) + ident(wrappedApplet)operator(.)ident(dataWrapStruct)operator(()ident(applet)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(JRUBY_APPLET)delimiter(")>operator(,) ident(wrappedApplet)operator(\))operator(;) + ident(wrappedApplet)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyMethods)operator(.)ident(class)operator(\))operator(;) + operator(}) + directive(public) type(void) ident(destroy)operator(()operator(\)) operator({)operator(}) + operator(}) + + directive(private) directive(static) type(class) class(ConsoleFacade) directive(implements) ident(Facade) operator({) + directive(private) type(JTextPane) ident(textPane)operator(;) + directive(private) type(JScrollPane) ident(scrollPane)operator(;) + directive(private) ident(TextAreaReadline) ident(adaptor)operator(;) + directive(private) type(InputStream) ident(inputStream)operator(;) + directive(private) type(PrintStream) ident(outputStream)operator(;) + directive(private) type(PrintStream) ident(errorStream)operator(;) + + directive(public) ident(ConsoleFacade)operator(()type(String) ident(bannerText)operator(\)) operator({) + ident(textPane) operator(=) keyword(new) type(JTextPane)operator(()operator(\))operator(;) + ident(textPane)operator(.)ident(setMargin)operator(()keyword(new) type(Insets)operator(()integer(4)operator(,) integer(4)operator(,) integer(0)operator(,) integer(4)operator(\))operator(\))operator(;) + ident(textPane)operator(.)ident(setCaretColor)operator(()keyword(new) type(Color)operator(()hex(0xa4)operator(,) hex(0x00)operator(,) hex(0x00)operator(\))operator(\))operator(;) + ident(textPane)operator(.)ident(setBackground)operator(()keyword(new) type(Color)operator(()hex(0xf2)operator(,) hex(0xf2)operator(,) hex(0xf2)operator(\))operator(\))operator(;) + ident(textPane)operator(.)ident(setForeground)operator(()keyword(new) type(Color)operator(()hex(0xa4)operator(,) hex(0x00)operator(,) hex(0x00)operator(\))operator(\))operator(;) + + type(Font) ident(font) operator(=) ident(findFont)operator(()string<delimiter(")content(Monospaced)delimiter(")>operator(,) type(Font)operator(.)ident(PLAIN)operator(,) integer(14)operator(,) + keyword(new) type(String)type([]) operator({)string<delimiter(")content(Monaco)delimiter(")>operator(,) string<delimiter(")content(Andale Mono)delimiter(")>operator(})operator(\))operator(;) + + ident(textPane)operator(.)ident(setFont)operator(()ident(font)operator(\))operator(;) + + ident(scrollPane) operator(=) keyword(new) type(JScrollPane)operator(()ident(textPane)operator(\))operator(;) + ident(scrollPane)operator(.)ident(setDoubleBuffered)operator(()keyword(true)operator(\))operator(;) + keyword(if) operator(() ident(bannerText) operator(!=) keyword(null) operator(\)) operator({) + ident(bannerText) operator(=) string<delimiter(")content( )delimiter(")> operator(+) ident(bannerText) operator(+) string<delimiter(")content( )char(\\n)char(\\n)delimiter(")>operator(;) + operator(}) + ident(adaptor) operator(=) keyword(new) ident(TextAreaReadline)operator(()ident(textPane)operator(,) ident(bannerText)operator(\))operator(;) + ident(inputStream) operator(=) ident(adaptor)operator(.)ident(getInputStream)operator(()operator(\))operator(;) + ident(outputStream) operator(=) keyword(new) type(PrintStream)operator(()ident(adaptor)operator(.)ident(getOutputStream)operator(()operator(\))operator(\))operator(;) + ident(errorStream) operator(=) keyword(new) type(PrintStream)operator(()ident(adaptor)operator(.)ident(getOutputStream)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(InputStream) ident(getInputStream)operator(()operator(\)) operator({) keyword(return) ident(inputStream)operator(;) operator(}) + directive(public) type(PrintStream) ident(getOutputStream)operator(()operator(\)) operator({) keyword(return) ident(outputStream)operator(;) operator(}) + directive(public) type(PrintStream) ident(getErrorStream)operator(()operator(\)) operator({) keyword(return) ident(errorStream)operator(;) operator(}) + + directive(public) type(void) ident(attach)operator(()ident(Ruby) ident(runtime)operator(,) type(Applet) ident(applet)operator(\)) operator({) + ident(adaptor)operator(.)ident(hookIntoRuntime)operator(()ident(runtime)operator(\))operator(;) + ident(applet)operator(.)ident(add)operator(()ident(scrollPane)operator(\))operator(;) + ident(applet)operator(.)ident(validate)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(destroy)operator(()operator(\)) operator({) + type(Container) ident(parent) operator(=) ident(scrollPane)operator(.)ident(getParent)operator(()operator(\))operator(;) + ident(adaptor)operator(.)ident(shutdown)operator(()operator(\))operator(;) + keyword(if) operator(()ident(parent) operator(!=) keyword(null)operator(\)) operator({) + ident(parent)operator(.)ident(remove)operator(()ident(scrollPane)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(Font) ident(findFont)operator(()type(String) ident(otherwise)operator(,) type(int) ident(style)operator(,) type(int) ident(size)operator(,) type(String)type([]) ident(families)operator(\)) operator({) + type(String)type([]) ident(fonts) operator(=) type(GraphicsEnvironment)operator(.)ident(getLocalGraphicsEnvironment)operator(()operator(\))operator(.)ident(getAvailableFontFamilyNames)operator(()operator(\))operator(;) + type(Arrays)operator(.)ident(sort)operator(()ident(fonts)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(families)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()type(Arrays)operator(.)ident(binarySearch)operator(()ident(fonts)operator(,) ident(families)operator([)ident(i)operator(])operator(\)) operator(>=) integer(0)operator(\)) operator({) + keyword(return) keyword(new) type(Font)operator(()ident(families)operator([)ident(i)operator(])operator(,) ident(style)operator(,) ident(size)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) keyword(new) type(Font)operator(()ident(otherwise)operator(,) ident(style)operator(,) ident(size)operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.BufferedWriter)operator(;) +keyword(import) include(java.io.OutputStreamWriter)operator(;) + +keyword(import) include(java.net.InetAddress)operator(;) +keyword(import) include(java.net.Socket)operator(;) + +comment(/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +directive(public) type(class) class(JRubyClient) directive(extends) ident(JRubyService) operator({) + directive(public) ident(JRubyClient)operator(()type(String)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + type(Configuration) ident(conf) operator(=) keyword(new) type(Configuration)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Starting client with port )delimiter(")> operator(+) ident(conf)operator(.)ident(getPort)operator(()operator(\)) operator(+) string<delimiter(")content(, key )delimiter(")> operator(+) ident(conf)operator(.)ident(getKey)operator(()operator(\)) operator(+) string<delimiter(")content( and command )delimiter(")> operator(+) ident(conf)operator(.)ident(getCommand)operator(()operator(\))operator(\))operator(;) + operator(}) + type(Socket) ident(socket) operator(=) keyword(new) type(Socket)operator(()type(InetAddress)operator(.)ident(getLocalHost)operator(()operator(\))operator(,) ident(conf)operator(.)ident(getPort)operator(()operator(\))operator(\))operator(;) + type(BufferedWriter) ident(writer) operator(=) keyword(new) type(BufferedWriter)operator(()keyword(new) type(OutputStreamWriter)operator(()ident(socket)operator(.)ident(getOutputStream)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(if)operator(()ident(conf)operator(.)ident(terminate)operator(()operator(\))operator(\)) operator({) + ident(writer)operator(.)ident(write)operator(()ident(CMD_TERM) operator(+) string<delimiter(")content( )delimiter(")> operator(+) ident(conf)operator(.)ident(getKey)operator(()operator(\)) operator(+) string<delimiter(")char(\\n)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(conf)operator(.)ident(noMore)operator(()operator(\))operator(\)) operator({) + ident(writer)operator(.)ident(write)operator(()ident(CMD_NO_MORE) operator(+) string<delimiter(")content( )delimiter(")> operator(+) ident(conf)operator(.)ident(getKey)operator(()operator(\)) operator(+) string<delimiter(")char(\\n)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(writer)operator(.)ident(write)operator(()ident(CMD_START) operator(+) string<delimiter(")content( )delimiter(")> operator(+) ident(conf)operator(.)ident(getKey)operator(()operator(\)) operator(+) string<delimiter(")content( )delimiter(")> operator(+) ident(conf)operator(.)ident(getCommand)operator(()operator(\)) operator(+) string<delimiter(")char(\\n)delimiter(")>operator(\))operator(;) + operator(}) + ident(writer)operator(.)ident(flush)operator(()operator(\))operator(;) + ident(writer)operator(.)ident(close)operator(()operator(\))operator(;) + ident(socket)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(main)operator(()type(String)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + keyword(new) ident(JRubyClient)operator(()ident(args)operator(\))operator(;) + operator(}) +operator(})comment(// JRubyClient) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.BufferedReader)operator(;) +keyword(import) include(java.io.InputStreamReader)operator(;) + +keyword(import) include(java.net.InetAddress)operator(;) +keyword(import) include(java.net.InetSocketAddress)operator(;) +keyword(import) include(java.net.ServerSocket)operator(;) +keyword(import) include(java.net.Socket)operator(;) + +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) + +comment(/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +directive(public) type(class) class(JRubyServer) directive(extends) ident(JRubyService) operator({) + directive(private) type(Configuration) ident(conf)operator(;) + + directive(private) type(boolean) ident(stillStarting) operator(=) keyword(true)operator(;) + + directive(private) ident(JRubyServer)operator(()type(String)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + ident(conf) operator(=) keyword(new) type(Configuration)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Starting server with port )delimiter(")> operator(+) ident(conf)operator(.)ident(getPort)operator(()operator(\)) operator(+) string<delimiter(")content( and key )delimiter(")> operator(+) ident(conf)operator(.)ident(getKey)operator(()operator(\))operator(\))operator(;) + operator(}) + type(ServerSocket) ident(server) operator(=) keyword(new) type(ServerSocket)operator(()operator(\))operator(;) + ident(server)operator(.)ident(bind)operator(()keyword(new) type(InetSocketAddress)operator(()type(InetAddress)operator(.)ident(getLocalHost)operator(()operator(\))operator(,)ident(conf)operator(.)ident(getPort)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(while)operator(()keyword(true)operator(\)) operator({) + type(Thread) ident(t1) operator(=) keyword(new) type(Thread)operator(()keyword(new) type(Handler)operator(()ident(server)operator(.)ident(accept)operator(()operator(\))operator(\))operator(\))operator(;) + ident(t1)operator(.)ident(setDaemon)operator(()keyword(true)operator(\))operator(;) + ident(t1)operator(.)ident(start)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(class) class(Handler) directive(implements) type(Runnable) operator({) + directive(private) type(Socket) ident(socket)operator(;) + + directive(public) type(Handler)operator(()type(Socket) ident(socket)operator(\)) operator({) + local_variable(this)operator(.)ident(socket) operator(=) ident(socket)operator(;) + operator(}) + + directive(public) type(void) ident(run)operator(()operator(\)) operator({) + keyword(try) operator({) + type(BufferedReader) ident(rr) operator(=) keyword(new) type(BufferedReader)operator(()keyword(new) type(InputStreamReader)operator(()local_variable(this)operator(.)ident(socket)operator(.)ident(getInputStream)operator(()operator(\))operator(\))operator(\))operator(;) + type(String) ident(command) operator(=) ident(rr)operator(.)ident(readLine)operator(()operator(\))operator(;) + ident(rr)operator(.)ident(close)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(socket)operator(.)ident(close)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(socket) operator(=) keyword(null)operator(;) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Got command: )delimiter(")> operator(+) ident(command)operator(\))operator(;) + operator(}) + type(String)type([]) ident(cmds) operator(=) ident(command)operator(.)ident(split)operator(()string<delimiter(")content( )delimiter(")>operator(,) integer(3)operator(\))operator(;) + keyword(if)operator(()ident(cmds)operator([)integer(1)operator(])operator(.)ident(equals)operator(()ident(conf)operator(.)ident(getKey)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(if)operator(()ident(cmds)operator([)integer(0)operator(])operator(.)ident(equals)operator(()ident(CMD_TERM)operator(\))operator(\)) operator({) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Terminating hard)delimiter(")>operator(\))operator(;) + operator(}) + type(System)operator(.)ident(exit)operator(()integer(0)operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(cmds)operator([)integer(0)operator(])operator(.)ident(equals)operator(()ident(CMD_NO_MORE)operator(\))operator(\)) operator({) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Accepting no more START)delimiter(")>operator(\))operator(;) + operator(}) + ident(stillStarting) operator(=) keyword(false)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(cmds)operator([)integer(0)operator(])operator(.)ident(equals)operator(()ident(CMD_START)operator(\))operator(\)) operator({) + keyword(if)operator(()ident(stillStarting)operator(\)) operator({) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Doing START on command )delimiter(")> operator(+) ident(cmds)operator([)integer(2)operator(])operator(\))operator(;) + operator(}) + keyword(new) ident(Main)operator(()operator(\))operator(.)ident(run)operator(()ident(intoCommandArguments)operator(()ident(cmds)operator([)integer(2)operator(])operator(.)ident(trim)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Not doing START anymore, invalid command)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Unrecognized command)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + keyword(if)operator(()ident(conf)operator(.)ident(isDebug)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Invalid key)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(catch)operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + operator(}) + operator(}) + + directive(protected) directive(static) type(String)type([]) ident(intoCommandArguments)operator(()type(String) ident(str)operator(\)) operator({) + type(List)operator(<)type(String)operator(>) ident(args) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + type(boolean) ident(inSingle) operator(=) keyword(false)operator(;) + type(int) ident(contentStart) operator(=) operator(-)integer(1)operator(;) + + keyword(for)operator(()type(int) ident(i)operator(=)integer(0)operator(,)ident(j)operator(=)ident(str)operator(.)ident(length)operator(()operator(\))operator(;)ident(i)operator(<)ident(j)operator(;)ident(i)operator(++)operator(\)) operator({) + keyword(if)operator(()ident(str)operator(.)ident(charAt)operator(()ident(i)operator(\)) operator(==) string<delimiter(')content( )delimiter(')> operator(&&) operator(!)ident(inSingle) operator(&&) ident(contentStart) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(args)operator(.)ident(add)operator(()ident(str)operator(.)ident(substring)operator(()ident(contentStart)operator(,)ident(i)operator(\))operator(\))operator(;) + ident(contentStart) operator(=) operator(-)integer(1)operator(;) + keyword(continue)operator(;) + operator(}) + keyword(if)operator(()ident(str)operator(.)ident(charAt)operator(()ident(i)operator(\)) operator(==) string<delimiter(')content( )delimiter(')>operator(\)) operator({) + keyword(continue)operator(;) + operator(}) + keyword(if)operator(()ident(str)operator(.)ident(charAt)operator(()ident(i)operator(\)) operator(==) string<delimiter(')char(\\')delimiter(')> operator(&&) operator(!)ident(inSingle)operator(\)) operator({) + ident(inSingle) operator(=) keyword(true)operator(;) + ident(contentStart) operator(=) ident(i)operator(+)integer(1)operator(;) + keyword(continue)operator(;) + operator(}) + keyword(if)operator(()ident(str)operator(.)ident(charAt)operator(()ident(i)operator(\)) operator(==) string<delimiter(')char(\\')delimiter(')>operator(\)) operator({) + ident(inSingle) operator(=) keyword(false)operator(;) + ident(args)operator(.)ident(add)operator(()ident(str)operator(.)ident(substring)operator(()ident(contentStart)operator(,)ident(i)operator(\))operator(\))operator(;) + ident(contentStart) operator(=) operator(-)integer(1)operator(;) + keyword(continue)operator(;) + operator(}) + keyword(if)operator(()ident(contentStart) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(contentStart) operator(=) ident(i)operator(;) + operator(}) + operator(}) + keyword(if)operator(()ident(contentStart) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(args)operator(.)ident(add)operator(()ident(str)operator(.)ident(substring)operator(()ident(contentStart)operator(\))operator(\))operator(;) + operator(}) + keyword(return) operator(()type(String)type([])operator(\))ident(args)operator(.)ident(toArray)operator(()keyword(new) type(String)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(main)operator(()type(String)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + keyword(new) ident(JRubyServer)operator(()ident(args)operator(\))operator(;) + operator(}) +operator(})comment(// JRubyServer) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +comment(/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +directive(public) directive(abstract) type(class) class(JRubyService) operator({) + directive(protected) directive(static) type(class) class(Configuration) operator({) + directive(private) directive(final) directive(static) type(int) ident(DEFAULT_PORT) operator(=) integer(19222)operator(;) + + directive(private) type(String) ident(key)operator(;) + directive(private) type(int) ident(port) operator(=) ident(DEFAULT_PORT)operator(;) + directive(private) type(boolean) ident(terminate)operator(;) + directive(private) type(boolean) ident(noMore)operator(;) + directive(private) type(boolean) ident(debug)operator(;) + directive(private) type(String) ident(command)operator(;) + + directive(public) type(Configuration)operator(()type(String) ident(args)operator(\)) operator({) + type(int) ident(i)operator(=)integer(0)operator(;) + type(int) ident(stop)operator(;) + ident(loop)operator(:) keyword(for)operator(()type(int) ident(j)operator(=)ident(args)operator(.)ident(length)operator(()operator(\))operator(;)ident(i)operator(<)ident(j)operator(;)ident(i)operator(++)operator(\)) operator({) + keyword(if)operator(()ident(args)operator(.)ident(charAt)operator(()ident(i)operator(\)) operator(==) string<delimiter(')content(-)delimiter(')> operator(&&) ident(i)operator(+)integer(1) operator(<) ident(j)operator(\)) operator({) + keyword(switch)operator(()ident(args)operator(.)ident(charAt)operator(()operator(++)ident(i)operator(\))operator(\)) operator({) + keyword(case) string<delimiter(')content(k)delimiter(')>operator(:) + ident(stop) operator(=) ident(args)operator(.)ident(indexOf)operator(()string<delimiter(")content( )delimiter(")>operator(,) operator(()operator(++)ident(i)operator(\)) operator(+) integer(1)operator(\))operator(;) + keyword(if)operator(()ident(stop) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(stop) operator(=) ident(args)operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + ident(key) operator(=) ident(args)operator(.)ident(substring)operator(()ident(i)operator(,) ident(stop)operator(\))operator(.)ident(trim)operator(()operator(\))operator(;) + ident(i) operator(=) ident(stop)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(p)delimiter(')>operator(:) + ident(stop) operator(=) ident(args)operator(.)ident(indexOf)operator(()string<delimiter(")content( )delimiter(")>operator(,) operator(()operator(++)ident(i)operator(\)) operator(+) integer(1)operator(\))operator(;) + keyword(if)operator(()ident(stop) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(stop) operator(=) ident(args)operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + ident(port) operator(=) type(Integer)operator(.)ident(parseInt)operator(()ident(args)operator(.)ident(substring)operator(()ident(i)operator(,) ident(stop)operator(\))operator(.)ident(trim)operator(()operator(\))operator(\))operator(;) + ident(i) operator(=) ident(stop)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(t)delimiter(')>operator(:) + ident(terminate) operator(=) keyword(true)operator(;) + ident(i)operator(++)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(n)delimiter(')>operator(:) + ident(noMore) operator(=) keyword(true)operator(;) + ident(i)operator(++)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(d)delimiter(')>operator(:) + ident(debug) operator(=) keyword(true)operator(;) + ident(i)operator(++)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) comment(// handle everything after -- as arguments to the jruby process) + ident(i)operator(++)operator(;) + keyword(break) ident(loop)operator(;) + keyword(default)operator(:) + ident(i)operator(--)operator(;) + keyword(break) ident(loop)operator(;) + operator(}) + operator(}) keyword(else) keyword(if)operator(()ident(args)operator(.)ident(charAt)operator(()ident(i)operator(\)) operator(!=) string<delimiter(')content( )delimiter(')>operator(\)) operator({) + keyword(break) ident(loop)operator(;) + operator(}) + operator(}) + keyword(if)operator(()ident(i)operator(<)ident(args)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + ident(command) operator(=) ident(args)operator(.)ident(substring)operator(()ident(i)operator(\))operator(.)ident(trim)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(String) ident(getKey)operator(()operator(\)) operator({) + keyword(return) ident(key)operator(;) + operator(}) + + directive(public) type(int) ident(getPort)operator(()operator(\)) operator({) + keyword(return) ident(port)operator(;) + operator(}) + + directive(public) type(boolean) ident(terminate)operator(()operator(\)) operator({) + keyword(return) ident(terminate)operator(;) + operator(}) + + directive(public) type(boolean) ident(noMore)operator(()operator(\)) operator({) + keyword(return) ident(noMore)operator(;) + operator(}) + + directive(public) type(boolean) ident(isDebug)operator(()operator(\)) operator({) + keyword(return) ident(debug)operator(;) + operator(}) + + directive(public) type(String) ident(getCommand)operator(()operator(\)) operator({) + keyword(return) ident(command)operator(;) + operator(}) + operator(}) + + directive(public) directive(static) directive(final) type(String) ident(CMD_START) operator(=) string<delimiter(")content(START)delimiter(")>operator(;) + directive(public) directive(static) directive(final) type(String) ident(CMD_NO_MORE) operator(=) string<delimiter(")content(NO_MORE)delimiter(")>operator(;) + directive(public) directive(static) directive(final) type(String) ident(CMD_TERM) operator(=) string<delimiter(")content(TERM)delimiter(")>operator(;) +operator(})comment(// JRubyService) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2006 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Kiel Hodges <jruby-devel@selfsosoft.com> + * Copyright (C\) 2005 Jason Voegele <jason@jvoegele.com> + * Copyright (C\) 2005 Tim Azzopardi <tim@tigerfive.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.InputStream)operator(;) +keyword(import) include(java.io.PrintStream)operator(;) + +keyword(import) include(org.jruby.exceptions.MainExitException)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.exceptions.ThreadKill)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.SafePropertyAccessor)operator(;) +keyword(import) include(org.jruby.util.SimpleSampler)operator(;) + +comment(/** + * Class used to launch the interpreter. + * This is the main class as defined in the jruby.mf manifest. + * It is very basic and does not support yet the same array of switches + * as the C interpreter. + * Usage: java -jar jruby.jar [switches] [rubyfile.rb] [arguments] + * -e 'command' one line of script. Several -e's allowed. Omit [programfile] + * @author jpetersen + */) +directive(public) type(class) class(Main) operator({) + directive(private) type(boolean) ident(hasPrintedUsage) operator(=) keyword(false)operator(;) + directive(private) directive(final) ident(RubyInstanceConfig) ident(config)operator(;) + + directive(public) ident(Main)operator(()ident(RubyInstanceConfig) ident(config)operator(\)) operator({) + local_variable(this)operator(.)ident(config) operator(=) ident(config)operator(;) + operator(}) + + directive(public) ident(Main)operator(()directive(final) type(InputStream) ident(in)operator(,) directive(final) type(PrintStream) ident(out)operator(,) directive(final) type(PrintStream) ident(err)operator(\)) operator({) + local_variable(this)operator(()keyword(new) ident(RubyInstanceConfig)operator(()operator(\))operator({)operator({) + ident(setInput)operator(()ident(in)operator(\))operator(;) + ident(setOutput)operator(()ident(out)operator(\))operator(;) + ident(setError)operator(()ident(err)operator(\))operator(;) + operator(})operator(})operator(\))operator(;) + operator(}) + + directive(public) ident(Main)operator(()operator(\)) operator({) + local_variable(this)operator(()keyword(new) ident(RubyInstanceConfig)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(main)operator(()type(String)type([]) ident(args)operator(\)) operator({) + ident(Main) ident(main) operator(=) keyword(new) ident(Main)operator(()operator(\))operator(;) + + keyword(try) operator({) + type(int) ident(status) operator(=) ident(main)operator(.)ident(run)operator(()ident(args)operator(\))operator(;) + keyword(if) operator(()ident(status) operator(!=) integer(0)operator(\)) operator({) + type(System)operator(.)ident(exit)operator(()ident(status)operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(re)operator(\)) operator({) + keyword(throw) ident(re)operator(;) + operator(}) keyword(catch) operator(()type(Throwable) ident(t)operator(\)) operator({) + comment(// print out as a nice Ruby backtrace) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()ident(ThreadContext)operator(.)ident(createRawBacktraceStringFromThrowable)operator(()ident(t)operator(\))operator(\))operator(;) + type(System)operator(.)ident(exit)operator(()integer(1)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(int) ident(run)operator(()type(String)type([]) ident(args)operator(\)) operator({) + keyword(try) operator({) + ident(config)operator(.)ident(processArguments)operator(()ident(args)operator(\))operator(;) + keyword(return) ident(run)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(MainExitException) ident(mee)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(mee)operator(.)ident(isAborted)operator(()operator(\))operator(\)) operator({) + ident(config)operator(.)ident(getOutput)operator(()operator(\))operator(.)ident(println)operator(()ident(mee)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(mee)operator(.)ident(isUsageError)operator(()operator(\))operator(\)) operator({) + ident(printUsage)operator(()operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(mee)operator(.)ident(getStatus)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(OutOfMemoryError) ident(oome)operator(\)) operator({) + comment(// produce a nicer error since Rubyists aren't used to seeing this) + type(System)operator(.)ident(gc)operator(()operator(\))operator(;) + + type(String) ident(memoryMax) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.memory.max)delimiter(")>operator(\))operator(;) + type(String) ident(message) operator(=) string<delimiter(")delimiter(")>operator(;) + keyword(if) operator(()ident(memoryMax) operator(!=) keyword(null)operator(\)) operator({) + ident(message) operator(=) string<delimiter(")content( of )delimiter(")> operator(+) ident(memoryMax)operator(;) + operator(}) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error: Your application used more memory than the safety cap)delimiter(")> operator(+) ident(message) operator(+) string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Specify -J-Xmx####m to increase it (#### = cap size in MB\).)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(config)operator(.)ident(getVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Exception trace follows:)delimiter(")>operator(\))operator(;) + ident(oome)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Specify -w for full OutOfMemoryError stack trace)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) integer(1)operator(;) + operator(}) keyword(catch) operator(()type(StackOverflowError) ident(soe)operator(\)) operator({) + comment(// produce a nicer error since Rubyists aren't used to seeing this) + type(System)operator(.)ident(gc)operator(()operator(\))operator(;) + + type(String) ident(stackMax) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.stack.max)delimiter(")>operator(\))operator(;) + type(String) ident(message) operator(=) string<delimiter(")delimiter(")>operator(;) + keyword(if) operator(()ident(stackMax) operator(!=) keyword(null)operator(\)) operator({) + ident(message) operator(=) string<delimiter(")content( of )delimiter(")> operator(+) ident(stackMax)operator(;) + operator(}) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error: Your application used more stack memory than the safety cap)delimiter(")> operator(+) ident(message) operator(+) string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Specify -J-Xss####k to increase it (#### = cap size in KB\).)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(config)operator(.)ident(getVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Exception trace follows:)delimiter(")>operator(\))operator(;) + ident(soe)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Specify -w for full StackOverflowError stack trace)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) integer(1)operator(;) + operator(}) keyword(catch) operator(()type(UnsupportedClassVersionError) ident(ucve)operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error: Some library (perhaps JRuby\) was built with a later JVM version.)delimiter(")>operator(\))operator(;) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Please use libraries built with the version you intend to use or an earlier one.)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(config)operator(.)ident(getVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Exception trace follows:)delimiter(")>operator(\))operator(;) + ident(ucve)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Specify -w for full UnsupportedClassVersionError stack trace)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) integer(1)operator(;) + operator(}) keyword(catch) operator(()ident(ThreadKill) ident(kill)operator(\)) operator({) + keyword(return) integer(0)operator(;) + operator(}) + operator(}) + + directive(public) type(int) ident(run)operator(()operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isShowVersion)operator(()operator(\))operator(\)) operator({) + ident(showVersion)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(config)operator(.)ident(isShowCopyright)operator(()operator(\))operator(\)) operator({) + ident(showCopyright)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(config)operator(.)ident(shouldRunInterpreter)operator(()operator(\)) operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(shouldPrintUsage)operator(()operator(\))operator(\)) operator({) + ident(printUsage)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(config)operator(.)ident(shouldPrintProperties)operator(()operator(\))operator(\)) operator({) + ident(printProperties)operator(()operator(\))operator(;) + operator(}) + keyword(return) integer(0)operator(;) + operator(}) + + type(InputStream) ident(in) operator(=) ident(config)operator(.)ident(getScriptSource)operator(()operator(\))operator(;) + type(String) ident(filename) operator(=) ident(config)operator(.)ident(displayedFileName)operator(()operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(Ruby)operator(.)ident(newInstance)operator(()ident(config)operator(\))operator(;) + + comment(// set thread context JRuby classloader here, for the main thread) + keyword(try) operator({) + type(Thread)operator(.)ident(currentThread)operator(()operator(\))operator(.)ident(setContextClassLoader)operator(()ident(runtime)operator(.)ident(getJRubyClassLoader)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(SecurityException) ident(se)operator(\)) operator({) + comment(// can't set TC classloader) + keyword(if) operator(()ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(isVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(WARNING: Security restrictions disallowed setting context classloader for main thread.)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(in) operator(==) keyword(null)operator(\)) operator({) + comment(// no script to run, return success below) + operator(}) keyword(else) keyword(if) operator(()ident(config)operator(.)ident(isShouldCheckSyntax)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(parseFromMain)operator(()ident(in)operator(,) ident(filename)operator(\))operator(;) + ident(config)operator(.)ident(getOutput)operator(()operator(\))operator(.)ident(println)operator(()string<delimiter(")content(Syntax OK)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + type(long) ident(now) operator(=) operator(-)integer(1)operator(;) + + keyword(try) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isBenchmarking)operator(()operator(\))operator(\)) operator({) + ident(now) operator(=) type(System)operator(.)ident(currentTimeMillis)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(config)operator(.)ident(isSamplingEnabled)operator(()operator(\))operator(\)) operator({) + ident(SimpleSampler)operator(.)ident(startSampleThread)operator(()operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(runtime)operator(.)ident(runFromMain)operator(()ident(in)operator(,) ident(filename)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(runtime)operator(.)ident(tearDown)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(config)operator(.)ident(isBenchmarking)operator(()operator(\))operator(\)) operator({) + ident(config)operator(.)ident(getOutput)operator(()operator(\))operator(.)ident(println)operator(()string<delimiter(")content(Runtime: )delimiter(")> operator(+) operator(()type(System)operator(.)ident(currentTimeMillis)operator(()operator(\)) operator(-) ident(now)operator(\)) operator(+) string<delimiter(")content( ms)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(config)operator(.)ident(isSamplingEnabled)operator(()operator(\))operator(\)) operator({) + ident(org)operator(.)ident(jruby)operator(.)ident(util)operator(.)ident(SimpleSampler)operator(.)ident(report)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(rj)operator(\)) operator({) + ident(RubyException) ident(raisedException) operator(=) ident(rj)operator(.)ident(getException)operator(()operator(\))operator(;) + keyword(if) operator(()ident(runtime)operator(.)ident(getSystemExit)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(raisedException)operator(\))operator(\)) operator({) + ident(IRubyObject) ident(status) operator(=) ident(raisedException)operator(.)ident(callMethod)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(status)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(status) operator(!=) keyword(null) operator(&&) operator(!)ident(status)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(status)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(runtime)operator(.)ident(printError)operator(()ident(raisedException)operator(\))operator(;) + keyword(return) integer(1)operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) integer(0)operator(;) + operator(}) + + directive(private) type(void) ident(showVersion)operator(()operator(\)) operator({) + ident(config)operator(.)ident(getOutput)operator(()operator(\))operator(.)ident(print)operator(()ident(config)operator(.)ident(getVersionString)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(showCopyright)operator(()operator(\)) operator({) + ident(config)operator(.)ident(getOutput)operator(()operator(\))operator(.)ident(print)operator(()ident(config)operator(.)ident(getCopyrightString)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(printUsage)operator(()operator(\)) operator({) + keyword(if) operator(()operator(!)ident(hasPrintedUsage)operator(\)) operator({) + ident(config)operator(.)ident(getOutput)operator(()operator(\))operator(.)ident(print)operator(()ident(config)operator(.)ident(getBasicUsageHelp)operator(()operator(\))operator(\))operator(;) + ident(hasPrintedUsage) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(printProperties)operator(()operator(\)) operator({) + ident(config)operator(.)ident(getOutput)operator(()operator(\))operator(.)ident(print)operator(()ident(config)operator(.)ident(getPropertyHelp)operator(()operator(\))operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.lang.ref.SoftReference)operator(;) + +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +directive(public) directive(final) type(class) class(MetaClass) directive(extends) ident(RubyClass) operator({) + + directive(private) type(SoftReference)operator(<)ident(IRubyObject)operator(>) ident(attached) operator(=) keyword(new) type(SoftReference)operator(<)ident(IRubyObject)operator(>)operator(()keyword(null)operator(\))operator(;) + + comment(/** NEWOBJ (in RubyObject#getSingletonClassClone(\)\) + * + */) + directive(public) ident(MetaClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) keyword(null)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** rb_class_boot (for MetaClasses\) (in makeMetaClass(RubyClass\)\) + * + */) + directive(public) ident(MetaClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(superClass)operator(,) keyword(false)operator(\))operator(;) + ident(index) operator(=) ident(superClass)operator(.)ident(index)operator(;) comment(// use same ClassIndex as metaclass, since we're technically still of that type) + operator(}) + + directive(public) type(boolean) ident(isSingleton)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + comment(/** + * If an object uses an anonymous class 'class << obj', then this grabs the original + * metaclass and not the one that get injected as a result of 'class << obj'. + */) + directive(public) ident(RubyClass) ident(getRealClass)operator(()operator(\)) operator({) + keyword(return) ident(superClass)operator(.)ident(getRealClass)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(final) ident(IRubyObject) ident(allocate)operator(()operator(\))operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't create instance of virtual class)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getAttached)operator(()operator(\)) operator({) + keyword(return) ident(attached)operator(.)ident(get)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(setAttached)operator(()ident(IRubyObject) ident(attached)operator(\)) operator({) + local_variable(this)operator(.)ident(attached) operator(=) keyword(new) type(SoftReference)operator(<)ident(IRubyObject)operator(>)operator(()ident(attached)operator(\))operator(;) + operator(}) + +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2005 David Corbin <dcorbin@users.sourceforge.net> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.PrintStream)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.javasupport.Java)operator(;) +keyword(import) include(org.jruby.javasupport.JavaObject)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +annotation(@JRubyClass)operator(()ident(name) operator(=) string<delimiter(")content(NativeException)delimiter(")>operator(,) ident(parent) operator(=) string<delimiter(")content(RuntimeError)delimiter(")>operator(\)) +directive(public) type(class) class(NativeException) directive(extends) ident(RubyException) operator({) + + directive(private) directive(final) type(Throwable) ident(cause)operator(;) + directive(public) directive(static) directive(final) type(String) ident(CLASS_NAME) operator(=) string<delimiter(")content(NativeException)delimiter(")>operator(;) + directive(private) directive(final) ident(Ruby) ident(runtime)operator(;) + + directive(public) ident(NativeException)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) type(Throwable) ident(cause)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(,) ident(cause)operator(.)ident(getClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(: )delimiter(")> operator(+) ident(cause)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(runtime) operator(=) ident(runtime)operator(;) + local_variable(this)operator(.)ident(cause) operator(=) ident(cause)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(createClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(baseClass)operator(\)) operator({) + comment(// FIXME: If NativeException is expected to be used from Ruby code, it should provide) + comment(// a real allocator to be used. Otherwise Class.new will fail, as will marshalling. JRUBY-415) + ident(RubyClass) ident(exceptionClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()ident(CLASS_NAME)operator(,) ident(baseClass)operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + + ident(exceptionClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(NativeException)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(exceptionClass)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(cause)operator(()ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) ident(Java)operator(.)ident(wrap)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(JavaObject)operator(.)ident(wrap)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(cause)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(backtrace)operator(()operator(\)) operator({) + ident(IRubyObject) ident(rubyTrace) operator(=) local_variable(super)operator(.)ident(backtrace)operator(()operator(\))operator(;) + keyword(if) operator(()ident(rubyTrace)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(rubyTrace)operator(;) + operator(}) + ident(RubyArray) ident(array) operator(=) operator(()ident(RubyArray)operator(\)) ident(rubyTrace)operator(.)ident(dup)operator(()operator(\))operator(;) + type(StackTraceElement)type([]) ident(stackTrace) operator(=) ident(cause)operator(.)ident(getStackTrace)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(stackTrace)operator(.)ident(length) operator(-) integer(1)operator(;) ident(i) operator(>=) integer(0)operator(;) ident(i)operator(--)operator(\)) operator({) + type(StackTraceElement) ident(element) operator(=) ident(stackTrace)operator([)ident(i)operator(])operator(;) + type(String) ident(className) operator(=) ident(element)operator(.)ident(getClassName)operator(()operator(\))operator(;) + type(String) ident(line) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(element)operator(.)ident(getFileName)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(line) operator(=) ident(className) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(element)operator(.)ident(getLineNumber)operator(()operator(\)) operator(+) string<delimiter(")content(:in `)delimiter(")> operator(+) ident(element)operator(.)ident(getMethodName)operator(()operator(\)) operator(+) string<delimiter(")content(')delimiter(")>operator(;) + operator(}) keyword(else) operator({) + type(int) ident(index) operator(=) ident(className)operator(.)ident(lastIndexOf)operator(()string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + type(String) ident(packageName) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(index) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(packageName) operator(=) string<delimiter(")delimiter(")>operator(;) + operator(}) keyword(else) operator({) + ident(packageName) operator(=) ident(className)operator(.)ident(substring)operator(()integer(0)operator(,) ident(index)operator(\)) operator(+) string<delimiter(")content(/)delimiter(")>operator(;) + operator(}) + ident(line) operator(=) ident(packageName)operator(.)ident(replace)operator(()string<delimiter(")content(.)delimiter(")>operator(,) string<delimiter(")content(/)delimiter(")>operator(\)) operator(+) ident(element)operator(.)ident(getFileName)operator(()operator(\)) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(element)operator(.)ident(getLineNumber)operator(()operator(\)) operator(+) string<delimiter(")content(:in `)delimiter(")> operator(+) ident(element)operator(.)ident(getMethodName)operator(()operator(\)) operator(+) string<delimiter(")content(')delimiter(")>operator(;) + operator(}) + ident(RubyString) ident(string) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(line)operator(\))operator(;) + ident(array)operator(.)ident(unshift)operator(()ident(string)operator(\))operator(;) + operator(}) + keyword(return) ident(array)operator(;) + operator(}) + + directive(public) type(void) ident(printBacktrace)operator(()type(PrintStream) ident(errorStream)operator(\)) operator({) + local_variable(super)operator(.)ident(printBacktrace)operator(()ident(errorStream)operator(\))operator(;) + ident(errorStream)operator(.)ident(println)operator(()string<delimiter(")content(Complete Java stackTrace)delimiter(")>operator(\))operator(;) + ident(cause)operator(.)ident(printStackTrace)operator(()ident(errorStream)operator(\))operator(;) + operator(}) + + directive(public) type(Throwable) ident(getCause)operator(()operator(\)) operator({) + keyword(return) ident(cause)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +comment(/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +directive(public) type(interface) ident(Profile) operator({) + ident(Profile) ident(ALL) operator(=) keyword(new) ident(Profile)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(allowBuiltin)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowClass)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowModule)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowLoad)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowRequire)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + operator(})operator(;) + ident(Profile) ident(DEBUG_ALLOW) operator(=) keyword(new) ident(Profile)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(allowBuiltin)operator(()type(String) ident(name)operator(\)) operator({) type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(allowBuiltin()delimiter(")>operator(+)ident(name)operator(+)string<delimiter(")content(\))delimiter(")>operator(\))operator(;) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowClass)operator(()type(String) ident(name)operator(\)) operator({) type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(allowClass()delimiter(")>operator(+)ident(name)operator(+)string<delimiter(")content(\))delimiter(")>operator(\))operator(;) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowModule)operator(()type(String) ident(name)operator(\)) operator({) type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(allowModule()delimiter(")>operator(+)ident(name)operator(+)string<delimiter(")content(\))delimiter(")>operator(\))operator(;) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowLoad)operator(()type(String) ident(name)operator(\)) operator({) type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(allowLoad()delimiter(")>operator(+)ident(name)operator(+)string<delimiter(")content(\))delimiter(")>operator(\))operator(;) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowRequire)operator(()type(String) ident(name)operator(\)) operator({) type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(allowRequire()delimiter(")>operator(+)ident(name)operator(+)string<delimiter(")content(\))delimiter(")>operator(\))operator(;) keyword(return) keyword(true)operator(;) operator(}) + operator(})operator(;) + ident(Profile) ident(NO_FILE_CLASS) operator(=) keyword(new) ident(Profile)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(allowBuiltin)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowClass)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) operator(!)ident(name)operator(.)ident(equals)operator(()string<delimiter(")content(File)delimiter(")>operator(\))operator(;) operator(}) + directive(public) type(boolean) ident(allowModule)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowLoad)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + directive(public) type(boolean) ident(allowRequire)operator(()type(String) ident(name)operator(\)) operator({) keyword(return) keyword(true)operator(;) operator(}) + operator(})operator(;) + ident(Profile) ident(ANY) operator(=) ident(ALL)operator(;) + ident(Profile) ident(DEFAULT) operator(=) ident(ALL)operator(;) + + type(boolean) ident(allowBuiltin)operator(()type(String) ident(name)operator(\))operator(;) + type(boolean) ident(allowClass)operator(()type(String) ident(name)operator(\))operator(;) + type(boolean) ident(allowModule)operator(()type(String) ident(name)operator(\))operator(;) + type(boolean) ident(allowLoad)operator(()type(String) ident(name)operator(\))operator(;) + type(boolean) ident(allowRequire)operator(()type(String) ident(name)operator(\))operator(;) +operator(})comment(// Profile) +comment(/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2006 Michael Studman <codehaus@michaelstudman.com> + * Copyright (C\) 2006 Ola Bini <ola@ologix.com> + * Copyright (C\) 2007 Nick Sieger <nicksieger@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.ByteArrayInputStream)operator(;) +keyword(import) include(java.io.File)operator(;) +keyword(import) include(java.io.FileDescriptor)operator(;) +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.InputStream)operator(;) +keyword(import) include(java.io.PrintStream)operator(;) +keyword(import) include(java.io.UnsupportedEncodingException)operator(;) +keyword(import) include(java.lang.ref.WeakReference)operator(;) +keyword(import) include(java.lang.reflect.Field)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.Collections)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.Hashtable)operator(;) +keyword(import) include(java.util.IdentityHashMap)operator(;) +keyword(import) include(java.util.Iterator)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(java.util.Random)operator(;) +keyword(import) include(java.util.Set)operator(;) +keyword(import) include(java.util.Stack)operator(;) +keyword(import) include(java.util.Vector)operator(;) +keyword(import) include(java.util.WeakHashMap)operator(;) +keyword(import) include(java.util.concurrent.ConcurrentHashMap)operator(;) +keyword(import) include(java.util.concurrent.ExecutorService)operator(;) +keyword(import) include(java.util.concurrent.Executors)operator(;) +keyword(import) include(java.util.concurrent.SynchronousQueue)operator(;) +keyword(import) include(java.util.concurrent.ThreadFactory)operator(;) +keyword(import) include(java.util.concurrent.ThreadPoolExecutor)operator(;) +keyword(import) include(java.util.concurrent.TimeUnit)operator(;) +keyword(import) include(java.util.concurrent.atomic.AtomicInteger)operator(;) + +keyword(import) include(org.joda.time.DateTimeZone)operator(;) +keyword(import) include(org.jruby.ast.Node)operator(;) +keyword(import) include(org.jruby.ast.executable.RubiniusRunner)operator(;) +keyword(import) include(org.jruby.ast.executable.Script)operator(;) +keyword(import) include(org.jruby.ast.executable.YARVCompiledRunner)operator(;) +keyword(import) include(org.jruby.common.RubyWarnings)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.compiler.ASTCompiler)operator(;) +keyword(import) include(org.jruby.compiler.ASTInspector)operator(;) +keyword(import) include(org.jruby.compiler.JITCompiler)operator(;) +keyword(import) include(org.jruby.compiler.NotCompilableException)operator(;) +keyword(import) include(org.jruby.compiler.impl.StandardASMCompiler)operator(;) +keyword(import) include(org.jruby.compiler.yarv.StandardYARVCompiler)operator(;) +keyword(import) include(org.jruby.exceptions.JumpException)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.ext.JRubyPOSIXHandler)operator(;) +keyword(import) include(org.jruby.ext.LateLoadingLibrary)operator(;) +keyword(import) include(org.jruby.ext.posix.POSIX)operator(;) +keyword(import) include(org.jruby.ext.posix.POSIXFactory)operator(;) +keyword(import) include(org.jruby.internal.runtime.GlobalVariables)operator(;) +keyword(import) include(org.jruby.internal.runtime.ThreadService)operator(;) +keyword(import) include(org.jruby.internal.runtime.ValueAccessor)operator(;) +keyword(import) include(org.jruby.javasupport.JavaSupport)operator(;) +keyword(import) include(org.jruby.management.BeanManager)operator(;) +keyword(import) include(org.jruby.management.ClassCache)operator(;) +keyword(import) include(org.jruby.management.Config)operator(;) +keyword(import) include(org.jruby.parser.Parser)operator(;) +keyword(import) include(org.jruby.parser.ParserConfiguration)operator(;) +keyword(import) include(org.jruby.runtime.Binding)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CacheMap)operator(;) +keyword(import) include(org.jruby.runtime.CallSite)operator(;) +keyword(import) include(org.jruby.runtime.CallbackFactory)operator(;) +keyword(import) include(org.jruby.runtime.DynamicScope)operator(;) +keyword(import) include(org.jruby.runtime.EventHook)operator(;) +keyword(import) include(org.jruby.runtime.GlobalVariable)operator(;) +keyword(import) include(org.jruby.runtime.IAccessor)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ObjectSpace)operator(;) +keyword(import) include(org.jruby.runtime.RubyEvent)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.load.Library)operator(;) +keyword(import) include(org.jruby.runtime.load.LoadService)operator(;) +keyword(import) include(org.jruby.util.BuiltinScript)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.IOInputStream)operator(;) +keyword(import) include(org.jruby.util.IOOutputStream)operator(;) +keyword(import) include(org.jruby.util.JRubyClassLoader)operator(;) +keyword(import) include(org.jruby.util.JavaNameMangler)operator(;) +keyword(import) include(org.jruby.util.KCode)operator(;) +keyword(import) include(org.jruby.util.SafePropertyAccessor)operator(;) +keyword(import) include(org.jruby.util.collections.WeakHashSet)operator(;) +keyword(import) include(org.jruby.util.io.ChannelDescriptor)operator(;) + +comment(/** + * The Ruby object represents the top-level of a JRuby "instance" in a given VM. + * JRuby supports spawning multiple instances in the same JVM. Generally, objects + * created under these instances are tied to a given runtime, for such details + * as identity and type, because multiple Ruby instances means there are + * multiple instances of each class. This means that in multi-runtime mode + * (or really, multi-VM mode, where each JRuby instance is a ruby "VM"\), objects + * generally can't be transported across runtimes without marshaling. + * + * This class roots everything that makes the JRuby runtime function, and + * provides a number of utility methods for constructing global types and + * accessing global runtime structures. + */) +directive(public) directive(final) type(class) class(Ruby) operator({) + comment(/** + * Returns a new instance of the JRuby runtime configured with defaults. + * + * @return the JRuby runtime + * @see org.jruby.RubyInstanceConfig + */) + directive(public) directive(static) ident(Ruby) ident(newInstance)operator(()operator(\)) operator({) + keyword(return) ident(newInstance)operator(()keyword(new) ident(RubyInstanceConfig)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Returns a new instance of the JRuby runtime configured as specified. + * + * @param config The instance configuration + * @return The JRuby runtime + * @see org.jruby.RubyInstanceConfig + */) + directive(public) directive(static) ident(Ruby) ident(newInstance)operator(()ident(RubyInstanceConfig) ident(config)operator(\)) operator({) + ident(Ruby) ident(ruby) operator(=) keyword(new) ident(Ruby)operator(()ident(config)operator(\))operator(;) + ident(ruby)operator(.)ident(init)operator(()operator(\))operator(;) + keyword(return) ident(ruby)operator(;) + operator(}) + + comment(/** + * Returns a new instance of the JRuby runtime configured with the given + * input, output and error streams and otherwise default configuration + * (except where specified system properties alter defaults\). + * + * @param in the custom input stream + * @param out the custom output stream + * @param err the custom error stream + * @return the JRuby runtime + * @see org.jruby.RubyInstanceConfig + */) + directive(public) directive(static) ident(Ruby) ident(newInstance)operator(()type(InputStream) ident(in)operator(,) type(PrintStream) ident(out)operator(,) type(PrintStream) ident(err)operator(\)) operator({) + ident(RubyInstanceConfig) ident(config) operator(=) keyword(new) ident(RubyInstanceConfig)operator(()operator(\))operator(;) + ident(config)operator(.)ident(setInput)operator(()ident(in)operator(\))operator(;) + ident(config)operator(.)ident(setOutput)operator(()ident(out)operator(\))operator(;) + ident(config)operator(.)ident(setError)operator(()ident(err)operator(\))operator(;) + keyword(return) ident(newInstance)operator(()ident(config)operator(\))operator(;) + operator(}) + + comment(/** + * Create and initialize a new JRuby runtime. The properties of the + * specified RubyInstanceConfig will be used to determine various JRuby + * runtime characteristics. + * + * @param config The configuration to use for the new instance + * @see org.jruby.RubyInstanceConfig + */) + directive(private) ident(Ruby)operator(()ident(RubyInstanceConfig) ident(config)operator(\)) operator({) + local_variable(this)operator(.)ident(config) operator(=) ident(config)operator(;) + local_variable(this)operator(.)ident(threadService) operator(=) keyword(new) ident(ThreadService)operator(()local_variable(this)operator(\))operator(;) + keyword(if)operator(()ident(config)operator(.)ident(isSamplingEnabled)operator(()operator(\))operator(\)) operator({) + ident(org)operator(.)ident(jruby)operator(.)ident(util)operator(.)ident(SimpleSampler)operator(.)ident(registerThreadContext)operator(()ident(threadService)operator(.)ident(getCurrentContext)operator(()operator(\))operator(\))operator(;) + operator(}) + + local_variable(this)operator(.)ident(in) operator(=) ident(config)operator(.)ident(getInput)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(out) operator(=) ident(config)operator(.)ident(getOutput)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(err) operator(=) ident(config)operator(.)ident(getError)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(objectSpaceEnabled) operator(=) ident(config)operator(.)ident(isObjectSpaceEnabled)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(profile) operator(=) ident(config)operator(.)ident(getProfile)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(currentDirectory) operator(=) ident(config)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(kcode) operator(=) ident(config)operator(.)ident(getKCode)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(beanManager) operator(=) keyword(new) ident(BeanManager)operator(()local_variable(this)operator(,) ident(config)operator(.)ident(isManagementEnabled)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(jitCompiler) operator(=) keyword(new) ident(JITCompiler)operator(()local_variable(this)operator(\))operator(;) + + local_variable(this)operator(.)ident(beanManager)operator(.)ident(register)operator(()keyword(new) ident(Config)operator(()local_variable(this)operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(beanManager)operator(.)ident(register)operator(()keyword(new) ident(ClassCache)operator(()local_variable(this)operator(\))operator(\))operator(;) + + local_variable(this)operator(.)ident(cacheMap) operator(=) keyword(new) ident(CacheMap)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** + * Evaluates a script under the current scope (perhaps the top-level + * scope\) and returns the result (generally the last value calculated\). + * This version goes straight into the interpreter, bypassing compilation + * and runtime preparation typical to normal script runs. + * + * @param script The scriptlet to run + * @returns The result of the eval + */) + directive(public) ident(IRubyObject) ident(evalScriptlet)operator(()type(String) ident(script)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + ident(Node) ident(node) operator(=) ident(parseEval)operator(()ident(script)operator(,) string<delimiter(")content(<script>)delimiter(")>operator(,) ident(context)operator(.)ident(getCurrentScope)operator(()operator(\))operator(,) integer(0)operator(\))operator(;) + + keyword(try) operator({) + keyword(return) ident(node)operator(.)ident(interpret)operator(()local_variable(this)operator(,) ident(context)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(throw) ident(newLocalJumpError)operator(()string<delimiter(")content(return)delimiter(")>operator(,) operator(()ident(IRubyObject)operator(\))ident(rj)operator(.)ident(getValue)operator(()operator(\))operator(,) string<delimiter(")content(unexpected return)delimiter(")>operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(BreakJump) ident(bj)operator(\)) operator({) + keyword(throw) ident(newLocalJumpError)operator(()string<delimiter(")content(break)delimiter(")>operator(,) operator(()ident(IRubyObject)operator(\))ident(bj)operator(.)ident(getValue)operator(()operator(\))operator(,) string<delimiter(")content(unexpected break)delimiter(")>operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(RedoJump) ident(rj)operator(\)) operator({) + keyword(throw) ident(newLocalJumpError)operator(()string<delimiter(")content(redo)delimiter(")>operator(,) operator(()ident(IRubyObject)operator(\))ident(rj)operator(.)ident(getValue)operator(()operator(\))operator(,) string<delimiter(")content(unexpected redo)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Parse and execute the specified script + * This differs from the other methods in that it accepts a string-based script and + * parses and runs it as though it were loaded at a command-line. This is the preferred + * way to start up a new script when calling directly into the Ruby object (which is + * generally *dis*couraged. + * + * @param script The contents of the script to run as a normal, root script + * @return The last value of the script + */) + directive(public) ident(IRubyObject) ident(executeScript)operator(()type(String) ident(script)operator(,) type(String) ident(filename)operator(\)) operator({) + type(byte)type([]) ident(bytes)operator(;) + + keyword(try) operator({) + ident(bytes) operator(=) ident(script)operator(.)ident(getBytes)operator(()ident(KCode)operator(.)ident(NONE)operator(.)ident(getKCode)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(UnsupportedEncodingException) ident(e)operator(\)) operator({) + ident(bytes) operator(=) ident(script)operator(.)ident(getBytes)operator(()operator(\))operator(;) + operator(}) + + ident(Node) ident(node) operator(=) ident(parseInline)operator(()keyword(new) type(ByteArrayInputStream)operator(()ident(bytes)operator(\))operator(,) ident(filename)operator(,) keyword(null)operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + + type(String) ident(oldFile) operator(=) ident(context)operator(.)ident(getFile)operator(()operator(\))operator(;) + type(int) ident(oldLine) operator(=) ident(context)operator(.)ident(getLine)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(context)operator(.)ident(setFile)operator(()ident(node)operator(.)ident(getPosition)operator(()operator(\))operator(.)ident(getFile)operator(()operator(\))operator(\))operator(;) + ident(context)operator(.)ident(setLine)operator(()ident(node)operator(.)ident(getPosition)operator(()operator(\))operator(.)ident(getStartLine)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runNormally)operator(()ident(node)operator(,) keyword(false)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(setFile)operator(()ident(oldFile)operator(\))operator(;) + ident(context)operator(.)ident(setLine)operator(()ident(oldLine)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Run the script contained in the specified input stream, using the + * specified filename as the name of the script being executed. The stream + * will be read fully before being parsed and executed. The given filename + * will be used for the ruby $PROGRAM_NAME and $0 global variables in this + * runtime. + * + * This method is intended to be called once per runtime, generally from + * Main or from main-like top-level entry points. + * + * As part of executing the script loaded from the input stream, various + * RubyInstanceConfig properties will be used to determine whether to + * compile the script before execution or run with various wrappers (for + * looping, printing, and so on, see jruby -help\). + * + * @param inputStream The InputStream from which to read the script contents + * @param filename The filename to use when parsing, and for $PROGRAM_NAME + * and $0 ruby global variables. + */) + directive(public) type(void) ident(runFromMain)operator(()type(InputStream) ident(inputStream)operator(,) type(String) ident(filename)operator(\)) operator({) + ident(IAccessor) ident(d) operator(=) keyword(new) ident(ValueAccessor)operator(()ident(newString)operator(()ident(filename)operator(\))operator(\))operator(;) + ident(getGlobalVariables)operator(()operator(\))operator(.)ident(define)operator(()string<delimiter(")content($PROGRAM_NAME)delimiter(")>operator(,) ident(d)operator(\))operator(;) + ident(getGlobalVariables)operator(()operator(\))operator(.)ident(define)operator(()string<delimiter(")content($0)delimiter(")>operator(,) ident(d)operator(\))operator(;) + + keyword(for) operator(()type(Iterator) ident(i) operator(=) ident(config)operator(.)ident(getOptionGlobals)operator(()operator(\))operator(.)ident(entrySet)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(Map)operator(.)ident(Entry) ident(entry) operator(=) operator(()type(Map)operator(.)ident(Entry)operator(\)) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + type(Object) ident(value) operator(=) ident(entry)operator(.)ident(getValue)operator(()operator(\))operator(;) + ident(IRubyObject) ident(varvalue)operator(;) + keyword(if) operator(()ident(value) operator(!=) keyword(null)operator(\)) operator({) + ident(varvalue) operator(=) ident(newString)operator(()ident(value)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(varvalue) operator(=) ident(getTrue)operator(()operator(\))operator(;) + operator(}) + ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($)delimiter(")> operator(+) ident(entry)operator(.)ident(getKey)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) ident(varvalue)operator(\))operator(;) + operator(}) + + + keyword(if)operator(()ident(config)operator(.)ident(isYARVEnabled)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isShowBytecode)operator(()operator(\))operator(\)) type(System)operator(.)ident(err)operator(.)ident(print)operator(()string<delimiter(")content(error: bytecode printing only works with JVM bytecode)delimiter(")>operator(\))operator(;) + keyword(new) ident(YARVCompiledRunner)operator(()local_variable(this)operator(,) ident(inputStream)operator(,) ident(filename)operator(\))operator(.)ident(run)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(config)operator(.)ident(isRubiniusEnabled)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isShowBytecode)operator(()operator(\))operator(\)) type(System)operator(.)ident(err)operator(.)ident(print)operator(()string<delimiter(")content(error: bytecode printing only works with JVM bytecode)delimiter(")>operator(\))operator(;) + keyword(new) ident(RubiniusRunner)operator(()local_variable(this)operator(,) ident(inputStream)operator(,) ident(filename)operator(\))operator(.)ident(run)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(Node) ident(scriptNode) operator(=) ident(parseFromMain)operator(()ident(inputStream)operator(,) ident(filename)operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + + type(String) ident(oldFile) operator(=) ident(context)operator(.)ident(getFile)operator(()operator(\))operator(;) + type(int) ident(oldLine) operator(=) ident(context)operator(.)ident(getLine)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(context)operator(.)ident(setFile)operator(()ident(scriptNode)operator(.)ident(getPosition)operator(()operator(\))operator(.)ident(getFile)operator(()operator(\))operator(\))operator(;) + ident(context)operator(.)ident(setLine)operator(()ident(scriptNode)operator(.)ident(getPosition)operator(()operator(\))operator(.)ident(getStartLine)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(config)operator(.)ident(isAssumePrinting)operator(()operator(\)) operator(||) ident(config)operator(.)ident(isAssumeLoop)operator(()operator(\))operator(\)) operator({) + ident(runWithGetsLoop)operator(()ident(scriptNode)operator(,) ident(config)operator(.)ident(isAssumePrinting)operator(()operator(\))operator(,) ident(config)operator(.)ident(isProcessLineEnds)operator(()operator(\))operator(,) + ident(config)operator(.)ident(isSplit)operator(()operator(\))operator(,) ident(config)operator(.)ident(isYARVCompileEnabled)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(runNormally)operator(()ident(scriptNode)operator(,) ident(config)operator(.)ident(isYARVCompileEnabled)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(setFile)operator(()ident(oldFile)operator(\))operator(;) + ident(context)operator(.)ident(setLine)operator(()ident(oldLine)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** + * Parse the script contained in the given input stream, using the given + * filename as the name of the script, and return the root Node. This + * is used to verify that the script syntax is valid, for jruby -c. The + * current scope (generally the top-level scope\) is used as the parent + * scope for parsing. + * + * @param inputStream The input stream from which to read the script + * @param filename The filename to use for parsing + * @returns The root node of the parsed script + */) + directive(public) ident(Node) ident(parseFromMain)operator(()type(InputStream) ident(inputStream)operator(,) type(String) ident(filename)operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isInlineScript)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(parseInline)operator(()ident(inputStream)operator(,) ident(filename)operator(,) ident(getCurrentContext)operator(()operator(\))operator(.)ident(getCurrentScope)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(parseFile)operator(()ident(inputStream)operator(,) ident(filename)operator(,) ident(getCurrentContext)operator(()operator(\))operator(.)ident(getCurrentScope)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Run the given script with a "while gets; end" loop wrapped around it. + * This is primarily used for the -n command-line flag, to allow writing + * a short script that processes input lines using the specified code. + * + * @param scriptNode The root node of the script to execute + * @param printing Whether $_ should be printed after each loop (as in the + * -p command-line flag\) + * @param processLineEnds Whether line endings should be processed by + * setting $\\ to $/ and <code>chop!</code>ing every line read + * @param split Whether to split each line read using <code>String#split</code> + * @param yarvCompile Whether to compile the target script to YARV (Ruby 1.9\) + * bytecode before executing. + * @return The result of executing the specified script + */) + directive(public) ident(IRubyObject) ident(runWithGetsLoop)operator(()ident(Node) ident(scriptNode)operator(,) type(boolean) ident(printing)operator(,) type(boolean) ident(processLineEnds)operator(,) type(boolean) ident(split)operator(,) type(boolean) ident(yarvCompile)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + + ident(Script) ident(script) operator(=) keyword(null)operator(;) + ident(YARVCompiledRunner) ident(runner) operator(=) keyword(null)operator(;) + type(boolean) ident(compile) operator(=) ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getCompileMode)operator(()operator(\))operator(.)ident(shouldPrecompileCLI)operator(()operator(\))operator(;) + keyword(if) operator(()ident(compile) operator(||) operator(!)ident(yarvCompile)operator(\)) operator({) + ident(script) operator(=) ident(tryCompile)operator(()ident(scriptNode)operator(\))operator(;) + keyword(if) operator(()ident(compile) operator(&&) ident(script) operator(==) keyword(null)operator(\)) operator({) + comment(// terminate; tryCompile will have printed out an error and we're done) + keyword(return) ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(yarvCompile)operator(\)) operator({) + ident(runner) operator(=) ident(tryCompileYarv)operator(()ident(scriptNode)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(processLineEnds)operator(\)) operator({) + ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($)char(\\\\)delimiter(")>operator(,) ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($/)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + keyword(while) operator(()ident(RubyKernel)operator(.)ident(gets)operator(()ident(context)operator(,) ident(getTopSelf)operator(()operator(\))operator(,) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(loop)operator(:) keyword(while) operator(()keyword(true)operator(\)) operator({) comment(// Used for the 'redo' command) + keyword(try) operator({) + keyword(if) operator(()ident(processLineEnds)operator(\)) operator({) + ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($_)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(chop!)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(split)operator(\)) operator({) + ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($F)delimiter(")>operator(,) ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($_)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(split)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(script) operator(!=) keyword(null)operator(\)) operator({) + ident(runScript)operator(()ident(script)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(runner) operator(!=) keyword(null)operator(\)) operator({) + ident(runYarv)operator(()ident(runner)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(runInterpreter)operator(()ident(scriptNode)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(printing)operator(\)) ident(RubyKernel)operator(.)ident(print)operator(()ident(context)operator(,) ident(getKernel)operator(()operator(\))operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($_)delimiter(")>operator(\))operator(})operator(\))operator(;) + keyword(break) ident(loop)operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(RedoJump) ident(rj)operator(\)) operator({) + comment(// do nothing, this iteration restarts) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(NextJump) ident(nj)operator(\)) operator({) + comment(// recheck condition) + keyword(break) ident(loop)operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(BreakJump) ident(bj)operator(\)) operator({) + comment(// end loop) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(bj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + keyword(return) ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Run the specified script without any of the loop-processing wrapper + * code. + * + * @param scriptNode The root node of the script to be executed + * @param yarvCompile Whether to compile the script to YARV (Ruby 1.9\) + * bytecode before execution + * @return The result of executing the script + */) + directive(public) ident(IRubyObject) ident(runNormally)operator(()ident(Node) ident(scriptNode)operator(,) type(boolean) ident(yarvCompile)operator(\)) operator({) + ident(Script) ident(script) operator(=) keyword(null)operator(;) + ident(YARVCompiledRunner) ident(runner) operator(=) keyword(null)operator(;) + type(boolean) ident(compile) operator(=) ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getCompileMode)operator(()operator(\))operator(.)ident(shouldPrecompileCLI)operator(()operator(\))operator(;) + type(boolean) ident(forceCompile) operator(=) ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getCompileMode)operator(()operator(\))operator(.)ident(shouldPrecompileAll)operator(()operator(\))operator(;) + keyword(if) operator(()ident(yarvCompile)operator(\)) operator({) + ident(runner) operator(=) ident(tryCompileYarv)operator(()ident(scriptNode)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(compile)operator(\)) operator({) + ident(script) operator(=) ident(tryCompile)operator(()ident(scriptNode)operator(\))operator(;) + keyword(if) operator(()ident(forceCompile) operator(&&) ident(script) operator(==) keyword(null)operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error, could not compile; pass -J-Djruby.jit.logging.verbose=true for more details)delimiter(")>operator(\))operator(;) + keyword(return) ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(script) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isShowBytecode)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(nilObject)operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(runScript)operator(()ident(script)operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(runner) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(runYarv)operator(()ident(runner)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isShowBytecode)operator(()operator(\))operator(\)) type(System)operator(.)ident(err)operator(.)ident(print)operator(()string<delimiter(")content(error: bytecode printing only works with JVM bytecode)delimiter(")>operator(\))operator(;) + keyword(return) ident(runInterpreter)operator(()ident(scriptNode)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(Script) ident(tryCompile)operator(()ident(Node) ident(node)operator(\)) operator({) + keyword(return) ident(tryCompile)operator(()ident(node)operator(,) keyword(new) ident(JRubyClassLoader)operator(()ident(getJRubyClassLoader)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(Script) ident(tryCompile)operator(()ident(Node) ident(node)operator(,) ident(JRubyClassLoader) ident(classLoader)operator(\)) operator({) + ident(Script) ident(script) operator(=) keyword(null)operator(;) + keyword(try) operator({) + type(String) ident(filename) operator(=) ident(node)operator(.)ident(getPosition)operator(()operator(\))operator(.)ident(getFile)operator(()operator(\))operator(;) + type(String) ident(classname) operator(=) ident(JavaNameMangler)operator(.)ident(mangledFilenameForStartupClasspath)operator(()ident(filename)operator(\))operator(;) + + ident(ASTInspector) ident(inspector) operator(=) keyword(new) ident(ASTInspector)operator(()operator(\))operator(;) + ident(inspector)operator(.)ident(inspect)operator(()ident(node)operator(\))operator(;) + + ident(StandardASMCompiler) ident(asmCompiler) operator(=) keyword(new) ident(StandardASMCompiler)operator(()ident(classname)operator(,) ident(filename)operator(\))operator(;) + ident(ASTCompiler) ident(compiler) operator(=) keyword(new) ident(ASTCompiler)operator(()operator(\))operator(;) + keyword(if) operator(()ident(config)operator(.)ident(isShowBytecode)operator(()operator(\))operator(\)) operator({) + ident(compiler)operator(.)ident(compileRoot)operator(()ident(node)operator(,) ident(asmCompiler)operator(,) ident(inspector)operator(,) keyword(false)operator(,) keyword(false)operator(\))operator(;) + ident(asmCompiler)operator(.)ident(dumpClass)operator(()type(System)operator(.)ident(out)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(compiler)operator(.)ident(compileRoot)operator(()ident(node)operator(,) ident(asmCompiler)operator(,) ident(inspector)operator(,) keyword(true)operator(,) keyword(false)operator(\))operator(;) + operator(}) + ident(script) operator(=) operator(()ident(Script)operator(\))ident(asmCompiler)operator(.)ident(loadClass)operator(()ident(classLoader)operator(\))operator(.)ident(newInstance)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(config)operator(.)ident(isJitLogging)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(compiled: )delimiter(")> operator(+) ident(node)operator(.)ident(getPosition)operator(()operator(\))operator(.)ident(getFile)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(NotCompilableException) ident(nce)operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isJitLoggingVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error -- Not compileable: )delimiter(")> operator(+) ident(nce)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + ident(nce)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()type(ClassNotFoundException) ident(e)operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isJitLoggingVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error -- Not compileable: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + ident(e)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()type(InstantiationException) ident(e)operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isJitLoggingVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error -- Not compileable: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + ident(e)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()type(IllegalAccessException) ident(e)operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isJitLoggingVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error -- Not compileable: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + ident(e)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()type(Throwable) ident(t)operator(\)) operator({) + keyword(if) operator(()ident(config)operator(.)ident(isJitLoggingVerbose)operator(()operator(\))operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(could not compile: )delimiter(")> operator(+) ident(node)operator(.)ident(getPosition)operator(()operator(\))operator(.)ident(getFile)operator(()operator(\)) operator(+) string<delimiter(")content( because of: )char(\\")delimiter(")> operator(+) ident(t)operator(.)ident(getMessage)operator(()operator(\)) operator(+) string<delimiter(")char(\\")delimiter(")>operator(\))operator(;) + ident(t)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(script)operator(;) + operator(}) + + directive(private) ident(YARVCompiledRunner) ident(tryCompileYarv)operator(()ident(Node) ident(node)operator(\)) operator({) + keyword(try) operator({) + ident(StandardYARVCompiler) ident(compiler) operator(=) keyword(new) ident(StandardYARVCompiler)operator(()local_variable(this)operator(\))operator(;) + ident(ASTCompiler)operator(.)ident(getYARVCompiler)operator(()operator(\))operator(.)ident(compile)operator(()ident(node)operator(,) ident(compiler)operator(\))operator(;) + ident(org)operator(.)ident(jruby)operator(.)ident(lexer)operator(.)ident(yacc)operator(.)ident(ISourcePosition) ident(p) operator(=) ident(node)operator(.)ident(getPosition)operator(()operator(\))operator(;) + keyword(if)operator(()ident(p) operator(==) keyword(null) operator(&&) ident(node) keyword(instanceof) ident(org)operator(.)ident(jruby)operator(.)ident(ast)operator(.)ident(RootNode)operator(\)) operator({) + ident(p) operator(=) operator(()operator(()ident(org)operator(.)ident(jruby)operator(.)ident(ast)operator(.)ident(RootNode)operator(\))ident(node)operator(\))operator(.)ident(getBodyNode)operator(()operator(\))operator(.)ident(getPosition)operator(()operator(\))operator(;) + operator(}) + keyword(return) keyword(new) ident(YARVCompiledRunner)operator(()local_variable(this)operator(,)ident(compiler)operator(.)ident(getInstructionSequence)operator(()string<delimiter(")content(<main>)delimiter(")>operator(,)ident(p)operator(.)ident(getFile)operator(()operator(\))operator(,)string<delimiter(")content(toplevel)delimiter(")>operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(NotCompilableException) ident(nce)operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error -- Not compileable: )delimiter(")> operator(+) ident(nce)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + operator(}) + + directive(private) ident(IRubyObject) ident(runScript)operator(()ident(Script) ident(script)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + + keyword(try) operator({) + keyword(return) ident(script)operator(.)ident(load)operator(()ident(context)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(rj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(IRubyObject) ident(runYarv)operator(()ident(YARVCompiledRunner) ident(runner)operator(\)) operator({) + keyword(try) operator({) + keyword(return) ident(runner)operator(.)ident(run)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(rj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(IRubyObject) ident(runInterpreter)operator(()ident(Node) ident(scriptNode)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + + ident(assert) ident(scriptNode) operator(!=) keyword(null) operator(:) string<delimiter(")content(scriptNode is not null)delimiter(")>operator(;) + + keyword(try) operator({) + keyword(return) ident(scriptNode)operator(.)ident(interpret)operator(()local_variable(this)operator(,) ident(context)operator(,) ident(getTopSelf)operator(()operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(rj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) ident(BeanManager) ident(getBeanManager)operator(()operator(\)) operator({) + keyword(return) ident(beanManager)operator(;) + operator(}) + + directive(public) ident(JITCompiler) ident(getJITCompiler)operator(()operator(\)) operator({) + keyword(return) ident(jitCompiler)operator(;) + operator(}) + + comment(/** + * @deprecated use #newInstance(\) + */) + directive(public) directive(static) ident(Ruby) ident(getDefaultInstance)operator(()operator(\)) operator({) + keyword(return) ident(newInstance)operator(()operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) directive(static) ident(Ruby) ident(getCurrentInstance)operator(()operator(\)) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) directive(static) type(void) ident(setCurrentInstance)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + operator(}) + + directive(public) type(int) ident(allocSymbolId)operator(()operator(\)) operator({) + keyword(return) ident(symbolLastId)operator(.)ident(incrementAndGet)operator(()operator(\))operator(;) + operator(}) + directive(public) type(int) ident(allocModuleId)operator(()operator(\)) operator({) + keyword(return) ident(moduleLastId)operator(.)ident(incrementAndGet)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Retrieve the module with the given name from the Object namespace. + * + * @param name The name of the module + * @return The module or null if not found + */) + directive(public) ident(RubyModule) ident(getModule)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) operator(()ident(RubyModule)operator(\)) ident(objectClass)operator(.)ident(getConstantAt)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Retrieve the module with the given name from the Object namespace. The + * module name must be an interned string, but this method will be faster + * than the non-interned version. + * + * @param internedName The name of the module; <em>must</em> be an interned String + * @return The module or null if not found + */) + directive(public) ident(RubyModule) ident(fastGetModule)operator(()type(String) ident(internedName)operator(\)) operator({) + keyword(return) operator(()ident(RubyModule)operator(\)) ident(objectClass)operator(.)ident(fastGetConstantAt)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + comment(/** + * Retrieve the class with the given name from the Object namespace. + * + * @param name The name of the class + * @return The class + */) + directive(public) ident(RubyClass) ident(getClass)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(objectClass)operator(.)ident(getClass)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Retrieve the class with the given name from the Object namespace. The + * module name must be an interned string, but this method will be faster + * than the non-interned version. + * + * @param internedName the name of the class; <em>must</em> be an interned String! + * @return + */) + directive(public) ident(RubyClass) ident(fastGetClass)operator(()type(String) ident(internedName)operator(\)) operator({) + keyword(return) ident(objectClass)operator(.)ident(fastGetClass)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + comment(/** + * Define a new class under the Object namespace. Roughly equivalent to + * rb_define_class in MRI. + * + * @param name The name for the new class + * @param superClass The super class for the new class + * @param allocator An ObjectAllocator instance that can construct + * instances of the new class. + * @return The new class + */) + directive(public) ident(RubyClass) ident(defineClass)operator(()type(String) ident(name)operator(,) ident(RubyClass) ident(superClass)operator(,) ident(ObjectAllocator) ident(allocator)operator(\)) operator({) + keyword(return) ident(defineClassUnder)operator(()ident(name)operator(,) ident(superClass)operator(,) ident(allocator)operator(,) ident(objectClass)operator(\))operator(;) + operator(}) + + comment(/** + * A variation of defineClass that allows passing in an array of subplementary + * call sites for improving dynamic invocation performance. + * + * @param name The name for the new class + * @param superClass The super class for the new class + * @param allocator An ObjectAllocator instance that can construct + * instances of the new class. + * @return The new class + */) + directive(public) ident(RubyClass) ident(defineClass)operator(()type(String) ident(name)operator(,) ident(RubyClass) ident(superClass)operator(,) ident(ObjectAllocator) ident(allocator)operator(,) ident(CallSite)type([]) ident(callSites)operator(\)) operator({) + keyword(return) ident(defineClassUnder)operator(()ident(name)operator(,) ident(superClass)operator(,) ident(allocator)operator(,) ident(objectClass)operator(,) ident(callSites)operator(\))operator(;) + operator(}) + + comment(/** + * Define a new class with the given name under the given module or class + * namespace. Roughly equivalent to rb_define_class_under in MRI. + * + * If the name specified is already bound, its value will be returned if: + * * It is a class + * * No new superclass is being defined + * + * @param name The name for the new class + * @param superClass The super class for the new class + * @param allocator An ObjectAllocator instance that can construct + * instances of the new class. + * @param parent The namespace under which to define the new class + * @return The new class + */) + directive(public) ident(RubyClass) ident(defineClassUnder)operator(()type(String) ident(name)operator(,) ident(RubyClass) ident(superClass)operator(,) ident(ObjectAllocator) ident(allocator)operator(,) ident(RubyModule) ident(parent)operator(\)) operator({) + keyword(return) ident(defineClassUnder)operator(()ident(name)operator(,) ident(superClass)operator(,) ident(allocator)operator(,) ident(parent)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + comment(/** + * A variation of defineClassUnder that allows passing in an array of + * supplementary call sites to improve dynamic invocation. + * + * @param name The name for the new class + * @param superClass The super class for the new class + * @param allocator An ObjectAllocator instance that can construct + * instances of the new class. + * @param parent The namespace under which to define the new class + * @param callSites The array of call sites to add + * @return The new class + */) + directive(public) ident(RubyClass) ident(defineClassUnder)operator(()type(String) ident(name)operator(,) ident(RubyClass) ident(superClass)operator(,) ident(ObjectAllocator) ident(allocator)operator(,) ident(RubyModule) ident(parent)operator(,) ident(CallSite)type([]) ident(callSites)operator(\)) operator({) + ident(IRubyObject) ident(classObj) operator(=) ident(parent)operator(.)ident(getConstantAt)operator(()ident(name)operator(\))operator(;) + + keyword(if) operator(()ident(classObj) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(classObj) keyword(instanceof) ident(RubyClass)operator(\))operator(\)) keyword(throw) ident(newTypeError)operator(()ident(name) operator(+) string<delimiter(")content( is not a class)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(klazz) operator(=) operator(()ident(RubyClass)operator(\))ident(classObj)operator(;) + keyword(if) operator(()ident(klazz)operator(.)ident(getSuperClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\)) operator(!=) ident(superClass)operator(\)) operator({) + keyword(throw) ident(newNameError)operator(()ident(name) operator(+) string<delimiter(")content( is already defined)delimiter(")>operator(,) ident(name)operator(\))operator(;) + operator(}) + comment(// If we define a class in Ruby, but later want to allow it to be defined in Java,) + comment(// the allocator needs to be updated) + keyword(if) operator(()ident(klazz)operator(.)ident(getAllocator)operator(()operator(\)) operator(!=) ident(allocator)operator(\)) operator({) + ident(klazz)operator(.)ident(setAllocator)operator(()ident(allocator)operator(\))operator(;) + operator(}) + keyword(return) ident(klazz)operator(;) + operator(}) + + type(boolean) ident(parentIsObject) operator(=) ident(parent) operator(==) ident(objectClass)operator(;) + + keyword(if) operator(()ident(superClass) operator(==) keyword(null)operator(\)) operator({) + type(String) ident(className) operator(=) ident(parentIsObject) operator(?) ident(name) operator(:) ident(parent)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(name)operator(;) + ident(warnings)operator(.)ident(warn)operator(()ident(ID)operator(.)ident(NO_SUPER_CLASS)operator(,) string<delimiter(")content(no super class for `)delimiter(")> operator(+) ident(className) operator(+) string<delimiter(")content(', Object assumed)delimiter(")>operator(,) ident(className)operator(\))operator(;) + + ident(superClass) operator(=) ident(objectClass)operator(;) + operator(}) + + keyword(return) ident(RubyClass)operator(.)ident(newClass)operator(()local_variable(this)operator(,) ident(superClass)operator(,) ident(name)operator(,) ident(allocator)operator(,) ident(parent)operator(,) operator(!)ident(parentIsObject)operator(,) ident(callSites)operator(\))operator(;) + operator(}) + + comment(/** + * Define a new module under the Object namespace. Roughly equivalent to + * rb_define_module in MRI. + * + * @param name The name of the new module + * @returns The new module + */) + directive(public) ident(RubyModule) ident(defineModule)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(defineModuleUnder)operator(()ident(name)operator(,) ident(objectClass)operator(\))operator(;) + operator(}) + + comment(/** + * Define a new module with the given name under the given module or + * class namespace. Roughly equivalent to rb_define_module_under in MRI. + * + * @param name The name of the new module + * @param parent The class or module namespace under which to define the + * module + * @returns The new module + */) + directive(public) ident(RubyModule) ident(defineModuleUnder)operator(()type(String) ident(name)operator(,) ident(RubyModule) ident(parent)operator(\)) operator({) + ident(IRubyObject) ident(moduleObj) operator(=) ident(parent)operator(.)ident(getConstantAt)operator(()ident(name)operator(\))operator(;) + + type(boolean) ident(parentIsObject) operator(=) ident(parent) operator(==) ident(objectClass)operator(;) + + keyword(if) operator(()ident(moduleObj) operator(!=) keyword(null) operator(\)) operator({) + keyword(if) operator(()ident(moduleObj)operator(.)ident(isModule)operator(()operator(\))operator(\)) keyword(return) operator(()ident(RubyModule)operator(\))ident(moduleObj)operator(;) + + keyword(if) operator(()ident(parentIsObject)operator(\)) operator({) + keyword(throw) ident(newTypeError)operator(()ident(moduleObj)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( is not a module)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(newTypeError)operator(()ident(parent)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(moduleObj)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( is not a module)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(RubyModule)operator(.)ident(newModule)operator(()local_variable(this)operator(,) ident(name)operator(,) ident(parent)operator(,) operator(!)ident(parentIsObject)operator(\))operator(;) + operator(}) + + comment(/** + * From Object, retrieve the named module. If it doesn't exist a + * new module is created. + * + * @param name The name of the module + * @returns The existing or new module + */) + directive(public) ident(RubyModule) ident(getOrCreateModule)operator(()type(String) ident(name)operator(\)) operator({) + ident(IRubyObject) ident(module) operator(=) ident(objectClass)operator(.)ident(getConstantAt)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(module) operator(==) keyword(null)operator(\)) operator({) + ident(module) operator(=) ident(defineModule)operator(()ident(name)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) operator({) + keyword(throw) ident(newSecurityError)operator(()string<delimiter(")content(Extending module prohibited.)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(!)ident(module)operator(.)ident(isModule)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(newTypeError)operator(()ident(name) operator(+) string<delimiter(")content( is not a Module)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) operator(()ident(RubyModule)operator(\)) ident(module)operator(;) + operator(}) + + + comment(/** + * Retrieve the current safe level. + * + * @see org.jruby.Ruby#setSaveLevel + */) + directive(public) type(int) ident(getSafeLevel)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(.)ident(safeLevel)operator(;) + operator(}) + + + comment(/** + * Set the current safe level: + * + * 0 - strings from streams/environment/ARGV are tainted (default\) + * 1 - no dangerous operation by tainted value + * 2 - process/file operations prohibited + * 3 - all generated objects are tainted + * 4 - no global (non-tainted\) variable modification/no direct output + * + * The safe level is set using $SAFE in Ruby code. It is not particularly + * well supported in JRuby. + */) + directive(public) type(void) ident(setSafeLevel)operator(()type(int) ident(safeLevel)operator(\)) operator({) + local_variable(this)operator(.)ident(safeLevel) operator(=) ident(safeLevel)operator(;) + operator(}) + + directive(public) ident(KCode) ident(getKCode)operator(()operator(\)) operator({) + keyword(return) ident(kcode)operator(;) + operator(}) + + directive(public) type(void) ident(setKCode)operator(()ident(KCode) ident(kcode)operator(\)) operator({) + local_variable(this)operator(.)ident(kcode) operator(=) ident(kcode)operator(;) + operator(}) + + directive(public) type(void) ident(secure)operator(()type(int) ident(level)operator(\)) operator({) + keyword(if) operator(()ident(level) operator(<=) ident(safeLevel)operator(\)) operator({) + keyword(throw) ident(newSecurityError)operator(()string<delimiter(")content(Insecure operation ')delimiter(")> operator(+) ident(getCurrentContext)operator(()operator(\))operator(.)ident(getFrameName)operator(()operator(\)) operator(+) string<delimiter(")content(' at level )delimiter(")> operator(+) ident(safeLevel)operator(\))operator(;) + operator(}) + operator(}) + + comment(// FIXME moved this here to get what's obviously a utility method out of IRubyObject.) + comment(// perhaps security methods should find their own centralized home at some point.) + directive(public) type(void) ident(checkSafeString)operator(()ident(IRubyObject) ident(object)operator(\)) operator({) + keyword(if) operator(()ident(getSafeLevel)operator(()operator(\)) operator(>) integer(0) operator(&&) ident(object)operator(.)ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(ThreadContext) ident(tc) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(if) operator(()ident(tc)operator(.)ident(getFrameName)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(throw) ident(newSecurityError)operator(()string<delimiter(")content(Insecure operation - )delimiter(")> operator(+) ident(tc)operator(.)ident(getFrameName)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(throw) ident(newSecurityError)operator(()string<delimiter(")content(Insecure operation: -r)delimiter(")>operator(\))operator(;) + operator(}) + ident(secure)operator(()integer(4)operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(object) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + keyword(throw) ident(newTypeError)operator(() + string<delimiter(")content(wrong argument type )delimiter(")> operator(+) ident(object)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( (expected String\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_define_global_const + * + */) + directive(public) type(void) ident(defineGlobalConstant)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(objectClass)operator(.)ident(defineConstant)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(isClassDefined)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(getModule)operator(()ident(name)operator(\)) operator(!=) keyword(null)operator(;) + operator(}) + + comment(/** + * A ThreadFactory for when we're using pooled threads; we want to create + * the threads with daemon = true so they don't keep us from shutting down. + */) + directive(public) directive(static) type(class) class(DaemonThreadFactory) directive(implements) type(ThreadFactory) operator({) + directive(public) type(Thread) ident(newThread)operator(()type(Runnable) ident(runnable)operator(\)) operator({) + type(Thread) ident(thread) operator(=) keyword(new) type(Thread)operator(()ident(runnable)operator(\))operator(;) + ident(thread)operator(.)ident(setDaemon)operator(()keyword(true)operator(\))operator(;) + + keyword(return) ident(thread)operator(;) + operator(}) + operator(}) + + comment(/** + * This method is called immediately after constructing the Ruby instance. + * The main thread is prepared for execution, all core classes and libraries + * are initialized, and any libraries required on the command line are + * loaded. + */) + directive(private) type(void) ident(init)operator(()operator(\)) operator({) + comment(// Get the main threadcontext (gets constructed for us\)) + ident(ThreadContext) ident(tc) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + + ident(safeLevel) operator(=) ident(config)operator(.)ident(getSafeLevel)operator(()operator(\))operator(;) + + comment(// Construct key services) + ident(loadService) operator(=) ident(config)operator(.)ident(createLoadService)operator(()local_variable(this)operator(\))operator(;) + ident(posix) operator(=) ident(POSIXFactory)operator(.)ident(getPOSIX)operator(()keyword(new) ident(JRubyPOSIXHandler)operator(()local_variable(this)operator(\))operator(,) ident(RubyInstanceConfig)operator(.)ident(nativeEnabled)operator(\))operator(;) + ident(javaSupport) operator(=) keyword(new) ident(JavaSupport)operator(()local_variable(this)operator(\))operator(;) + + keyword(if) operator(()ident(RubyInstanceConfig)operator(.)ident(POOLING_ENABLED)operator(\)) operator({) + type(Executors)operator(.)ident(newCachedThreadPool)operator(()operator(\))operator(;) + ident(executor) operator(=) keyword(new) type(ThreadPoolExecutor)operator(() + ident(RubyInstanceConfig)operator(.)ident(POOL_MIN)operator(,) + ident(RubyInstanceConfig)operator(.)ident(POOL_MAX)operator(,) + ident(RubyInstanceConfig)operator(.)ident(POOL_TTL)operator(,) + type(TimeUnit)operator(.)ident(SECONDS)operator(,) + keyword(new) type(SynchronousQueue)operator(<)type(Runnable)operator(>)operator(()operator(\))operator(,) + keyword(new) ident(DaemonThreadFactory)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(// initialize the root of the class hierarchy completely) + ident(initRoot)operator(()ident(tc)operator(\))operator(;) + + comment(// Construct the top-level execution frame and scope for the main thread) + ident(tc)operator(.)ident(prepareTopLevel)operator(()ident(objectClass)operator(,) ident(topSelf)operator(\))operator(;) + + comment(// Initialize all the core classes) + ident(bootstrap)operator(()operator(\))operator(;) + + comment(// Create global constants and variables) + ident(RubyGlobal)operator(.)ident(createGlobals)operator(()ident(tc)operator(,) local_variable(this)operator(\))operator(;) + + comment(// Prepare LoadService and load path) + ident(getLoadService)operator(()operator(\))operator(.)ident(init)operator(()ident(config)operator(.)ident(loadPaths)operator(()operator(\))operator(\))operator(;) + + comment(// initialize builtin libraries) + ident(initBuiltins)operator(()operator(\))operator(;) + + comment(// Require in all libraries specified on command line) + keyword(for) operator(()type(String) ident(scriptName) operator(:) ident(config)operator(.)ident(requiredLibraries)operator(()operator(\))operator(\)) operator({) + ident(RubyKernel)operator(.)ident(require)operator(()ident(getTopSelf)operator(()operator(\))operator(,) ident(newString)operator(()ident(scriptName)operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(bootstrap)operator(()operator(\)) operator({) + ident(initCore)operator(()operator(\))operator(;) + ident(initExceptions)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(initRoot)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + comment(// Bootstrap the top of the hierarchy) + ident(objectClass) operator(=) ident(RubyClass)operator(.)ident(createBootstrapClass)operator(()local_variable(this)operator(,) string<delimiter(")content(Object)delimiter(")>operator(,) keyword(null)operator(,) ident(RubyObject)operator(.)ident(OBJECT_ALLOCATOR)operator(\))operator(;) + ident(moduleClass) operator(=) ident(RubyClass)operator(.)ident(createBootstrapClass)operator(()local_variable(this)operator(,) string<delimiter(")content(Module)delimiter(")>operator(,) ident(objectClass)operator(,) ident(RubyModule)operator(.)ident(MODULE_ALLOCATOR)operator(\))operator(;) + ident(classClass) operator(=) ident(RubyClass)operator(.)ident(createBootstrapClass)operator(()local_variable(this)operator(,) string<delimiter(")content(Class)delimiter(")>operator(,) ident(moduleClass)operator(,) ident(RubyClass)operator(.)ident(CLASS_ALLOCATOR)operator(\))operator(;) + + ident(objectClass)operator(.)ident(setMetaClass)operator(()ident(classClass)operator(\))operator(;) + ident(moduleClass)operator(.)ident(setMetaClass)operator(()ident(classClass)operator(\))operator(;) + ident(classClass)operator(.)ident(setMetaClass)operator(()ident(classClass)operator(\))operator(;) + + ident(RubyClass) ident(metaClass)operator(;) + ident(metaClass) operator(=) ident(objectClass)operator(.)ident(makeMetaClass)operator(()ident(classClass)operator(\))operator(;) + ident(metaClass) operator(=) ident(moduleClass)operator(.)ident(makeMetaClass)operator(()ident(metaClass)operator(\))operator(;) + ident(metaClass) operator(=) ident(classClass)operator(.)ident(makeMetaClass)operator(()ident(metaClass)operator(\))operator(;) + + ident(RubyObject)operator(.)ident(createObjectClass)operator(()local_variable(this)operator(,) ident(objectClass)operator(\))operator(;) + ident(RubyModule)operator(.)ident(createModuleClass)operator(()local_variable(this)operator(,) ident(moduleClass)operator(\))operator(;) + ident(RubyClass)operator(.)ident(createClassClass)operator(()local_variable(this)operator(,) ident(classClass)operator(\))operator(;) + + comment(// set constants now that they're initialized) + ident(objectClass)operator(.)ident(setConstant)operator(()string<delimiter(")content(Object)delimiter(")>operator(,) ident(objectClass)operator(\))operator(;) + ident(objectClass)operator(.)ident(setConstant)operator(()string<delimiter(")content(Class)delimiter(")>operator(,) ident(classClass)operator(\))operator(;) + ident(objectClass)operator(.)ident(setConstant)operator(()string<delimiter(")content(Module)delimiter(")>operator(,) ident(moduleClass)operator(\))operator(;) + + comment(// Initialize Kernel and include into Object) + ident(RubyKernel)operator(.)ident(createKernelModule)operator(()local_variable(this)operator(\))operator(;) + ident(objectClass)operator(.)ident(includeModule)operator(()ident(kernelModule)operator(\))operator(;) + + comment(// Initialize the "dummy" class used as a marker) + ident(dummyClass) operator(=) keyword(new) ident(RubyClass)operator(()local_variable(this)operator(\))operator(;) + ident(dummyClass)operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + + comment(// Object is ready, create top self) + ident(topSelf) operator(=) ident(TopSelfFactory)operator(.)ident(createTopSelf)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(initCore)operator(()operator(\)) operator({) + comment(// Pre-create all the core classes potentially referenced during startup) + ident(RubyNil)operator(.)ident(createNilClass)operator(()local_variable(this)operator(\))operator(;) + ident(RubyBoolean)operator(.)ident(createFalseClass)operator(()local_variable(this)operator(\))operator(;) + ident(RubyBoolean)operator(.)ident(createTrueClass)operator(()local_variable(this)operator(\))operator(;) + + ident(nilObject) operator(=) keyword(new) ident(RubyNil)operator(()local_variable(this)operator(\))operator(;) + ident(falseObject) operator(=) keyword(new) ident(RubyBoolean)operator(()local_variable(this)operator(,) keyword(false)operator(\))operator(;) + ident(trueObject) operator(=) keyword(new) ident(RubyBoolean)operator(()local_variable(this)operator(,) keyword(true)operator(\))operator(;) + + ident(RubyComparable)operator(.)ident(createComparable)operator(()local_variable(this)operator(\))operator(;) + ident(RubyEnumerable)operator(.)ident(createEnumerableModule)operator(()local_variable(this)operator(\))operator(;) + ident(RubyString)operator(.)ident(createStringClass)operator(()local_variable(this)operator(\))operator(;) + ident(RubySymbol)operator(.)ident(createSymbolClass)operator(()local_variable(this)operator(\))operator(;) + + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(ThreadGroup)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyThreadGroup)operator(.)ident(createThreadGroupClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Thread)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyThread)operator(.)ident(createThreadClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Exception)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyException)operator(.)ident(createExceptionClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(Precision)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyPrecision)operator(.)ident(createPrecisionModule)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Numeric)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyNumeric)operator(.)ident(createNumericClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Integer)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyInteger)operator(.)ident(createIntegerClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Fixnum)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyFixnum)operator(.)ident(createFixnumClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(config)operator(.)ident(getCompatVersion)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) operator({) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Complex)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyComplex)operator(.)ident(createComplexClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Rational)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyRational)operator(.)ident(createRationalClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Hash)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyHash)operator(.)ident(createHashClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Array)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyArray)operator(.)ident(createArrayClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Float)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyFloat)operator(.)ident(createFloatClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Bignum)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyBignum)operator(.)ident(createBignumClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + ident(ioClass) operator(=) ident(RubyIO)operator(.)ident(createIOClass)operator(()local_variable(this)operator(\))operator(;) + + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Struct)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyStruct)operator(.)ident(createStructClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Tms)delimiter(")>operator(\))operator(\)) operator({) + ident(tmsStruct) operator(=) ident(RubyStruct)operator(.)ident(newInstance)operator(()ident(structClass)operator(,) keyword(new) ident(IRubyObject)type([])operator({)ident(newString)operator(()string<delimiter(")content(Tms)delimiter(")>operator(\))operator(,) ident(newSymbol)operator(()string<delimiter(")content(utime)delimiter(")>operator(\))operator(,) ident(newSymbol)operator(()string<delimiter(")content(stime)delimiter(")>operator(\))operator(,) ident(newSymbol)operator(()string<delimiter(")content(cutime)delimiter(")>operator(\))operator(,) ident(newSymbol)operator(()string<delimiter(")content(cstime)delimiter(")>operator(\))operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Binding)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyBinding)operator(.)ident(createBindingClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + comment(// Math depends on all numeric types) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(Math)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyMath)operator(.)ident(createMathModule)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Regexp)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyRegexp)operator(.)ident(createRegexpClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Range)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyRange)operator(.)ident(createRangeClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(ObjectSpace)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyObjectSpace)operator(.)ident(createObjectSpaceModule)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(GC)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyGC)operator(.)ident(createGCModule)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Proc)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyProc)operator(.)ident(createProcClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Method)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyMethod)operator(.)ident(createMethodClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(MatchData)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyMatchData)operator(.)ident(createMatchDataClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(Marshal)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyMarshal)operator(.)ident(createMarshalModule)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Dir)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyDir)operator(.)ident(createDirClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(FileTest)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyFileTest)operator(.)ident(createFileTestModule)operator(()local_variable(this)operator(\))operator(;) + operator(}) + comment(// depends on IO, FileTest) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(File)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyFile)operator(.)ident(createFileClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(File::Stat)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyFileStat)operator(.)ident(createFileStatClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(Process)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyProcess)operator(.)ident(createProcessModule)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Time)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyTime)operator(.)ident(createTimeClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(UnboundMethod)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyUnboundMethod)operator(.)ident(defineUnboundMethodClass)operator(()local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Data)delimiter(")>operator(\))operator(\)) operator({) + ident(defineClass)operator(()string<delimiter(")content(Data)delimiter(")>operator(,) ident(objectClass)operator(,) ident(objectClass)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(isSecurityRestricted)operator(()operator(\))operator(\)) operator({) + comment(// Signal uses sun.misc.* classes, this is not allowed) + comment(// in the security-sensitive environments) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(Signal)delimiter(")>operator(\))operator(\)) operator({) + ident(RubySignal)operator(.)ident(createSignal)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(Continuation)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyContinuation)operator(.)ident(createContinuation)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(initExceptions)operator(()operator(\)) operator({) + ident(standardError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(StandardError)delimiter(")>operator(,) ident(exceptionClass)operator(\))operator(;) + ident(runtimeError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(RuntimeError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(ioError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(IOError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(scriptError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(ScriptError)delimiter(")>operator(,) ident(exceptionClass)operator(\))operator(;) + ident(rangeError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(RangeError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(signalException) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(SignalException)delimiter(")>operator(,) ident(exceptionClass)operator(\))operator(;) + + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(NameError)delimiter(")>operator(\))operator(\)) operator({) + ident(nameError) operator(=) ident(RubyNameError)operator(.)ident(createNameErrorClass)operator(()local_variable(this)operator(,) ident(standardError)operator(\))operator(;) + ident(nameErrorMessage) operator(=) ident(RubyNameError)operator(.)ident(createNameErrorMessageClass)operator(()local_variable(this)operator(,) ident(nameError)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(NoMethodError)delimiter(")>operator(\))operator(\)) operator({) + ident(noMethodError) operator(=) ident(RubyNoMethodError)operator(.)ident(createNoMethodErrorClass)operator(()local_variable(this)operator(,) ident(nameError)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(SystemExit)delimiter(")>operator(\))operator(\)) operator({) + ident(systemExit) operator(=) ident(RubySystemExit)operator(.)ident(createSystemExitClass)operator(()local_variable(this)operator(,) ident(exceptionClass)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(LocalJumpError)delimiter(")>operator(\))operator(\)) operator({) + ident(localJumpError) operator(=) ident(RubyLocalJumpError)operator(.)ident(createLocalJumpErrorClass)operator(()local_variable(this)operator(,) ident(standardError)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(NativeException)delimiter(")>operator(\))operator(\)) operator({) + ident(nativeException) operator(=) ident(NativeException)operator(.)ident(createClass)operator(()local_variable(this)operator(,) ident(runtimeError)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(profile)operator(.)ident(allowClass)operator(()string<delimiter(")content(SystemCallError)delimiter(")>operator(\))operator(\)) operator({) + ident(systemCallError) operator(=) ident(RubySystemCallError)operator(.)ident(createSystemCallErrorClass)operator(()local_variable(this)operator(,) ident(standardError)operator(\))operator(;) + operator(}) + + ident(fatal) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(Fatal)delimiter(")>operator(,) ident(exceptionClass)operator(\))operator(;) + ident(interrupt) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(Interrupt)delimiter(")>operator(,) ident(signalException)operator(\))operator(;) + ident(typeError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(TypeError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(argumentError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(ArgumentError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(indexError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(IndexError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(syntaxError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(SyntaxError)delimiter(")>operator(,) ident(scriptError)operator(\))operator(;) + ident(loadError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(LoadError)delimiter(")>operator(,) ident(scriptError)operator(\))operator(;) + ident(notImplementedError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(NotImplementedError)delimiter(")>operator(,) ident(scriptError)operator(\))operator(;) + ident(securityError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(SecurityError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(noMemoryError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(NoMemoryError)delimiter(")>operator(,) ident(exceptionClass)operator(\))operator(;) + ident(regexpError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(RegexpError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(eofError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(EOFError)delimiter(")>operator(,) ident(ioError)operator(\))operator(;) + ident(threadError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(ThreadError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(concurrencyError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(ConcurrencyError)delimiter(")>operator(,) ident(threadError)operator(\))operator(;) + ident(systemStackError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(SystemStackError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(zeroDivisionError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(ZeroDivisionError)delimiter(")>operator(,) ident(standardError)operator(\))operator(;) + ident(floatDomainError) operator(=) ident(defineClassIfAllowed)operator(()string<delimiter(")content(FloatDomainError)delimiter(")>operator(,) ident(rangeError)operator(\))operator(;) + + ident(initErrno)operator(()operator(\))operator(;) + operator(}) + + directive(private) ident(RubyClass) ident(defineClassIfAllowed)operator(()type(String) ident(name)operator(,) ident(RubyClass) ident(superClass)operator(\)) operator({) + comment(// TODO: should probably apply the null object pattern for a) + comment(// non-allowed class, rather than null) + keyword(if) operator(()ident(superClass) operator(!=) keyword(null) operator(&&) ident(profile)operator(.)ident(allowClass)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(defineClass)operator(()ident(name)operator(,) ident(superClass)operator(,) ident(superClass)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(private) type(Map)operator(<)type(Integer)operator(,) ident(RubyClass)operator(>) ident(errnos) operator(=) keyword(new) type(HashMap)operator(<)type(Integer)operator(,) ident(RubyClass)operator(>)operator(()operator(\))operator(;) + + directive(public) ident(RubyClass) ident(getErrno)operator(()type(int) ident(n)operator(\)) operator({) + keyword(return) ident(errnos)operator(.)ident(get)operator(()ident(n)operator(\))operator(;) + operator(}) + + comment(/** + * Create module Errno's Variables. We have this method since Errno does not have it's + * own java class. + */) + directive(private) type(void) ident(initErrno)operator(()operator(\)) operator({) + keyword(if) operator(()ident(profile)operator(.)ident(allowModule)operator(()string<delimiter(")content(Errno)delimiter(")>operator(\))operator(\)) operator({) + ident(errnoModule) operator(=) ident(defineModule)operator(()string<delimiter(")content(Errno)delimiter(")>operator(\))operator(;) + + type(Field)type([]) ident(fields) operator(=) ident(IErrno)operator(.)ident(class)operator(.)ident(getFields)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(fields)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(try) operator({) + ident(createSysErr)operator(()ident(fields)operator([)ident(i)operator(])operator(.)ident(getInt)operator(()ident(IErrno)operator(.)ident(class)operator(\))operator(,) ident(fields)operator([)ident(i)operator(])operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IllegalAccessException) ident(e)operator(\)) operator({) + keyword(throw) keyword(new) type(RuntimeException)operator(()string<delimiter(")content(Someone defined a non-public constant in IErrno.java)delimiter(")>operator(,) ident(e)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + + comment(/** + * Creates a system error. + * @param i the error code (will probably use a java exception instead\) + * @param name of the error to define. + **/) + directive(private) type(void) ident(createSysErr)operator(()type(int) ident(i)operator(,) type(String) ident(name)operator(\)) operator({) + keyword(if)operator(()ident(profile)operator(.)ident(allowClass)operator(()ident(name)operator(\))operator(\)) operator({) + ident(RubyClass) ident(errno) operator(=) ident(getErrno)operator(()operator(\))operator(.)ident(defineClassUnder)operator(()ident(name)operator(,) ident(systemCallError)operator(,) ident(systemCallError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(errnos)operator(.)ident(put)operator(()ident(i)operator(,) ident(errno)operator(\))operator(;) + ident(errno)operator(.)ident(defineConstant)operator(()string<delimiter(")content(Errno)delimiter(")>operator(,) ident(newFixnum)operator(()ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(initBuiltins)operator(()operator(\)) operator({) + ident(addLazyBuiltin)operator(()string<delimiter(")content(java.rb)delimiter(")>operator(,) string<delimiter(")content(java)delimiter(")>operator(,) string<delimiter(")content(org.jruby.javasupport.Java)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(jruby.rb)delimiter(")>operator(,) string<delimiter(")content(jruby)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.JRubyLibrary)delimiter(")>operator(\))operator(;) + + ident(addLazyBuiltin)operator(()string<delimiter(")content(minijava.rb)delimiter(")>operator(,) string<delimiter(")content(minijava)delimiter(")>operator(,) string<delimiter(")content(org.jruby.java.MiniJava)delimiter(")>operator(\))operator(;) + + ident(addLazyBuiltin)operator(()string<delimiter(")content(jruby/ext.rb)delimiter(")>operator(,) string<delimiter(")content(jruby/ext)delimiter(")>operator(,) string<delimiter(")content(org.jruby.RubyJRuby$ExtLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(jruby/type.rb)delimiter(")>operator(,) string<delimiter(")content(jruby/type)delimiter(")>operator(,) string<delimiter(")content(org.jruby.RubyJRuby$TypeLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(iconv.so)delimiter(")>operator(,) string<delimiter(")content(iconv)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.IConvLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(nkf.so)delimiter(")>operator(,) string<delimiter(")content(nkf)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.NKFLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(stringio.so)delimiter(")>operator(,) string<delimiter(")content(stringio)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.StringIOLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(strscan.so)delimiter(")>operator(,) string<delimiter(")content(strscan)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.StringScannerLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(zlib.so)delimiter(")>operator(,) string<delimiter(")content(zlib)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.ZlibLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(yaml_internal.rb)delimiter(")>operator(,) string<delimiter(")content(yaml_internal)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.YamlLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(enumerator.so)delimiter(")>operator(,) string<delimiter(")content(enumerator)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.EnumeratorLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(generator_internal.rb)delimiter(")>operator(,) string<delimiter(")content(generator_internal)delimiter(")>operator(,) string<delimiter(")content(org.jruby.ext.Generator$Service)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(readline.so)delimiter(")>operator(,) string<delimiter(")content(readline)delimiter(")>operator(,) string<delimiter(")content(org.jruby.ext.Readline$Service)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(thread.so)delimiter(")>operator(,) string<delimiter(")content(thread)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.ThreadLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(digest.so)delimiter(")>operator(,) string<delimiter(")content(digest)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.DigestLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(digest.rb)delimiter(")>operator(,) string<delimiter(")content(digest)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.DigestLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(digest/md5.so)delimiter(")>operator(,) string<delimiter(")content(digest/md5)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.DigestLibrary$MD5)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(digest/rmd160.so)delimiter(")>operator(,) string<delimiter(")content(digest/rmd160)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.DigestLibrary$RMD160)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(digest/sha1.so)delimiter(")>operator(,) string<delimiter(")content(digest/sha1)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.DigestLibrary$SHA1)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(digest/sha2.so)delimiter(")>operator(,) string<delimiter(")content(digest/sha2)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.DigestLibrary$SHA2)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(bigdecimal.so)delimiter(")>operator(,) string<delimiter(")content(bigdecimal)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.BigDecimalLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(io/wait.so)delimiter(")>operator(,) string<delimiter(")content(io/wait)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.IOWaitLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(etc.so)delimiter(")>operator(,) string<delimiter(")content(etc)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.EtcLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(weakref.rb)delimiter(")>operator(,) string<delimiter(")content(weakref)delimiter(")>operator(,) string<delimiter(")content(org.jruby.ext.WeakRef$WeakRefLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(socket.so)delimiter(")>operator(,) string<delimiter(")content(socket)delimiter(")>operator(,) string<delimiter(")content(org.jruby.ext.socket.RubySocket$Service)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(rbconfig.rb)delimiter(")>operator(,) string<delimiter(")content(rbconfig)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.RbConfigLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(jruby/serialization.rb)delimiter(")>operator(,) string<delimiter(")content(serialization)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.JRubySerializationLibrary)delimiter(")>operator(\))operator(;) + ident(addLazyBuiltin)operator(()string<delimiter(")content(ffi.so)delimiter(")>operator(,) string<delimiter(")content(ffi)delimiter(")>operator(,) string<delimiter(")content(org.jruby.ext.ffi.Factory$Service)delimiter(")>operator(\))operator(;) + keyword(if)operator(()ident(RubyInstanceConfig)operator(.)ident(NATIVE_NET_PROTOCOL)operator(\)) operator({) + ident(addLazyBuiltin)operator(()string<delimiter(")content(net/protocol.rb)delimiter(")>operator(,) string<delimiter(")content(net/protocol)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.NetProtocolBufferedIOLibrary)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(config)operator(.)ident(getCompatVersion)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) operator({) + ident(addLazyBuiltin)operator(()string<delimiter(")content(fiber.so)delimiter(")>operator(,) string<delimiter(")content(fiber)delimiter(")>operator(,) string<delimiter(")content(org.jruby.libraries.FiberLibrary)delimiter(")>operator(\))operator(;) + operator(}) + + ident(addBuiltinIfAllowed)operator(()string<delimiter(")content(openssl.so)delimiter(")>operator(,) keyword(new) ident(Library)operator(()operator(\)) operator({) + directive(public) type(void) ident(load)operator(()ident(Ruby) ident(runtime)operator(,) type(boolean) ident(wrap)operator(\)) directive(throws) type(IOException) operator({) + ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(jruby/openssl/stub)delimiter(")>operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + type(String)type([]) ident(builtins) operator(=) operator({)string<delimiter(")content(fcntl)delimiter(")>operator(,) string<delimiter(")content(yaml)delimiter(")>operator(,) string<delimiter(")content(yaml/syck)delimiter(")>operator(,) string<delimiter(")content(jsignal)delimiter(")> operator(})operator(;) + keyword(for) operator(()type(String) ident(library) operator(:) ident(builtins)operator(\)) operator({) + ident(addBuiltinIfAllowed)operator(()ident(library) operator(+) string<delimiter(")content(.rb)delimiter(")>operator(,) keyword(new) ident(BuiltinScript)operator(()ident(library)operator(\))operator(\))operator(;) + operator(}) + + ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(builtin/core_ext/symbol)delimiter(")>operator(\))operator(;) + + ident(RubyKernel)operator(.)ident(autoload)operator(()ident(topSelf)operator(,) ident(newSymbol)operator(()string<delimiter(")content(Java)delimiter(")>operator(\))operator(,) ident(newString)operator(()string<delimiter(")content(java)delimiter(")>operator(\))operator(\))operator(;) + + ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(enumerator)delimiter(")>operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(addLazyBuiltin)operator(()type(String) ident(name)operator(,) type(String) ident(shortName)operator(,) type(String) ident(className)operator(\)) operator({) + ident(addBuiltinIfAllowed)operator(()ident(name)operator(,) keyword(new) ident(LateLoadingLibrary)operator(()ident(shortName)operator(,) ident(className)operator(,) ident(getJRubyClassLoader)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(addBuiltinIfAllowed)operator(()type(String) ident(name)operator(,) ident(Library) ident(lib)operator(\)) operator({) + keyword(if)operator(()ident(profile)operator(.)ident(allowBuiltin)operator(()ident(name)operator(\))operator(\)) operator({) + ident(loadService)operator(.)ident(addBuiltinLibrary)operator(()ident(name)operator(,)ident(lib)operator(\))operator(;) + operator(}) + operator(}) + + type(Object) ident(getRespondToMethod)operator(()operator(\)) operator({) + keyword(return) ident(respondToMethod)operator(;) + operator(}) + + type(void) ident(setRespondToMethod)operator(()type(Object) ident(rtm)operator(\)) operator({) + local_variable(this)operator(.)ident(respondToMethod) operator(=) ident(rtm)operator(;) + operator(}) + + directive(public) type(Object) ident(getObjectToYamlMethod)operator(()operator(\)) operator({) + keyword(return) ident(objectToYamlMethod)operator(;) + operator(}) + + type(void) ident(setObjectToYamlMethod)operator(()type(Object) ident(otym)operator(\)) operator({) + local_variable(this)operator(.)ident(objectToYamlMethod) operator(=) ident(otym)operator(;) + operator(}) + + comment(/** + * Retrieve mappings of cached methods to where they have been cached. When a cached + * method needs to be invalidated this map can be used to remove all places it has been + * cached. + * + * @return the mappings of where cached methods have been stored + */) + directive(public) ident(CacheMap) ident(getCacheMap)operator(()operator(\)) operator({) + keyword(return) ident(cacheMap)operator(;) + operator(}) + + comment(/** Getter for property rubyTopSelf. + * @return Value of property rubyTopSelf. + */) + directive(public) ident(IRubyObject) ident(getTopSelf)operator(()operator(\)) operator({) + keyword(return) ident(topSelf)operator(;) + operator(}) + + directive(public) type(void) ident(setCurrentDirectory)operator(()type(String) ident(dir)operator(\)) operator({) + ident(currentDirectory) operator(=) ident(dir)operator(;) + operator(}) + + directive(public) type(String) ident(getCurrentDirectory)operator(()operator(\)) operator({) + keyword(return) ident(currentDirectory)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getEtc)operator(()operator(\)) operator({) + keyword(return) ident(etcModule)operator(;) + operator(}) + + directive(public) type(void) ident(setEtc)operator(()ident(RubyModule) ident(etcModule)operator(\)) operator({) + local_variable(this)operator(.)ident(etcModule) operator(=) ident(etcModule)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getObject)operator(()operator(\)) operator({) + keyword(return) ident(objectClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getModule)operator(()operator(\)) operator({) + keyword(return) ident(moduleClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getClassClass)operator(()operator(\)) operator({) + keyword(return) ident(classClass)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getKernel)operator(()operator(\)) operator({) + keyword(return) ident(kernelModule)operator(;) + operator(}) + type(void) ident(setKernel)operator(()ident(RubyModule) ident(kernelModule)operator(\)) operator({) + local_variable(this)operator(.)ident(kernelModule) operator(=) ident(kernelModule)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getDummy)operator(()operator(\)) operator({) + keyword(return) ident(dummyClass)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getComparable)operator(()operator(\)) operator({) + keyword(return) ident(comparableModule)operator(;) + operator(}) + type(void) ident(setComparable)operator(()ident(RubyModule) ident(comparableModule)operator(\)) operator({) + local_variable(this)operator(.)ident(comparableModule) operator(=) ident(comparableModule)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getNumeric)operator(()operator(\)) operator({) + keyword(return) ident(numericClass)operator(;) + operator(}) + type(void) ident(setNumeric)operator(()ident(RubyClass) ident(numericClass)operator(\)) operator({) + local_variable(this)operator(.)ident(numericClass) operator(=) ident(numericClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getFloat)operator(()operator(\)) operator({) + keyword(return) ident(floatClass)operator(;) + operator(}) + type(void) ident(setFloat)operator(()ident(RubyClass) ident(floatClass)operator(\)) operator({) + local_variable(this)operator(.)ident(floatClass) operator(=) ident(floatClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getInteger)operator(()operator(\)) operator({) + keyword(return) ident(integerClass)operator(;) + operator(}) + type(void) ident(setInteger)operator(()ident(RubyClass) ident(integerClass)operator(\)) operator({) + local_variable(this)operator(.)ident(integerClass) operator(=) ident(integerClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getFixnum)operator(()operator(\)) operator({) + keyword(return) ident(fixnumClass)operator(;) + operator(}) + type(void) ident(setFixnum)operator(()ident(RubyClass) ident(fixnumClass)operator(\)) operator({) + local_variable(this)operator(.)ident(fixnumClass) operator(=) ident(fixnumClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getComplex)operator(()operator(\)) operator({) + keyword(return) ident(complexClass)operator(;) + operator(}) + type(void) ident(setComplex)operator(()ident(RubyClass) ident(complexClass)operator(\)) operator({) + local_variable(this)operator(.)ident(complexClass) operator(=) ident(complexClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getRational)operator(()operator(\)) operator({) + keyword(return) ident(rationalClass)operator(;) + operator(}) + type(void) ident(setRational)operator(()ident(RubyClass) ident(rationalClass)operator(\)) operator({) + local_variable(this)operator(.)ident(rationalClass) operator(=) ident(rationalClass)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getEnumerable)operator(()operator(\)) operator({) + keyword(return) ident(enumerableModule)operator(;) + operator(}) + type(void) ident(setEnumerable)operator(()ident(RubyModule) ident(enumerableModule)operator(\)) operator({) + local_variable(this)operator(.)ident(enumerableModule) operator(=) ident(enumerableModule)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getEnumerator)operator(()operator(\)) operator({) + keyword(return) ident(enumeratorClass)operator(;) + operator(}) + type(void) ident(setEnumerator)operator(()ident(RubyClass) ident(enumeratorClass)operator(\)) operator({) + local_variable(this)operator(.)ident(enumeratorClass) operator(=) ident(enumeratorClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getString)operator(()operator(\)) operator({) + keyword(return) ident(stringClass)operator(;) + operator(}) + type(void) ident(setString)operator(()ident(RubyClass) ident(stringClass)operator(\)) operator({) + local_variable(this)operator(.)ident(stringClass) operator(=) ident(stringClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getSymbol)operator(()operator(\)) operator({) + keyword(return) ident(symbolClass)operator(;) + operator(}) + type(void) ident(setSymbol)operator(()ident(RubyClass) ident(symbolClass)operator(\)) operator({) + local_variable(this)operator(.)ident(symbolClass) operator(=) ident(symbolClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getArray)operator(()operator(\)) operator({) + keyword(return) ident(arrayClass)operator(;) + operator(}) + type(void) ident(setArray)operator(()ident(RubyClass) ident(arrayClass)operator(\)) operator({) + local_variable(this)operator(.)ident(arrayClass) operator(=) ident(arrayClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getHash)operator(()operator(\)) operator({) + keyword(return) ident(hashClass)operator(;) + operator(}) + type(void) ident(setHash)operator(()ident(RubyClass) ident(hashClass)operator(\)) operator({) + local_variable(this)operator(.)ident(hashClass) operator(=) ident(hashClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getRange)operator(()operator(\)) operator({) + keyword(return) ident(rangeClass)operator(;) + operator(}) + type(void) ident(setRange)operator(()ident(RubyClass) ident(rangeClass)operator(\)) operator({) + local_variable(this)operator(.)ident(rangeClass) operator(=) ident(rangeClass)operator(;) + operator(}) + + comment(/** Returns the "true" instance from the instance pool. + * @return The "true" instance. + */) + directive(public) ident(RubyBoolean) ident(getTrue)operator(()operator(\)) operator({) + keyword(return) ident(trueObject)operator(;) + operator(}) + + comment(/** Returns the "false" instance from the instance pool. + * @return The "false" instance. + */) + directive(public) ident(RubyBoolean) ident(getFalse)operator(()operator(\)) operator({) + keyword(return) ident(falseObject)operator(;) + operator(}) + + comment(/** Returns the "nil" singleton instance. + * @return "nil" + */) + directive(public) ident(IRubyObject) ident(getNil)operator(()operator(\)) operator({) + keyword(return) ident(nilObject)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getNilClass)operator(()operator(\)) operator({) + keyword(return) ident(nilClass)operator(;) + operator(}) + type(void) ident(setNilClass)operator(()ident(RubyClass) ident(nilClass)operator(\)) operator({) + local_variable(this)operator(.)ident(nilClass) operator(=) ident(nilClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getTrueClass)operator(()operator(\)) operator({) + keyword(return) ident(trueClass)operator(;) + operator(}) + type(void) ident(setTrueClass)operator(()ident(RubyClass) ident(trueClass)operator(\)) operator({) + local_variable(this)operator(.)ident(trueClass) operator(=) ident(trueClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getFalseClass)operator(()operator(\)) operator({) + keyword(return) ident(falseClass)operator(;) + operator(}) + type(void) ident(setFalseClass)operator(()ident(RubyClass) ident(falseClass)operator(\)) operator({) + local_variable(this)operator(.)ident(falseClass) operator(=) ident(falseClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getProc)operator(()operator(\)) operator({) + keyword(return) ident(procClass)operator(;) + operator(}) + type(void) ident(setProc)operator(()ident(RubyClass) ident(procClass)operator(\)) operator({) + local_variable(this)operator(.)ident(procClass) operator(=) ident(procClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getBinding)operator(()operator(\)) operator({) + keyword(return) ident(bindingClass)operator(;) + operator(}) + type(void) ident(setBinding)operator(()ident(RubyClass) ident(bindingClass)operator(\)) operator({) + local_variable(this)operator(.)ident(bindingClass) operator(=) ident(bindingClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getMethod)operator(()operator(\)) operator({) + keyword(return) ident(methodClass)operator(;) + operator(}) + type(void) ident(setMethod)operator(()ident(RubyClass) ident(methodClass)operator(\)) operator({) + local_variable(this)operator(.)ident(methodClass) operator(=) ident(methodClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getUnboundMethod)operator(()operator(\)) operator({) + keyword(return) ident(unboundMethodClass)operator(;) + operator(}) + type(void) ident(setUnboundMethod)operator(()ident(RubyClass) ident(unboundMethodClass)operator(\)) operator({) + local_variable(this)operator(.)ident(unboundMethodClass) operator(=) ident(unboundMethodClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getMatchData)operator(()operator(\)) operator({) + keyword(return) ident(matchDataClass)operator(;) + operator(}) + type(void) ident(setMatchData)operator(()ident(RubyClass) ident(matchDataClass)operator(\)) operator({) + local_variable(this)operator(.)ident(matchDataClass) operator(=) ident(matchDataClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getRegexp)operator(()operator(\)) operator({) + keyword(return) ident(regexpClass)operator(;) + operator(}) + type(void) ident(setRegexp)operator(()ident(RubyClass) ident(regexpClass)operator(\)) operator({) + local_variable(this)operator(.)ident(regexpClass) operator(=) ident(regexpClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getTime)operator(()operator(\)) operator({) + keyword(return) ident(timeClass)operator(;) + operator(}) + type(void) ident(setTime)operator(()ident(RubyClass) ident(timeClass)operator(\)) operator({) + local_variable(this)operator(.)ident(timeClass) operator(=) ident(timeClass)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getMath)operator(()operator(\)) operator({) + keyword(return) ident(mathModule)operator(;) + operator(}) + type(void) ident(setMath)operator(()ident(RubyModule) ident(mathModule)operator(\)) operator({) + local_variable(this)operator(.)ident(mathModule) operator(=) ident(mathModule)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getMarshal)operator(()operator(\)) operator({) + keyword(return) ident(marshalModule)operator(;) + operator(}) + type(void) ident(setMarshal)operator(()ident(RubyModule) ident(marshalModule)operator(\)) operator({) + local_variable(this)operator(.)ident(marshalModule) operator(=) ident(marshalModule)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getBignum)operator(()operator(\)) operator({) + keyword(return) ident(bignumClass)operator(;) + operator(}) + type(void) ident(setBignum)operator(()ident(RubyClass) ident(bignumClass)operator(\)) operator({) + local_variable(this)operator(.)ident(bignumClass) operator(=) ident(bignumClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getDir)operator(()operator(\)) operator({) + keyword(return) ident(dirClass)operator(;) + operator(}) + type(void) ident(setDir)operator(()ident(RubyClass) ident(dirClass)operator(\)) operator({) + local_variable(this)operator(.)ident(dirClass) operator(=) ident(dirClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getFile)operator(()operator(\)) operator({) + keyword(return) ident(fileClass)operator(;) + operator(}) + type(void) ident(setFile)operator(()ident(RubyClass) ident(fileClass)operator(\)) operator({) + local_variable(this)operator(.)ident(fileClass) operator(=) ident(fileClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getFileStat)operator(()operator(\)) operator({) + keyword(return) ident(fileStatClass)operator(;) + operator(}) + type(void) ident(setFileStat)operator(()ident(RubyClass) ident(fileStatClass)operator(\)) operator({) + local_variable(this)operator(.)ident(fileStatClass) operator(=) ident(fileStatClass)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getFileTest)operator(()operator(\)) operator({) + keyword(return) ident(fileTestModule)operator(;) + operator(}) + type(void) ident(setFileTest)operator(()ident(RubyModule) ident(fileTestModule)operator(\)) operator({) + local_variable(this)operator(.)ident(fileTestModule) operator(=) ident(fileTestModule)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getIO)operator(()operator(\)) operator({) + keyword(return) ident(ioClass)operator(;) + operator(}) + type(void) ident(setIO)operator(()ident(RubyClass) ident(ioClass)operator(\)) operator({) + local_variable(this)operator(.)ident(ioClass) operator(=) ident(ioClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getThread)operator(()operator(\)) operator({) + keyword(return) ident(threadClass)operator(;) + operator(}) + type(void) ident(setThread)operator(()ident(RubyClass) ident(threadClass)operator(\)) operator({) + local_variable(this)operator(.)ident(threadClass) operator(=) ident(threadClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getThreadGroup)operator(()operator(\)) operator({) + keyword(return) ident(threadGroupClass)operator(;) + operator(}) + type(void) ident(setThreadGroup)operator(()ident(RubyClass) ident(threadGroupClass)operator(\)) operator({) + local_variable(this)operator(.)ident(threadGroupClass) operator(=) ident(threadGroupClass)operator(;) + operator(}) + + directive(public) ident(RubyThreadGroup) ident(getDefaultThreadGroup)operator(()operator(\)) operator({) + keyword(return) ident(defaultThreadGroup)operator(;) + operator(}) + type(void) ident(setDefaultThreadGroup)operator(()ident(RubyThreadGroup) ident(defaultThreadGroup)operator(\)) operator({) + local_variable(this)operator(.)ident(defaultThreadGroup) operator(=) ident(defaultThreadGroup)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getContinuation)operator(()operator(\)) operator({) + keyword(return) ident(continuationClass)operator(;) + operator(}) + type(void) ident(setContinuation)operator(()ident(RubyClass) ident(continuationClass)operator(\)) operator({) + local_variable(this)operator(.)ident(continuationClass) operator(=) ident(continuationClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getStructClass)operator(()operator(\)) operator({) + keyword(return) ident(structClass)operator(;) + operator(}) + type(void) ident(setStructClass)operator(()ident(RubyClass) ident(structClass)operator(\)) operator({) + local_variable(this)operator(.)ident(structClass) operator(=) ident(structClass)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getTmsStruct)operator(()operator(\)) operator({) + keyword(return) ident(tmsStruct)operator(;) + operator(}) + type(void) ident(setTmsStruct)operator(()ident(RubyClass) ident(tmsStruct)operator(\)) operator({) + local_variable(this)operator(.)ident(tmsStruct) operator(=) ident(tmsStruct)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getPasswdStruct)operator(()operator(\)) operator({) + keyword(return) ident(passwdStruct)operator(;) + operator(}) + type(void) ident(setPasswdStruct)operator(()ident(RubyClass) ident(passwdStruct)operator(\)) operator({) + local_variable(this)operator(.)ident(passwdStruct) operator(=) ident(passwdStruct)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getGroupStruct)operator(()operator(\)) operator({) + keyword(return) ident(groupStruct)operator(;) + operator(}) + type(void) ident(setGroupStruct)operator(()ident(RubyClass) ident(groupStruct)operator(\)) operator({) + local_variable(this)operator(.)ident(groupStruct) operator(=) ident(groupStruct)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getGC)operator(()operator(\)) operator({) + keyword(return) ident(gcModule)operator(;) + operator(}) + type(void) ident(setGC)operator(()ident(RubyModule) ident(gcModule)operator(\)) operator({) + local_variable(this)operator(.)ident(gcModule) operator(=) ident(gcModule)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getObjectSpaceModule)operator(()operator(\)) operator({) + keyword(return) ident(objectSpaceModule)operator(;) + operator(}) + type(void) ident(setObjectSpaceModule)operator(()ident(RubyModule) ident(objectSpaceModule)operator(\)) operator({) + local_variable(this)operator(.)ident(objectSpaceModule) operator(=) ident(objectSpaceModule)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getProcess)operator(()operator(\)) operator({) + keyword(return) ident(processModule)operator(;) + operator(}) + type(void) ident(setProcess)operator(()ident(RubyModule) ident(processModule)operator(\)) operator({) + local_variable(this)operator(.)ident(processModule) operator(=) ident(processModule)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getProcStatus)operator(()operator(\)) operator({) + keyword(return) ident(procStatusClass)operator(;) + operator(}) + type(void) ident(setProcStatus)operator(()ident(RubyClass) ident(procStatusClass)operator(\)) operator({) + local_variable(this)operator(.)ident(procStatusClass) operator(=) ident(procStatusClass)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getProcUID)operator(()operator(\)) operator({) + keyword(return) ident(procUIDModule)operator(;) + operator(}) + type(void) ident(setProcUID)operator(()ident(RubyModule) ident(procUIDModule)operator(\)) operator({) + local_variable(this)operator(.)ident(procUIDModule) operator(=) ident(procUIDModule)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getProcGID)operator(()operator(\)) operator({) + keyword(return) ident(procGIDModule)operator(;) + operator(}) + type(void) ident(setProcGID)operator(()ident(RubyModule) ident(procGIDModule)operator(\)) operator({) + local_variable(this)operator(.)ident(procGIDModule) operator(=) ident(procGIDModule)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getProcSysModule)operator(()operator(\)) operator({) + keyword(return) ident(procSysModule)operator(;) + operator(}) + type(void) ident(setProcSys)operator(()ident(RubyModule) ident(procSysModule)operator(\)) operator({) + local_variable(this)operator(.)ident(procSysModule) operator(=) ident(procSysModule)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getPrecision)operator(()operator(\)) operator({) + keyword(return) ident(precisionModule)operator(;) + operator(}) + type(void) ident(setPrecision)operator(()ident(RubyModule) ident(precisionModule)operator(\)) operator({) + local_variable(this)operator(.)ident(precisionModule) operator(=) ident(precisionModule)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getErrno)operator(()operator(\)) operator({) + keyword(return) ident(errnoModule)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getException)operator(()operator(\)) operator({) + keyword(return) ident(exceptionClass)operator(;) + operator(}) + type(void) ident(setException)operator(()ident(RubyClass) ident(exceptionClass)operator(\)) operator({) + local_variable(this)operator(.)ident(exceptionClass) operator(=) ident(exceptionClass)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getNameError)operator(()operator(\)) operator({) + keyword(return) ident(nameError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getNameErrorMessage)operator(()operator(\)) operator({) + keyword(return) ident(nameErrorMessage)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getNoMethodError)operator(()operator(\)) operator({) + keyword(return) ident(noMethodError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getSignalException)operator(()operator(\)) operator({) + keyword(return) ident(signalException)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getRangeError)operator(()operator(\)) operator({) + keyword(return) ident(rangeError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getSystemExit)operator(()operator(\)) operator({) + keyword(return) ident(systemExit)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getLocalJumpError)operator(()operator(\)) operator({) + keyword(return) ident(localJumpError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getNativeException)operator(()operator(\)) operator({) + keyword(return) ident(nativeException)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getSystemCallError)operator(()operator(\)) operator({) + keyword(return) ident(systemCallError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getFatal)operator(()operator(\)) operator({) + keyword(return) ident(fatal)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getInterrupt)operator(()operator(\)) operator({) + keyword(return) ident(interrupt)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getTypeError)operator(()operator(\)) operator({) + keyword(return) ident(typeError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getArgumentError)operator(()operator(\)) operator({) + keyword(return) ident(argumentError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getIndexError)operator(()operator(\)) operator({) + keyword(return) ident(indexError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getSyntaxError)operator(()operator(\)) operator({) + keyword(return) ident(syntaxError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getStandardError)operator(()operator(\)) operator({) + keyword(return) ident(standardError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getRuntimeError)operator(()operator(\)) operator({) + keyword(return) ident(runtimeError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getIOError)operator(()operator(\)) operator({) + keyword(return) ident(ioError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getLoadError)operator(()operator(\)) operator({) + keyword(return) ident(loadError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getNotImplementedError)operator(()operator(\)) operator({) + keyword(return) ident(notImplementedError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getSecurityError)operator(()operator(\)) operator({) + keyword(return) ident(securityError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getNoMemoryError)operator(()operator(\)) operator({) + keyword(return) ident(noMemoryError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getRegexpError)operator(()operator(\)) operator({) + keyword(return) ident(regexpError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getEOFError)operator(()operator(\)) operator({) + keyword(return) ident(eofError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getThreadError)operator(()operator(\)) operator({) + keyword(return) ident(threadError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getConcurrencyError)operator(()operator(\)) operator({) + keyword(return) ident(concurrencyError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getSystemStackError)operator(()operator(\)) operator({) + keyword(return) ident(systemStackError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getZeroDivisionError)operator(()operator(\)) operator({) + keyword(return) ident(zeroDivisionError)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getFloatDomainError)operator(()operator(\)) operator({) + keyword(return) ident(floatDomainError)operator(;) + operator(}) + + directive(private) ident(RubyHash) ident(charsetMap)operator(;) + directive(public) ident(RubyHash) ident(getCharsetMap)operator(()operator(\)) operator({) + keyword(if) operator(()ident(charsetMap) operator(==) keyword(null)operator(\)) ident(charsetMap) operator(=) keyword(new) ident(RubyHash)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(charsetMap)operator(;) + operator(}) + + comment(/** Getter for property isVerbose. + * @return Value of property isVerbose. + */) + directive(public) ident(IRubyObject) ident(getVerbose)operator(()operator(\)) operator({) + keyword(return) ident(verbose)operator(;) + operator(}) + + comment(/** Setter for property isVerbose. + * @param verbose New value of property isVerbose. + */) + directive(public) type(void) ident(setVerbose)operator(()ident(IRubyObject) ident(verbose)operator(\)) operator({) + local_variable(this)operator(.)ident(verbose) operator(=) ident(verbose)operator(;) + operator(}) + + comment(/** Getter for property isDebug. + * @return Value of property isDebug. + */) + directive(public) ident(IRubyObject) ident(getDebug)operator(()operator(\)) operator({) + keyword(return) ident(debug)operator(;) + operator(}) + + comment(/** Setter for property isDebug. + * @param debug New value of property isDebug. + */) + directive(public) type(void) ident(setDebug)operator(()ident(IRubyObject) ident(debug)operator(\)) operator({) + local_variable(this)operator(.)ident(debug) operator(=) ident(debug)operator(;) + operator(}) + + directive(public) ident(JavaSupport) ident(getJavaSupport)operator(()operator(\)) operator({) + keyword(return) ident(javaSupport)operator(;) + operator(}) + + directive(public) directive(static) type(ClassLoader) ident(getClassLoader)operator(()operator(\)) operator({) + comment(// we try to get the classloader that loaded JRuby, falling back on System) + type(ClassLoader) ident(loader) operator(=) ident(Ruby)operator(.)ident(class)operator(.)ident(getClassLoader)operator(()operator(\))operator(;) + keyword(if) operator(()ident(loader) operator(==) keyword(null)operator(\)) operator({) + ident(loader) operator(=) type(ClassLoader)operator(.)ident(getSystemClassLoader)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(loader)operator(;) + operator(}) + + directive(public) directive(synchronized) ident(JRubyClassLoader) ident(getJRubyClassLoader)operator(()operator(\)) operator({) + comment(// FIXME: Get rid of laziness and handle restricted access elsewhere) + keyword(if) operator(()operator(!)ident(Ruby)operator(.)ident(isSecurityRestricted)operator(()operator(\)) operator(&&) ident(jrubyClassLoader) operator(==) keyword(null)operator(\)) operator({) + ident(jrubyClassLoader) operator(=) keyword(new) ident(JRubyClassLoader)operator(()ident(config)operator(.)ident(getLoader)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(jrubyClassLoader)operator(;) + operator(}) + + comment(/** Defines a global variable + */) + directive(public) type(void) ident(defineVariable)operator(()directive(final) ident(GlobalVariable) ident(variable)operator(\)) operator({) + ident(globalVariables)operator(.)ident(define)operator(()ident(variable)operator(.)ident(name)operator(()operator(\))operator(,) keyword(new) ident(IAccessor)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(getValue)operator(()operator(\)) operator({) + keyword(return) ident(variable)operator(.)ident(get)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(setValue)operator(()ident(IRubyObject) ident(newValue)operator(\)) operator({) + keyword(return) ident(variable)operator(.)ident(set)operator(()ident(newValue)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + + comment(/** defines a readonly global variable + * + */) + directive(public) type(void) ident(defineReadonlyVariable)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(globalVariables)operator(.)ident(defineReadonly)operator(()ident(name)operator(,) keyword(new) ident(ValueAccessor)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(Node) ident(parseFile)operator(()type(InputStream) ident(in)operator(,) type(String) ident(file)operator(,) ident(DynamicScope) ident(scope)operator(\)) operator({) + keyword(return) ident(parser)operator(.)ident(parse)operator(()ident(file)operator(,) ident(in)operator(,) ident(scope)operator(,) keyword(new) ident(ParserConfiguration)operator(()integer(0)operator(,) keyword(false)operator(,) keyword(false)operator(,) keyword(true)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(Node) ident(parseInline)operator(()type(InputStream) ident(in)operator(,) type(String) ident(file)operator(,) ident(DynamicScope) ident(scope)operator(\)) operator({) + keyword(return) ident(parser)operator(.)ident(parse)operator(()ident(file)operator(,) ident(in)operator(,) ident(scope)operator(,) keyword(new) ident(ParserConfiguration)operator(()integer(0)operator(,) keyword(false)operator(,) keyword(true)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(Node) ident(parseEval)operator(()type(String) ident(content)operator(,) type(String) ident(file)operator(,) ident(DynamicScope) ident(scope)operator(,) type(int) ident(lineNumber)operator(\)) operator({) + type(byte)type([]) ident(bytes)operator(;) + + keyword(try) operator({) + ident(bytes) operator(=) ident(content)operator(.)ident(getBytes)operator(()ident(KCode)operator(.)ident(NONE)operator(.)ident(getKCode)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(UnsupportedEncodingException) ident(e)operator(\)) operator({) + ident(bytes) operator(=) ident(content)operator(.)ident(getBytes)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(parser)operator(.)ident(parse)operator(()ident(file)operator(,) keyword(new) type(ByteArrayInputStream)operator(()ident(bytes)operator(\))operator(,) ident(scope)operator(,) + keyword(new) ident(ParserConfiguration)operator(()ident(lineNumber)operator(,) keyword(false)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(Node) ident(parse)operator(()type(String) ident(content)operator(,) type(String) ident(file)operator(,) ident(DynamicScope) ident(scope)operator(,) type(int) ident(lineNumber)operator(,) + type(boolean) ident(extraPositionInformation)operator(\)) operator({) + type(byte)type([]) ident(bytes)operator(;) + + keyword(try) operator({) + ident(bytes) operator(=) ident(content)operator(.)ident(getBytes)operator(()ident(KCode)operator(.)ident(NONE)operator(.)ident(getKCode)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(UnsupportedEncodingException) ident(e)operator(\)) operator({) + ident(bytes) operator(=) ident(content)operator(.)ident(getBytes)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(parser)operator(.)ident(parse)operator(()ident(file)operator(,) keyword(new) type(ByteArrayInputStream)operator(()ident(bytes)operator(\))operator(,) ident(scope)operator(,) + keyword(new) ident(ParserConfiguration)operator(()ident(lineNumber)operator(,) ident(extraPositionInformation)operator(,) keyword(false)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(Node) ident(parseEval)operator(()ident(ByteList) ident(content)operator(,) type(String) ident(file)operator(,) ident(DynamicScope) ident(scope)operator(,) type(int) ident(lineNumber)operator(\)) operator({) + keyword(return) ident(parser)operator(.)ident(parse)operator(()ident(file)operator(,) ident(content)operator(,) ident(scope)operator(,) keyword(new) ident(ParserConfiguration)operator(()ident(lineNumber)operator(,) keyword(false)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(Node) ident(parse)operator(()ident(ByteList) ident(content)operator(,) type(String) ident(file)operator(,) ident(DynamicScope) ident(scope)operator(,) type(int) ident(lineNumber)operator(,) + type(boolean) ident(extraPositionInformation)operator(\)) operator({) + keyword(return) ident(parser)operator(.)ident(parse)operator(()ident(file)operator(,) ident(content)operator(,) ident(scope)operator(,) + keyword(new) ident(ParserConfiguration)operator(()ident(lineNumber)operator(,) ident(extraPositionInformation)operator(,) keyword(false)operator(\))operator(\))operator(;) + operator(}) + + + directive(public) ident(ThreadService) ident(getThreadService)operator(()operator(\)) operator({) + keyword(return) ident(threadService)operator(;) + operator(}) + + directive(public) ident(ThreadContext) ident(getCurrentContext)operator(()operator(\)) operator({) + keyword(return) ident(threadService)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Returns the loadService. + * @return ILoadService + */) + directive(public) ident(LoadService) ident(getLoadService)operator(()operator(\)) operator({) + keyword(return) ident(loadService)operator(;) + operator(}) + + directive(public) ident(RubyWarnings) ident(getWarnings)operator(()operator(\)) operator({) + keyword(return) ident(warnings)operator(;) + operator(}) + + directive(public) type(PrintStream) ident(getErrorStream)operator(()operator(\)) operator({) + comment(// FIXME: We can't guarantee this will always be a RubyIO...so the old code here is not safe) + comment(/*java.io.OutputStream os = ((RubyIO\) getGlobalVariables(\).get("$stderr"\)\).getOutStream(\); + if(null != os\) { + return new PrintStream(os\); + } else { + return new PrintStream(new org.jruby.util.SwallowingOutputStream(\)\); + }*/) + keyword(return) keyword(new) type(PrintStream)operator(()keyword(new) ident(IOOutputStream)operator(()ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stderr)delimiter(")>operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(InputStream) ident(getInputStream)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(IOInputStream)operator(()ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stdin)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(PrintStream) ident(getOutputStream)operator(()operator(\)) operator({) + keyword(return) keyword(new) type(PrintStream)operator(()keyword(new) ident(IOOutputStream)operator(()ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stdout)delimiter(")>operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getClassFromPath)operator(()type(String) ident(path)operator(\)) operator({) + ident(RubyModule) ident(c) operator(=) ident(getObject)operator(()operator(\))operator(;) + keyword(if) operator(()ident(path)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0) operator(||) ident(path)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(#)delimiter(')>operator(\)) operator({) + keyword(throw) ident(newTypeError)operator(()string<delimiter(")content(can't retrieve anonymous class )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + type(int) ident(pbeg) operator(=) integer(0)operator(,) ident(p) operator(=) integer(0)operator(;) + keyword(for)operator(()type(int) ident(l)operator(=)ident(path)operator(.)ident(length)operator(()operator(\))operator(;) ident(p)operator(<)ident(l)operator(;) operator(\)) operator({) + keyword(while)operator(()ident(p)operator(<)ident(l) operator(&&) ident(path)operator(.)ident(charAt)operator(()ident(p)operator(\)) operator(!=) string<delimiter(')content(:)delimiter(')>operator(\)) operator({) + ident(p)operator(++)operator(;) + operator(}) + type(String) ident(str) operator(=) ident(path)operator(.)ident(substring)operator(()ident(pbeg)operator(,) ident(p)operator(\))operator(;) + + keyword(if)operator(()ident(p)operator(<)ident(l) operator(&&) ident(path)operator(.)ident(charAt)operator(()ident(p)operator(\)) operator(==) string<delimiter(')content(:)delimiter(')>operator(\)) operator({) + keyword(if)operator(()ident(p)operator(+)integer(1) operator(<) ident(l) operator(&&) ident(path)operator(.)ident(charAt)operator(()ident(p)operator(+)integer(1)operator(\)) operator(!=) string<delimiter(')content(:)delimiter(')>operator(\)) operator({) + keyword(throw) ident(newTypeError)operator(()string<delimiter(")content(undefined class/module )delimiter(")> operator(+) ident(path)operator(.)ident(substring)operator(()ident(pbeg)operator(,)ident(p)operator(\))operator(\))operator(;) + operator(}) + ident(p) operator(+=) integer(2)operator(;) + ident(pbeg) operator(=) ident(p)operator(;) + operator(}) + + ident(IRubyObject) ident(cc) operator(=) ident(c)operator(.)ident(getConstant)operator(()ident(str)operator(\))operator(;) + keyword(if)operator(()operator(!)operator(()ident(cc) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) operator({) + keyword(throw) ident(newTypeError)operator(()string<delimiter(")delimiter(")> operator(+) ident(path) operator(+) string<delimiter(")content( does not refer to class/module)delimiter(")>operator(\))operator(;) + operator(}) + ident(c) operator(=) operator(()ident(RubyModule)operator(\))ident(cc)operator(;) + operator(}) + keyword(return) ident(c)operator(;) + operator(}) + + comment(/** Prints an error with backtrace to the error stream. + * + * MRI: eval.c - error_print(\) + * + */) + directive(public) type(void) ident(printError)operator(()ident(RubyException) ident(excp)operator(\)) operator({) + keyword(if) operator(()ident(excp) operator(==) keyword(null) operator(||) ident(excp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return)operator(;) + operator(}) + + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(backtrace) operator(=) ident(excp)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(backtrace)delimiter(")>operator(\))operator(;) + + type(PrintStream) ident(errorStream) operator(=) ident(getErrorStream)operator(()operator(\))operator(;) + keyword(if) operator(()ident(backtrace)operator(.)ident(isNil)operator(()operator(\)) operator(||) operator(!)operator(()ident(backtrace) keyword(instanceof) ident(RubyArray)operator(\))operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getFile)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(errorStream)operator(.)ident(print)operator(()ident(context)operator(.)ident(getFile)operator(()operator(\)) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(context)operator(.)ident(getLine)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(errorStream)operator(.)ident(print)operator(()ident(context)operator(.)ident(getLine)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()operator(()operator(()ident(RubyArray)operator(\)) ident(backtrace)operator(\))operator(.)ident(getLength)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(printErrorPos)operator(()ident(context)operator(,) ident(errorStream)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(mesg) operator(=) operator(()operator(()ident(RubyArray)operator(\)) ident(backtrace)operator(\))operator(.)ident(first)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(mesg)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(printErrorPos)operator(()ident(context)operator(,) ident(errorStream)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(errorStream)operator(.)ident(print)operator(()ident(mesg)operator(\))operator(;) + operator(}) + operator(}) + + ident(RubyClass) ident(type) operator(=) ident(excp)operator(.)ident(getMetaClass)operator(()operator(\))operator(;) + type(String) ident(info) operator(=) ident(excp)operator(.)ident(toString)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(type) operator(==) ident(getRuntimeError)operator(()operator(\)) operator(&&) operator(()ident(info) operator(==) keyword(null) operator(||) ident(info)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\))operator(\)) operator({) + ident(errorStream)operator(.)ident(print)operator(()string<delimiter(")content(: unhandled exception)char(\\n)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + type(String) ident(path) operator(=) ident(type)operator(.)ident(getName)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(info)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(errorStream)operator(.)ident(print)operator(()string<delimiter(")content(: )delimiter(")> operator(+) ident(path) operator(+) string<delimiter(')content(\\n)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(path)operator(.)ident(startsWith)operator(()string<delimiter(")content(#)delimiter(")>operator(\))operator(\)) operator({) + ident(path) operator(=) keyword(null)operator(;) + operator(}) + + type(String) ident(tail) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(info)operator(.)ident(indexOf)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(tail) operator(=) ident(info)operator(.)ident(substring)operator(()ident(info)operator(.)ident(indexOf)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) operator(+) integer(1)operator(\))operator(;) + ident(info) operator(=) ident(info)operator(.)ident(substring)operator(()integer(0)operator(,) ident(info)operator(.)ident(indexOf)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + ident(errorStream)operator(.)ident(print)operator(()string<delimiter(")content(: )delimiter(")> operator(+) ident(info)operator(\))operator(;) + + keyword(if) operator(()ident(path) operator(!=) keyword(null)operator(\)) operator({) + ident(errorStream)operator(.)ident(print)operator(()string<delimiter(")content( ()delimiter(")> operator(+) ident(path) operator(+) string<delimiter(")content(\))char(\\n)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(tail) operator(!=) keyword(null)operator(\)) operator({) + ident(errorStream)operator(.)ident(print)operator(()ident(tail) operator(+) string<delimiter(')content(\\n)delimiter(')>operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + ident(excp)operator(.)ident(printBacktrace)operator(()ident(errorStream)operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(printErrorPos)operator(()ident(ThreadContext) ident(context)operator(,) type(PrintStream) ident(errorStream)operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getFile)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getFrameName)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(errorStream)operator(.)ident(print)operator(()ident(context)operator(.)ident(getFile)operator(()operator(\)) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(context)operator(.)ident(getLine)operator(()operator(\))operator(\))operator(;) + ident(errorStream)operator(.)ident(print)operator(()string<delimiter(")content(:in ')delimiter(")> operator(+) ident(context)operator(.)ident(getFrameName)operator(()operator(\)) operator(+) string<delimiter(')char(\\')delimiter(')>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(context)operator(.)ident(getLine)operator(()operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(errorStream)operator(.)ident(print)operator(()ident(context)operator(.)ident(getFile)operator(()operator(\)) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(context)operator(.)ident(getLine)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(errorStream)operator(.)ident(print)operator(()ident(context)operator(.)ident(getFile)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + directive(public) type(void) ident(loadFile)operator(()type(String) ident(scriptName)operator(,) type(InputStream) ident(in)operator(,) type(boolean) ident(wrap)operator(\)) operator({) + ident(IRubyObject) ident(self) operator(=) ident(wrap) operator(?) ident(TopSelfFactory)operator(.)ident(createTopSelf)operator(()local_variable(this)operator(\)) operator(:) ident(getTopSelf)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + type(String) ident(file) operator(=) ident(context)operator(.)ident(getFile)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(secure)operator(()integer(4)operator(\))operator(;) comment(/* should alter global state */) + + ident(context)operator(.)ident(setFile)operator(()ident(scriptName)operator(\))operator(;) + ident(context)operator(.)ident(preNodeEval)operator(()ident(objectClass)operator(,) ident(self)operator(,) ident(scriptName)operator(\))operator(;) + + ident(parseFile)operator(()ident(in)operator(,) ident(scriptName)operator(,) keyword(null)operator(\))operator(.)ident(interpret)operator(()local_variable(this)operator(,) ident(context)operator(,) ident(self)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(return)operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(postNodeEval)operator(()operator(\))operator(;) + ident(context)operator(.)ident(setFile)operator(()ident(file)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(compileAndLoadFile)operator(()type(String) ident(filename)operator(,) type(InputStream) ident(in)operator(,) type(boolean) ident(wrap)operator(\)) operator({) + ident(IRubyObject) ident(self) operator(=) ident(wrap) operator(?) ident(TopSelfFactory)operator(.)ident(createTopSelf)operator(()local_variable(this)operator(\)) operator(:) ident(getTopSelf)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + type(String) ident(file) operator(=) ident(context)operator(.)ident(getFile)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(secure)operator(()integer(4)operator(\))operator(;) comment(/* should alter global state */) + + ident(context)operator(.)ident(setFile)operator(()ident(filename)operator(\))operator(;) + ident(context)operator(.)ident(preNodeEval)operator(()ident(objectClass)operator(,) ident(self)operator(,) ident(filename)operator(\))operator(;) + + ident(Node) ident(scriptNode) operator(=) ident(parseFile)operator(()ident(in)operator(,) ident(filename)operator(,) keyword(null)operator(\))operator(;) + + ident(Script) ident(script) operator(=) ident(tryCompile)operator(()ident(scriptNode)operator(,) keyword(new) ident(JRubyClassLoader)operator(()ident(jrubyClassLoader)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(script) operator(==) keyword(null)operator(\)) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Error, could not compile; pass -J-Djruby.jit.logging.verbose=true for more details)delimiter(")>operator(\))operator(;) + operator(}) + + ident(runScript)operator(()ident(script)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(return)operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(postNodeEval)operator(()operator(\))operator(;) + ident(context)operator(.)ident(setFile)operator(()ident(file)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(loadScript)operator(()ident(Script) ident(script)operator(\)) operator({) + ident(IRubyObject) ident(self) operator(=) ident(getTopSelf)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(getCurrentContext)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(secure)operator(()integer(4)operator(\))operator(;) comment(/* should alter global state */) + + ident(context)operator(.)ident(preNodeEval)operator(()ident(objectClass)operator(,) ident(self)operator(\))operator(;) + + ident(script)operator(.)ident(load)operator(()ident(context)operator(,) ident(self)operator(,) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(return)operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(postNodeEval)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(class) class(CallTraceFuncHook) directive(extends) ident(EventHook) operator({) + directive(private) ident(RubyProc) ident(traceFunc)operator(;) + + directive(public) type(void) ident(setTraceFunc)operator(()ident(RubyProc) ident(traceFunc)operator(\)) operator({) + local_variable(this)operator(.)ident(traceFunc) operator(=) ident(traceFunc)operator(;) + operator(}) + + directive(public) type(void) ident(eventHandler)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(eventName)operator(,) type(String) ident(file)operator(,) type(int) ident(line)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(type)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(context)operator(.)ident(isWithinTrace)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(file) operator(==) keyword(null)operator(\)) ident(file) operator(=) string<delimiter(")content((ruby\))delimiter(")>operator(;) + keyword(if) operator(()ident(type) operator(==) keyword(null)operator(\)) ident(type) operator(=) ident(getFalse)operator(()operator(\))operator(;) + + ident(RubyBinding) ident(binding) operator(=) ident(RubyBinding)operator(.)ident(newBinding)operator(()ident(Ruby)operator(.)ident(this)operator(\))operator(;) + + ident(context)operator(.)ident(preTrace)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(traceFunc)operator(.)ident(call)operator(()ident(context)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) + ident(newString)operator(()ident(eventName)operator(\))operator(,) comment(// event name) + ident(newString)operator(()ident(file)operator(\))operator(,) comment(// filename) + ident(newFixnum)operator(()ident(line)operator(\))operator(,) comment(// line numbers should be 1-based) + ident(name) operator(!=) keyword(null) operator(?) ident(newSymbol)operator(()ident(name)operator(\)) operator(:) ident(getNil)operator(()operator(\))operator(,) + ident(binding)operator(,) + ident(type) + operator(})operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(postTrace)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + directive(public) type(boolean) ident(isInterestedInEvent)operator(()ident(RubyEvent) ident(event)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(final) ident(CallTraceFuncHook) ident(callTraceFuncHook) operator(=) keyword(new) ident(CallTraceFuncHook)operator(()operator(\))operator(;) + + directive(public) type(void) ident(addEventHook)operator(()ident(EventHook) ident(hook)operator(\)) operator({) + ident(eventHooks)operator(.)ident(add)operator(()ident(hook)operator(\))operator(;) + ident(hasEventHooks) operator(=) keyword(true)operator(;) + operator(}) + + directive(public) type(void) ident(removeEventHook)operator(()ident(EventHook) ident(hook)operator(\)) operator({) + ident(eventHooks)operator(.)ident(remove)operator(()ident(hook)operator(\))operator(;) + ident(hasEventHooks) operator(=) operator(!)ident(eventHooks)operator(.)ident(isEmpty)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(setTraceFunction)operator(()ident(RubyProc) ident(traceFunction)operator(\)) operator({) + ident(removeEventHook)operator(()ident(callTraceFuncHook)operator(\))operator(;) + + keyword(if) operator(()ident(traceFunction) operator(==) keyword(null)operator(\)) operator({) + keyword(return)operator(;) + operator(}) + + ident(callTraceFuncHook)operator(.)ident(setTraceFunc)operator(()ident(traceFunction)operator(\))operator(;) + ident(addEventHook)operator(()ident(callTraceFuncHook)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(callEventHooks)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyEvent) ident(event)operator(,) type(String) ident(file)operator(,) type(int) ident(line)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(type)operator(\)) operator({) + keyword(for) operator(()ident(EventHook) ident(eventHook) operator(:) ident(eventHooks)operator(\)) operator({) + keyword(if) operator(()ident(eventHook)operator(.)ident(isInterestedInEvent)operator(()ident(event)operator(\))operator(\)) operator({) + ident(eventHook)operator(.)ident(event)operator(()ident(context)operator(,) ident(event)operator(,) ident(file)operator(,) ident(line)operator(,) ident(name)operator(,) ident(type)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + directive(public) type(boolean) ident(hasEventHooks)operator(()operator(\)) operator({) + keyword(return) ident(hasEventHooks)operator(;) + operator(}) + + directive(public) ident(GlobalVariables) ident(getGlobalVariables)operator(()operator(\)) operator({) + keyword(return) ident(globalVariables)operator(;) + operator(}) + + comment(// For JSR 223 support: see http://scripting.java.net/) + directive(public) type(void) ident(setGlobalVariables)operator(()ident(GlobalVariables) ident(globalVariables)operator(\)) operator({) + local_variable(this)operator(.)ident(globalVariables) operator(=) ident(globalVariables)operator(;) + operator(}) + + directive(public) ident(CallbackFactory) ident(callbackFactory)operator(()type(Class)operator(<)operator(?)operator(>) ident(type)operator(\)) operator({) + keyword(return) ident(CallbackFactory)operator(.)ident(createFactory)operator(()local_variable(this)operator(,) ident(type)operator(\))operator(;) + operator(}) + + comment(/** + * Push block onto exit stack. When runtime environment exits + * these blocks will be evaluated. + * + * @return the element that was pushed onto stack + */) + directive(public) ident(IRubyObject) ident(pushExitBlock)operator(()ident(RubyProc) ident(proc)operator(\)) operator({) + ident(atExitBlocks)operator(.)ident(push)operator(()ident(proc)operator(\))operator(;) + keyword(return) ident(proc)operator(;) + operator(}) + + comment(// use this for JRuby-internal finalizers) + directive(public) type(void) ident(addInternalFinalizer)operator(()ident(Finalizable) ident(finalizer)operator(\)) operator({) + directive(synchronized) operator(()ident(internalFinalizersMutex)operator(\)) operator({) + keyword(if) operator(()ident(internalFinalizers) operator(==) keyword(null)operator(\)) operator({) + ident(internalFinalizers) operator(=) keyword(new) type(WeakHashMap)operator(<)ident(Finalizable)operator(,) type(Object)operator(>)operator(()operator(\))operator(;) + operator(}) + ident(internalFinalizers)operator(.)ident(put)operator(()ident(finalizer)operator(,) keyword(null)operator(\))operator(;) + operator(}) + operator(}) + + comment(// this method is for finalizers registered via ObjectSpace) + directive(public) type(void) ident(addFinalizer)operator(()ident(Finalizable) ident(finalizer)operator(\)) operator({) + directive(synchronized) operator(()ident(finalizersMutex)operator(\)) operator({) + keyword(if) operator(()ident(finalizers) operator(==) keyword(null)operator(\)) operator({) + ident(finalizers) operator(=) keyword(new) type(WeakHashMap)operator(<)ident(Finalizable)operator(,) type(Object)operator(>)operator(()operator(\))operator(;) + operator(}) + ident(finalizers)operator(.)ident(put)operator(()ident(finalizer)operator(,) keyword(null)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(removeInternalFinalizer)operator(()ident(Finalizable) ident(finalizer)operator(\)) operator({) + directive(synchronized) operator(()ident(internalFinalizersMutex)operator(\)) operator({) + keyword(if) operator(()ident(internalFinalizers) operator(!=) keyword(null)operator(\)) operator({) + ident(internalFinalizers)operator(.)ident(remove)operator(()ident(finalizer)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + directive(public) type(void) ident(removeFinalizer)operator(()ident(Finalizable) ident(finalizer)operator(\)) operator({) + directive(synchronized) operator(()ident(finalizersMutex)operator(\)) operator({) + keyword(if) operator(()ident(finalizers) operator(!=) keyword(null)operator(\)) operator({) + ident(finalizers)operator(.)ident(remove)operator(()ident(finalizer)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** + * Make sure Kernel#at_exit procs get invoked on runtime shutdown. + * This method needs to be explicitly called to work properly. + * I thought about using finalize(\), but that did not work and I + * am not sure the runtime will be at a state to run procs by the + * time Ruby is going away. This method can contain any other + * things that need to be cleaned up at shutdown. + */) + directive(public) type(void) ident(tearDown)operator(()operator(\)) operator({) + type(int) ident(status) operator(=) integer(0)operator(;) + + keyword(while) operator(()operator(!)ident(atExitBlocks)operator(.)ident(empty)operator(()operator(\))operator(\)) operator({) + ident(RubyProc) ident(proc) operator(=) ident(atExitBlocks)operator(.)ident(pop)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(proc)operator(.)ident(call)operator(()ident(getCurrentContext)operator(()operator(\))operator(,) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(rj)operator(\)) operator({) + ident(RubyException) ident(raisedException) operator(=) ident(rj)operator(.)ident(getException)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(getSystemExit)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(raisedException)operator(\))operator(\)) operator({) + ident(status) operator(=) integer(1)operator(;) + ident(printError)operator(()ident(raisedException)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(statusObj) operator(=) ident(raisedException)operator(.)ident(callMethod)operator(() + ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(status)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(statusObj) operator(!=) keyword(null) operator(&&) operator(!)ident(statusObj)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(status) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(statusObj)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + + keyword(if) operator(()ident(finalizers) operator(!=) keyword(null)operator(\)) operator({) + directive(synchronized) operator(()ident(finalizers)operator(\)) operator({) + keyword(for) operator(()type(Iterator)operator(<)ident(Finalizable)operator(>) ident(finalIter) operator(=) keyword(new) type(ArrayList)operator(<)ident(Finalizable)operator(>)operator(()ident(finalizers)operator(.)ident(keySet)operator(()operator(\))operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(finalIter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(finalIter)operator(.)ident(next)operator(()operator(\))operator(.)ident(finalize)operator(()operator(\))operator(;) + ident(finalIter)operator(.)ident(remove)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + directive(synchronized) operator(()ident(internalFinalizersMutex)operator(\)) operator({) + keyword(if) operator(()ident(internalFinalizers) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()type(Iterator)operator(<)ident(Finalizable)operator(>) ident(finalIter) operator(=) keyword(new) type(ArrayList)operator(<)ident(Finalizable)operator(>)operator(() + ident(internalFinalizers)operator(.)ident(keySet)operator(()operator(\))operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(finalIter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(finalIter)operator(.)ident(next)operator(()operator(\))operator(.)ident(finalize)operator(()operator(\))operator(;) + ident(finalIter)operator(.)ident(remove)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + ident(getThreadService)operator(()operator(\))operator(.)ident(disposeCurrentThread)operator(()operator(\))operator(;) + + ident(getBeanManager)operator(()operator(\))operator(.)ident(unregisterCompiler)operator(()operator(\))operator(;) + ident(getBeanManager)operator(()operator(\))operator(.)ident(unregisterConfig)operator(()operator(\))operator(;) + ident(getBeanManager)operator(()operator(\))operator(.)ident(unregisterClassCache)operator(()operator(\))operator(;) + ident(getBeanManager)operator(()operator(\))operator(.)ident(unregisterMethodCache)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(status) operator(!=) integer(0)operator(\)) operator({) + keyword(throw) ident(newSystemExit)operator(()ident(status)operator(\))operator(;) + operator(}) + operator(}) + + comment(// new factory methods ------------------------------------------------------------------------) + + directive(public) ident(RubyArray) ident(newEmptyArray)operator(()operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newEmptyArray)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArray)operator(()operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArrayLight)operator(()operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArrayLight)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArray)operator(()ident(IRubyObject) ident(object)operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()local_variable(this)operator(,) ident(object)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArray)operator(()ident(IRubyObject) ident(car)operator(,) ident(IRubyObject) ident(cdr)operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()local_variable(this)operator(,) ident(car)operator(,) ident(cdr)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArray)operator(()ident(IRubyObject)type([]) ident(objects)operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()local_variable(this)operator(,) ident(objects)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArrayNoCopy)operator(()ident(IRubyObject)type([]) ident(objects)operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArrayNoCopy)operator(()local_variable(this)operator(,) ident(objects)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArrayNoCopyLight)operator(()ident(IRubyObject)type([]) ident(objects)operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArrayNoCopyLight)operator(()local_variable(this)operator(,) ident(objects)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArray)operator(()type(List)operator(<)ident(IRubyObject)operator(>) ident(list)operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()local_variable(this)operator(,) ident(list)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(newArray)operator(()type(int) ident(size)operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()local_variable(this)operator(,) ident(size)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyBoolean) ident(newBoolean)operator(()type(boolean) ident(value)operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()local_variable(this)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFileStat) ident(newFileStat)operator(()type(String) ident(filename)operator(,) type(boolean) ident(lstat)operator(\)) operator({) + keyword(return) ident(RubyFileStat)operator(.)ident(newFileStat)operator(()local_variable(this)operator(,) ident(filename)operator(,) ident(lstat)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFileStat) ident(newFileStat)operator(()type(FileDescriptor) ident(descriptor)operator(\)) operator({) + keyword(return) ident(RubyFileStat)operator(.)ident(newFileStat)operator(()local_variable(this)operator(,) ident(descriptor)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFixnum) ident(newFixnum)operator(()type(long) ident(value)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()local_variable(this)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFixnum) ident(newFixnum)operator(()type(int) ident(value)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()local_variable(this)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFloat) ident(newFloat)operator(()type(double) ident(value)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()local_variable(this)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyNumeric) ident(newNumeric)operator(()operator(\)) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(newNumeric)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyProc) ident(newProc)operator(()ident(Block)operator(.)ident(Type) ident(type)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(type) operator(!=) ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA) operator(&&) ident(block)operator(.)ident(getProcObject)operator(()operator(\)) operator(!=) keyword(null)operator(\)) keyword(return) ident(block)operator(.)ident(getProcObject)operator(()operator(\))operator(;) + + ident(RubyProc) ident(proc) operator(=) ident(RubyProc)operator(.)ident(newProc)operator(()local_variable(this)operator(,) ident(type)operator(\))operator(;) + + ident(proc)operator(.)ident(callInit)operator(()ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(,) ident(block)operator(\))operator(;) + + keyword(return) ident(proc)operator(;) + operator(}) + + directive(public) ident(RubyProc) ident(newBlockPassProc)operator(()ident(Block)operator(.)ident(Type) ident(type)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(type) operator(!=) ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA) operator(&&) ident(block)operator(.)ident(getProcObject)operator(()operator(\)) operator(!=) keyword(null)operator(\)) keyword(return) ident(block)operator(.)ident(getProcObject)operator(()operator(\))operator(;) + + ident(RubyProc) ident(proc) operator(=) ident(RubyProc)operator(.)ident(newProc)operator(()local_variable(this)operator(,) ident(type)operator(\))operator(;) + ident(proc)operator(.)ident(initialize)operator(()ident(getCurrentContext)operator(()operator(\))operator(,) ident(block)operator(\))operator(;) + + keyword(return) ident(proc)operator(;) + operator(}) + + directive(public) ident(RubyBinding) ident(newBinding)operator(()operator(\)) operator({) + keyword(return) ident(RubyBinding)operator(.)ident(newBinding)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyBinding) ident(newBinding)operator(()type(Binding) ident(binding)operator(\)) operator({) + keyword(return) ident(RubyBinding)operator(.)ident(newBinding)operator(()local_variable(this)operator(,) ident(binding)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyString) ident(newString)operator(()operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()local_variable(this)operator(,) keyword(new) ident(ByteList)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RubyString) ident(newString)operator(()type(String) ident(string)operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()local_variable(this)operator(,) ident(string)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyString) ident(newString)operator(()ident(ByteList) ident(byteList)operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()local_variable(this)operator(,) ident(byteList)operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) ident(RubyString) ident(newStringShared)operator(()ident(ByteList) ident(byteList)operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newStringShared)operator(()local_variable(this)operator(,) ident(byteList)operator(\))operator(;) + operator(}) + + directive(public) ident(RubySymbol) ident(newSymbol)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(symbolTable)operator(.)ident(getSymbol)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Faster than {@link #newSymbol(String\)} if you already have an interned + * name String. Don't intern your string just to call this version - the + * overhead of interning will more than wipe out any benefit from the faster + * lookup. + * + * @param internedName the symbol name, <em>must</em> be interned! if in + * doubt, call {@link #newSymbol(String\)} instead. + * @return the symbol for name + */) + directive(public) ident(RubySymbol) ident(fastNewSymbol)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + + keyword(return) ident(symbolTable)operator(.)ident(fastGetSymbol)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyTime) ident(newTime)operator(()type(long) ident(milliseconds)operator(\)) operator({) + keyword(return) ident(RubyTime)operator(.)ident(newTime)operator(()local_variable(this)operator(,) ident(milliseconds)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newRuntimeError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getRuntimeError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newArgumentError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getArgumentError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newArgumentError)operator(()type(int) ident(got)operator(,) type(int) ident(expected)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getArgumentError)operator(()operator(\))operator(,) string<delimiter(")content(wrong # of arguments()delimiter(")> operator(+) ident(got) operator(+) string<delimiter(")content( for )delimiter(")> operator(+) ident(expected) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEBADFError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EBADF)delimiter(")>operator(\))operator(,) string<delimiter(")content(Bad file descriptor)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoENOPROTOOPTError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ENOPROTOOPT)delimiter(")>operator(\))operator(,) string<delimiter(")content(Protocol not available)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEPIPEError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EPIPE)delimiter(")>operator(\))operator(,) string<delimiter(")content(Broken pipe)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoECONNREFUSEDError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ECONNREFUSED)delimiter(")>operator(\))operator(,) string<delimiter(")content(Connection refused)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoECONNRESETError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ECONNRESET)delimiter(")>operator(\))operator(,) string<delimiter(")content(Connection reset by peer)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEADDRINUSEError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EADDRINUSE)delimiter(")>operator(\))operator(,) string<delimiter(")content(Address in use)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEINVALError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EINVAL)delimiter(")>operator(\))operator(,) string<delimiter(")content(Invalid file)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoENOENTError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ENOENT)delimiter(")>operator(\))operator(,) string<delimiter(")content(File not found)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEACCESError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EACCES)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEAGAINError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EAGAIN)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEISDirError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EISDIR)delimiter(")>operator(\))operator(,) string<delimiter(")content(Is a directory)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoESPIPEError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ESPIPE)delimiter(")>operator(\))operator(,) string<delimiter(")content(Illegal seek)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEBADFError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EBADF)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEINVALError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EINVAL)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoENOTDIRError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ENOTDIR)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoENOTSOCKError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ENOTSOCK)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoENOENTError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ENOENT)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoESPIPEError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ESPIPE)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEEXISTError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EEXIST)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoEDOMError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(EDOM)delimiter(")>operator(\))operator(,) string<delimiter(")content(Domain error - )delimiter(")> operator(+) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newErrnoECHILDError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getErrno)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(ECHILD)delimiter(")>operator(\))operator(,) string<delimiter(")content(No child processes)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newIndexError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getIndexError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newSecurityError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getSecurityError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newSystemCallError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getSystemCallError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newTypeError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getTypeError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newThreadError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getThreadError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newConcurrencyError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getConcurrencyError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newSyntaxError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getSyntaxError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newRegexpError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getRegexpError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newRangeError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getRangeError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newNotImplementedError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getNotImplementedError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newInvalidEncoding)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(fastGetClass)operator(()string<delimiter(")content(Iconv)delimiter(")>operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(InvalidEncoding)delimiter(")>operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newNoMethodError)operator(()type(String) ident(message)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(args)operator(\)) operator({) + keyword(return) keyword(new) ident(RaiseException)operator(()keyword(new) ident(RubyNoMethodError)operator(()local_variable(this)operator(,) ident(getNoMethodError)operator(()operator(\))operator(,) ident(message)operator(,) ident(name)operator(,) ident(args)operator(\))operator(,) keyword(true)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newNameError)operator(()type(String) ident(message)operator(,) type(String) ident(name)operator(\)) operator({) + keyword(return) ident(newNameError)operator(()ident(message)operator(,) ident(name)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newNameError)operator(()type(String) ident(message)operator(,) type(String) ident(name)operator(,) type(Throwable) ident(origException)operator(\)) operator({) + keyword(return) ident(newNameError)operator(()ident(message)operator(,) ident(name)operator(,) ident(origException)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newNameError)operator(()type(String) ident(message)operator(,) type(String) ident(name)operator(,) type(Throwable) ident(origException)operator(,) type(boolean) ident(printWhenVerbose)operator(\)) operator({) + keyword(if) operator(()ident(printWhenVerbose) operator(&&) ident(origException) operator(!=) keyword(null) operator(&&) local_variable(this)operator(.)ident(getVerbose)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(origException)operator(.)ident(printStackTrace)operator(()ident(getErrorStream)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) keyword(new) ident(RaiseException)operator(()keyword(new) ident(RubyNameError)operator(() + local_variable(this)operator(,) ident(getNameError)operator(()operator(\))operator(,) ident(message)operator(,) ident(name)operator(\))operator(,) keyword(true)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newLocalJumpError)operator(()type(String) ident(reason)operator(,) ident(IRubyObject) ident(exitValue)operator(,) type(String) ident(message)operator(\)) operator({) + keyword(return) keyword(new) ident(RaiseException)operator(()keyword(new) ident(RubyLocalJumpError)operator(()local_variable(this)operator(,) ident(getLocalJumpError)operator(()operator(\))operator(,) ident(message)operator(,) ident(reason)operator(,) ident(exitValue)operator(\))operator(,) keyword(true)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newRedoLocalJumpError)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(RaiseException)operator(()keyword(new) ident(RubyLocalJumpError)operator(()local_variable(this)operator(,) ident(getLocalJumpError)operator(()operator(\))operator(,) string<delimiter(")content(unexpected redo)delimiter(")>operator(,) string<delimiter(")content(redo)delimiter(")>operator(,) ident(getNil)operator(()operator(\))operator(\))operator(,) keyword(true)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newLoadError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getLoadError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newFrozenError)operator(()type(String) ident(objectType)operator(\)) operator({) + comment(// TODO: Should frozen error have its own distinct class? If not should more share?) + keyword(return) ident(newRaiseException)operator(()ident(getTypeError)operator(()operator(\))operator(,) string<delimiter(")content(can't modify frozen )delimiter(")> operator(+) ident(objectType)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newSystemStackError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getSystemStackError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newSystemExit)operator(()type(int) ident(status)operator(\)) operator({) + keyword(return) keyword(new) ident(RaiseException)operator(()ident(RubySystemExit)operator(.)ident(newInstance)operator(()local_variable(this)operator(,) ident(status)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newIOError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getIOError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newStandardError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getStandardError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newIOErrorFromException)operator(()type(IOException) ident(ioe)operator(\)) operator({) + comment(// TODO: this is kinda gross) + keyword(if)operator(()ident(ioe)operator(.)ident(getMessage)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(ioe)operator(.)ident(getMessage)operator(()operator(\))operator(.)ident(equals)operator(()string<delimiter(")content(Broken pipe)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(ioe)operator(.)ident(getMessage)operator(()operator(\))operator(.)ident(equals)operator(()string<delimiter(")content(Connection reset by peer)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(newErrnoECONNRESETError)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(newRaiseException)operator(()ident(getIOError)operator(()operator(\))operator(,) ident(ioe)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getIOError)operator(()operator(\))operator(,) string<delimiter(")content(IO Error)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(public) ident(RaiseException) ident(newTypeError)operator(()ident(IRubyObject) ident(receivedObject)operator(,) ident(RubyClass) ident(expectedType)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getTypeError)operator(()operator(\))operator(,) string<delimiter(")content(wrong argument type )delimiter(")> operator(+) + ident(receivedObject)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\)) operator(+) string<delimiter(")content( (expected )delimiter(")> operator(+) ident(expectedType) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newEOFError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getEOFError)operator(()operator(\))operator(,) string<delimiter(")content(End of file reached)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newEOFError)operator(()type(String) ident(message)operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getEOFError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newZeroDivisionError)operator(()operator(\)) operator({) + keyword(return) ident(newRaiseException)operator(()ident(getZeroDivisionError)operator(()operator(\))operator(,) string<delimiter(")content(divided by 0)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(RaiseException) ident(newFloatDomainError)operator(()type(String) ident(message)operator(\))operator({) + keyword(return) ident(newRaiseException)operator(()ident(getFloatDomainError)operator(()operator(\))operator(,) ident(message)operator(\))operator(;) + operator(}) + + comment(/** + * @param exceptionClass + * @param message + * @return + */) + directive(private) ident(RaiseException) ident(newRaiseException)operator(()ident(RubyClass) ident(exceptionClass)operator(,) type(String) ident(message)operator(\)) operator({) + ident(RaiseException) ident(re) operator(=) keyword(new) ident(RaiseException)operator(()local_variable(this)operator(,) ident(exceptionClass)operator(,) ident(message)operator(,) keyword(true)operator(\))operator(;) + keyword(return) ident(re)operator(;) + operator(}) + + + directive(public) ident(RubySymbol)operator(.)ident(SymbolTable) ident(getSymbolTable)operator(()operator(\)) operator({) + keyword(return) ident(symbolTable)operator(;) + operator(}) + + directive(public) type(void) ident(setStackTraces)operator(()type(int) ident(stackTraces)operator(\)) operator({) + local_variable(this)operator(.)ident(stackTraces) operator(=) ident(stackTraces)operator(;) + operator(}) + + directive(public) type(int) ident(getStackTraces)operator(()operator(\)) operator({) + keyword(return) ident(stackTraces)operator(;) + operator(}) + + directive(public) type(void) ident(setRandomSeed)operator(()type(long) ident(randomSeed)operator(\)) operator({) + local_variable(this)operator(.)ident(randomSeed) operator(=) ident(randomSeed)operator(;) + operator(}) + + directive(public) type(long) ident(getRandomSeed)operator(()operator(\)) operator({) + keyword(return) ident(randomSeed)operator(;) + operator(}) + + directive(public) type(Random) ident(getRandom)operator(()operator(\)) operator({) + keyword(return) ident(random)operator(;) + operator(}) + + directive(public) ident(ObjectSpace) ident(getObjectSpace)operator(()operator(\)) operator({) + keyword(return) ident(objectSpace)operator(;) + operator(}) + + directive(public) type(Map)operator(<)type(Integer)operator(,) type(WeakReference)operator(<)ident(ChannelDescriptor)operator(>)operator(>) ident(getDescriptors)operator(()operator(\)) operator({) + keyword(return) ident(descriptors)operator(;) + operator(}) + + directive(public) type(long) ident(incrementRandomSeedSequence)operator(()operator(\)) operator({) + keyword(return) ident(randomSeedSequence)operator(++)operator(;) + operator(}) + + directive(public) type(InputStream) ident(getIn)operator(()operator(\)) operator({) + keyword(return) ident(in)operator(;) + operator(}) + + directive(public) type(PrintStream) ident(getOut)operator(()operator(\)) operator({) + keyword(return) ident(out)operator(;) + operator(}) + + directive(public) type(PrintStream) ident(getErr)operator(()operator(\)) operator({) + keyword(return) ident(err)operator(;) + operator(}) + + directive(public) type(boolean) ident(isGlobalAbortOnExceptionEnabled)operator(()operator(\)) operator({) + keyword(return) ident(globalAbortOnExceptionEnabled)operator(;) + operator(}) + + directive(public) type(void) ident(setGlobalAbortOnExceptionEnabled)operator(()type(boolean) ident(enable)operator(\)) operator({) + ident(globalAbortOnExceptionEnabled) operator(=) ident(enable)operator(;) + operator(}) + + directive(public) type(boolean) ident(isDoNotReverseLookupEnabled)operator(()operator(\)) operator({) + keyword(return) ident(doNotReverseLookupEnabled)operator(;) + operator(}) + + directive(public) type(void) ident(setDoNotReverseLookupEnabled)operator(()type(boolean) ident(b)operator(\)) operator({) + ident(doNotReverseLookupEnabled) operator(=) ident(b)operator(;) + operator(}) + + directive(private) type(ThreadLocal)operator(<)type(Map)operator(<)type(Object)operator(,) type(Object)operator(>)operator(>) ident(inspect) operator(=) keyword(new) type(ThreadLocal)operator(<)type(Map)operator(<)type(Object)operator(,) type(Object)operator(>)operator(>)operator(()operator(\))operator(;) + directive(public) type(void) ident(registerInspecting)operator(()type(Object) ident(obj)operator(\)) operator({) + type(Map)operator(<)type(Object)operator(,) type(Object)operator(>) ident(val) operator(=) ident(inspect)operator(.)ident(get)operator(()operator(\))operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) ident(inspect)operator(.)ident(set)operator(()ident(val) operator(=) keyword(new) type(IdentityHashMap)operator(<)type(Object)operator(,) type(Object)operator(>)operator(()operator(\))operator(\))operator(;) + ident(val)operator(.)ident(put)operator(()ident(obj)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(isInspecting)operator(()type(Object) ident(obj)operator(\)) operator({) + type(Map)operator(<)type(Object)operator(,) type(Object)operator(>) ident(val) operator(=) ident(inspect)operator(.)ident(get)operator(()operator(\))operator(;) + keyword(return) ident(val) operator(==) keyword(null) operator(?) keyword(false) operator(:) ident(val)operator(.)ident(containsKey)operator(()ident(obj)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(unregisterInspecting)operator(()type(Object) ident(obj)operator(\)) operator({) + type(Map)operator(<)type(Object)operator(,) type(Object)operator(>) ident(val) operator(=) ident(inspect)operator(.)ident(get)operator(()operator(\))operator(;) + keyword(if) operator(()ident(val) operator(!=) keyword(null) operator(\)) ident(val)operator(.)ident(remove)operator(()ident(obj)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(isObjectSpaceEnabled)operator(()operator(\)) operator({) + keyword(return) ident(objectSpaceEnabled)operator(;) + operator(}) + + comment(// The method is intentionally not public, since it typically should) + comment(// not be used outside of the core.) + comment(/* package-private */) type(void) ident(setObjectSpaceEnabled)operator(()type(boolean) ident(objectSpaceEnabled)operator(\)) operator({) + local_variable(this)operator(.)ident(objectSpaceEnabled) operator(=) ident(objectSpaceEnabled)operator(;) + operator(}) + + directive(public) type(long) ident(getStartTime)operator(()operator(\)) operator({) + keyword(return) ident(startTime)operator(;) + operator(}) + + directive(public) ident(Profile) ident(getProfile)operator(()operator(\)) operator({) + keyword(return) ident(profile)operator(;) + operator(}) + + directive(public) type(String) ident(getJRubyHome)operator(()operator(\)) operator({) + keyword(return) ident(config)operator(.)ident(getJRubyHome)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(setJRubyHome)operator(()type(String) ident(home)operator(\)) operator({) + ident(config)operator(.)ident(setJRubyHome)operator(()ident(home)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyInstanceConfig) ident(getInstanceConfig)operator(()operator(\)) operator({) + keyword(return) ident(config)operator(;) + operator(}) + + comment(/** GET_VM_STATE_VERSION */) + directive(public) type(long) ident(getGlobalState)operator(()operator(\)) operator({) + directive(synchronized)operator(()local_variable(this)operator(\)) operator({) + keyword(return) ident(globalState)operator(;) + operator(}) + operator(}) + + comment(/** INC_VM_STATE_VERSION */) + directive(public) type(void) ident(incGlobalState)operator(()operator(\)) operator({) + directive(synchronized)operator(()local_variable(this)operator(\)) operator({) + ident(globalState) operator(=) operator(()ident(globalState)operator(+)integer(1)operator(\)) operator(&) hex(0x8fffffff)operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(boolean) ident(isSecurityRestricted)operator(()operator(\)) operator({) + keyword(return) ident(securityRestricted)operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(setSecurityRestricted)operator(()type(boolean) ident(restricted)operator(\)) operator({) + ident(securityRestricted) operator(=) ident(restricted)operator(;) + operator(}) + + directive(public) ident(POSIX) ident(getPosix)operator(()operator(\)) operator({) + keyword(return) ident(posix)operator(;) + operator(}) + + directive(public) type(void) ident(setRecordSeparatorVar)operator(()ident(GlobalVariable) ident(recordSeparatorVar)operator(\)) operator({) + local_variable(this)operator(.)ident(recordSeparatorVar) operator(=) ident(recordSeparatorVar)operator(;) + operator(}) + + directive(public) ident(GlobalVariable) ident(getRecordSeparatorVar)operator(()operator(\)) operator({) + keyword(return) ident(recordSeparatorVar)operator(;) + operator(}) + + directive(public) type(Set)operator(<)ident(Script)operator(>) ident(getJittedMethods)operator(()operator(\)) operator({) + keyword(return) ident(jittedMethods)operator(;) + operator(}) + + directive(public) type(ExecutorService) ident(getExecutor)operator(()operator(\)) operator({) + keyword(return) ident(executor)operator(;) + operator(}) + + directive(public) type(Map)operator(<)type(String)operator(,) ident(DateTimeZone)operator(>) ident(getLocalTimezoneCache)operator(()operator(\)) operator({) + keyword(return) ident(localTimeZoneCache)operator(;) + operator(}) + + directive(private) directive(final) ident(CacheMap) ident(cacheMap)operator(;) + directive(private) directive(final) ident(ThreadService) ident(threadService)operator(;) + directive(private) type(Hashtable)operator(<)type(Object)operator(,) type(Object)operator(>) ident(runtimeInformation)operator(;) + + directive(private) ident(POSIX) ident(posix)operator(;) + + directive(private) type(int) ident(stackTraces) operator(=) integer(0)operator(;) + + directive(private) ident(ObjectSpace) ident(objectSpace) operator(=) keyword(new) ident(ObjectSpace)operator(()operator(\))operator(;) + + directive(private) directive(final) ident(RubySymbol)operator(.)ident(SymbolTable) ident(symbolTable) operator(=) keyword(new) ident(RubySymbol)operator(.)ident(SymbolTable)operator(()local_variable(this)operator(\))operator(;) + directive(private) type(Map)operator(<)type(Integer)operator(,) type(WeakReference)operator(<)ident(ChannelDescriptor)operator(>)operator(>) ident(descriptors) operator(=) keyword(new) type(ConcurrentHashMap)operator(<)type(Integer)operator(,) type(WeakReference)operator(<)ident(ChannelDescriptor)operator(>)operator(>)operator(()operator(\))operator(;) + directive(private) type(long) ident(randomSeed) operator(=) integer(0)operator(;) + directive(private) type(long) ident(randomSeedSequence) operator(=) integer(0)operator(;) + directive(private) type(Random) ident(random) operator(=) keyword(new) type(Random)operator(()operator(\))operator(;) + + directive(private) type(List)operator(<)ident(EventHook)operator(>) ident(eventHooks) operator(=) keyword(new) type(Vector)operator(<)ident(EventHook)operator(>)operator(()operator(\))operator(;) + directive(private) type(boolean) ident(hasEventHooks)operator(;) + directive(private) type(boolean) ident(globalAbortOnExceptionEnabled) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(doNotReverseLookupEnabled) operator(=) keyword(false)operator(;) + directive(private) directive(volatile) type(boolean) ident(objectSpaceEnabled)operator(;) + + directive(private) directive(final) type(Set)operator(<)ident(Script)operator(>) ident(jittedMethods) operator(=) type(Collections)operator(.)ident(synchronizedSet)operator(()keyword(new) ident(WeakHashSet)operator(<)ident(Script)operator(>)operator(()operator(\))operator(\))operator(;) + + directive(private) directive(static) type(ThreadLocal)operator(<)ident(Ruby)operator(>) ident(currentRuntime) operator(=) keyword(new) type(ThreadLocal)operator(<)ident(Ruby)operator(>)operator(()operator(\))operator(;) + + directive(private) type(long) ident(globalState) operator(=) integer(1)operator(;) + + directive(private) type(int) ident(safeLevel) operator(=) operator(-)integer(1)operator(;) + + comment(// Default objects) + directive(private) ident(IRubyObject) ident(topSelf)operator(;) + directive(private) ident(RubyNil) ident(nilObject)operator(;) + directive(private) ident(RubyBoolean) ident(trueObject)operator(;) + directive(private) ident(RubyBoolean) ident(falseObject)operator(;) + directive(public) directive(final) ident(RubyFixnum)type([]) ident(fixnumCache) operator(=) keyword(new) ident(RubyFixnum)operator([)integer(256)operator(])operator(;) + + directive(private) ident(IRubyObject) ident(verbose)operator(;) + directive(private) ident(IRubyObject) ident(debug)operator(;) + + directive(private) ident(RubyThreadGroup) ident(defaultThreadGroup)operator(;) + + comment(/** + * All the core classes we keep hard references to. These are here largely + * so that if someone redefines String or Array we won't start blowing up + * creating strings and arrays internally. They also provide much faster + * access than going through normal hash lookup on the Object class. + */) + directive(private) ident(RubyClass) + ident(objectClass)operator(,) ident(moduleClass)operator(,) ident(classClass)operator(,) ident(nilClass)operator(,) ident(trueClass)operator(,) + ident(falseClass)operator(,) ident(numericClass)operator(,) ident(floatClass)operator(,) ident(integerClass)operator(,) ident(fixnumClass)operator(,) + ident(complexClass)operator(,) ident(rationalClass)operator(,) ident(enumeratorClass)operator(,) + ident(arrayClass)operator(,) ident(hashClass)operator(,) ident(rangeClass)operator(,) ident(stringClass)operator(,) ident(symbolClass)operator(,) + ident(procClass)operator(,) ident(bindingClass)operator(,) ident(methodClass)operator(,) ident(unboundMethodClass)operator(,) + ident(matchDataClass)operator(,) ident(regexpClass)operator(,) ident(timeClass)operator(,) ident(bignumClass)operator(,) ident(dirClass)operator(,) + ident(fileClass)operator(,) ident(fileStatClass)operator(,) ident(ioClass)operator(,) ident(threadClass)operator(,) ident(threadGroupClass)operator(,) + ident(continuationClass)operator(,) ident(structClass)operator(,) ident(tmsStruct)operator(,) ident(passwdStruct)operator(,) + ident(groupStruct)operator(,) ident(procStatusClass)operator(,) ident(exceptionClass)operator(,) ident(runtimeError)operator(,) ident(ioError)operator(,) + ident(scriptError)operator(,) ident(nameError)operator(,) ident(nameErrorMessage)operator(,) ident(noMethodError)operator(,) ident(signalException)operator(,) + ident(rangeError)operator(,) ident(dummyClass)operator(,) ident(systemExit)operator(,) ident(localJumpError)operator(,) ident(nativeException)operator(,) + ident(systemCallError)operator(,) ident(fatal)operator(,) ident(interrupt)operator(,) ident(typeError)operator(,) ident(argumentError)operator(,) ident(indexError)operator(,) + ident(syntaxError)operator(,) ident(standardError)operator(,) ident(loadError)operator(,) ident(notImplementedError)operator(,) ident(securityError)operator(,) ident(noMemoryError)operator(,) + ident(regexpError)operator(,) ident(eofError)operator(,) ident(threadError)operator(,) ident(concurrencyError)operator(,) ident(systemStackError)operator(,) ident(zeroDivisionError)operator(,) ident(floatDomainError)operator(;) + + comment(/** + * All the core modules we keep direct references to, for quick access and + * to ensure they remain available. + */) + directive(private) ident(RubyModule) + ident(kernelModule)operator(,) ident(comparableModule)operator(,) ident(enumerableModule)operator(,) ident(mathModule)operator(,) + ident(marshalModule)operator(,) ident(etcModule)operator(,) ident(fileTestModule)operator(,) ident(gcModule)operator(,) + ident(objectSpaceModule)operator(,) ident(processModule)operator(,) ident(procUIDModule)operator(,) ident(procGIDModule)operator(,) + ident(procSysModule)operator(,) ident(precisionModule)operator(,) ident(errnoModule)operator(;) + + comment(// record separator var, to speed up io ops that use it) + directive(private) ident(GlobalVariable) ident(recordSeparatorVar)operator(;) + + comment(// former java.lang.System concepts now internalized for MVM) + directive(private) type(String) ident(currentDirectory)operator(;) + + directive(private) type(long) ident(startTime) operator(=) type(System)operator(.)ident(currentTimeMillis)operator(()operator(\))operator(;) + + directive(private) ident(RubyInstanceConfig) ident(config)operator(;) + + directive(private) type(InputStream) ident(in)operator(;) + directive(private) type(PrintStream) ident(out)operator(;) + directive(private) type(PrintStream) ident(err)operator(;) + + comment(// Java support) + directive(private) ident(JavaSupport) ident(javaSupport)operator(;) + directive(private) ident(JRubyClassLoader) ident(jrubyClassLoader)operator(;) + + comment(// Management/monitoring) + directive(private) ident(BeanManager) ident(beanManager)operator(;) + + comment(// Compilation) + directive(private) directive(final) ident(JITCompiler) ident(jitCompiler)operator(;) + + comment(// Note: this field and the following static initializer) + comment(// must be located be in this order!) + directive(private) directive(volatile) directive(static) type(boolean) ident(securityRestricted) operator(=) keyword(false)operator(;) + directive(static) operator({) + keyword(if) operator(()ident(SafePropertyAccessor)operator(.)ident(isSecurityProtected)operator(()string<delimiter(")content(jruby.reflection)delimiter(")>operator(\))operator(\)) operator({) + comment(// can't read non-standard properties) + ident(securityRestricted) operator(=) keyword(true)operator(;) + operator(}) keyword(else) operator({) + type(SecurityManager) ident(sm) operator(=) type(System)operator(.)ident(getSecurityManager)operator(()operator(\))operator(;) + keyword(if) operator(()ident(sm) operator(!=) keyword(null)operator(\)) operator({) + keyword(try) operator({) + ident(sm)operator(.)ident(checkCreateClassLoader)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(SecurityException) ident(se)operator(\)) operator({) + comment(// can't create custom classloaders) + ident(securityRestricted) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + + directive(private) type(Parser) ident(parser) operator(=) keyword(new) type(Parser)operator(()local_variable(this)operator(\))operator(;) + + directive(private) ident(LoadService) ident(loadService)operator(;) + directive(private) ident(GlobalVariables) ident(globalVariables) operator(=) keyword(new) ident(GlobalVariables)operator(()local_variable(this)operator(\))operator(;) + directive(private) ident(RubyWarnings) ident(warnings) operator(=) keyword(new) ident(RubyWarnings)operator(()local_variable(this)operator(\))operator(;) + + comment(// Contains a list of all blocks (as Procs\) that should be called when) + comment(// the runtime environment exits.) + directive(private) type(Stack)operator(<)ident(RubyProc)operator(>) ident(atExitBlocks) operator(=) keyword(new) type(Stack)operator(<)ident(RubyProc)operator(>)operator(()operator(\))operator(;) + + directive(private) ident(Profile) ident(profile)operator(;) + + directive(private) ident(KCode) ident(kcode) operator(=) ident(KCode)operator(.)ident(NONE)operator(;) + + comment(// Atomic integers for symbol and method IDs) + directive(private) type(AtomicInteger) ident(symbolLastId) operator(=) keyword(new) type(AtomicInteger)operator(()integer(128)operator(\))operator(;) + directive(private) type(AtomicInteger) ident(moduleLastId) operator(=) keyword(new) type(AtomicInteger)operator(()integer(0)operator(\))operator(;) + + directive(private) type(Object) ident(respondToMethod)operator(;) + directive(private) type(Object) ident(objectToYamlMethod)operator(;) + + directive(private) type(Map)operator(<)type(String)operator(,) ident(DateTimeZone)operator(>) ident(localTimeZoneCache) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,)ident(DateTimeZone)operator(>)operator(()operator(\))operator(;) + comment(/** + * A list of "external" finalizers (the ones, registered via ObjectSpace\), + * weakly referenced, to be executed on tearDown. + */) + directive(private) type(Map)operator(<)ident(Finalizable)operator(,) type(Object)operator(>) ident(finalizers)operator(;) + + comment(/** + * A list of JRuby-internal finalizers, weakly referenced, + * to be executed on tearDown. + */) + directive(private) type(Map)operator(<)ident(Finalizable)operator(,) type(Object)operator(>) ident(internalFinalizers)operator(;) + + comment(// mutex that controls modifications of user-defined finalizers) + directive(private) directive(final) type(Object) ident(finalizersMutex) operator(=) keyword(new) type(Object)operator(()operator(\))operator(;) + + comment(// mutex that controls modifications of internal finalizers) + directive(private) directive(final) type(Object) ident(internalFinalizersMutex) operator(=) keyword(new) type(Object)operator(()operator(\))operator(;) + + comment(// A thread pool to use for executing this runtime's Ruby threads) + directive(private) type(ExecutorService) ident(executor)operator(;) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.FrameField)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) + +directive(public) type(class) class(RubyArgsFile) operator({) + directive(private) directive(static) directive(final) type(class) class(ArgsFileData) operator({) + directive(private) directive(final) ident(Ruby) ident(runtime)operator(;) + directive(public) ident(ArgsFileData)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(this)operator(.)ident(runtime) operator(=) ident(runtime)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(currentFile)operator(;) + directive(public) type(int) ident(currentLineNumber)operator(;) + directive(public) type(boolean) ident(startedProcessing) operator(=) keyword(false)operator(;) + directive(public) type(boolean) ident(finishedProcessing) operator(=) keyword(false)operator(;) + + directive(public) type(boolean) ident(nextArgsFile)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(finishedProcessing)operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + ident(RubyArray) ident(args) operator(=) operator(()ident(RubyArray)operator(\))ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($*)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(getLength)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(startedProcessing)operator(\)) operator({) + ident(currentFile) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stdin)delimiter(")>operator(\))operator(;) + operator(()operator(()ident(RubyString)operator(\)) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($FILENAME)delimiter(")>operator(\))operator(\))operator(.)ident(setValue)operator(()keyword(new) ident(ByteList)operator(()keyword(new) type(byte)type([])operator({)string<delimiter(')content(-)delimiter(')>operator(})operator(\))operator(\))operator(;) + ident(currentLineNumber) operator(=) integer(0)operator(;) + ident(startedProcessing) operator(=) keyword(true)operator(;) + keyword(return) keyword(true)operator(;) + operator(}) keyword(else) operator({) + ident(finishedProcessing) operator(=) keyword(true)operator(;) + keyword(return) keyword(false)operator(;) + operator(}) + operator(}) + + ident(IRubyObject) ident(arg) operator(=) ident(args)operator(.)ident(shift)operator(()operator(\))operator(;) + ident(RubyString) ident(filename) operator(=) operator(()ident(RubyString)operator(\))operator(()operator(()ident(RubyObject)operator(\))ident(arg)operator(\))operator(.)ident(to_s)operator(()operator(\))operator(;) + ident(ByteList) ident(filenameBytes) operator(=) ident(filename)operator(.)ident(getByteList)operator(()operator(\))operator(;) + operator(()operator(()ident(RubyString)operator(\)) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($FILENAME)delimiter(")>operator(\))operator(\))operator(.)ident(setValue)operator(()ident(filenameBytes)operator(\))operator(;) + + keyword(if) operator(()ident(filenameBytes)operator(.)ident(length)operator(()operator(\)) operator(==) integer(1) operator(&&) ident(filenameBytes)operator(.)ident(get)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(-)delimiter(')>operator(\)) operator({) + ident(currentFile) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stdin)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(currentFile) operator(=) ident(RubyFile)operator(.)ident(open)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getFile)operator(()operator(\))operator(,) + keyword(new) ident(IRubyObject)type([]) operator({)ident(filename)operator(.)ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + ident(startedProcessing) operator(=) keyword(true)operator(;) + keyword(return) keyword(true)operator(;) + operator(}) + + directive(public) directive(static) ident(ArgsFileData) ident(getDataFrom)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) operator(()ident(ArgsFileData)operator(\))ident(recv)operator(.)ident(dataGetStruct)operator(()operator(\))operator(;) + keyword(if)operator(()ident(data) operator(==) keyword(null)operator(\)) operator({) + ident(data) operator(=) keyword(new) ident(ArgsFileData)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(recv)operator(.)ident(dataWrapStruct)operator(()ident(data)operator(\))operator(;) + operator(}) + keyword(return) ident(data)operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(void) ident(setCurrentLineNumber)operator(()ident(IRubyObject) ident(recv)operator(,) type(int) ident(newLineNumber)operator(\)) operator({) + ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(.)ident(currentLineNumber) operator(=) ident(newLineNumber)operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(initArgsFile)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyObject) ident(argsFile) operator(=) keyword(new) ident(RubyObject)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(.)ident(extend_object)operator(()ident(argsFile)operator(\))operator(;) + + ident(runtime)operator(.)ident(defineReadonlyVariable)operator(()string<delimiter(")content($<)delimiter(")>operator(,) ident(argsFile)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(ARGF)delimiter(")>operator(,) ident(argsFile)operator(\))operator(;) + + ident(RubyClass) ident(argfClass) operator(=) ident(argsFile)operator(.)ident(getMetaClass)operator(()operator(\))operator(;) + ident(argfClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyArgsFile)operator(.)ident(class)operator(\))operator(;) + ident(runtime)operator(.)ident(defineReadonlyVariable)operator(()string<delimiter(")content($FILENAME)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(-)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(fileno)delimiter(")>operator(,) string<delimiter(")content(to_i)delimiter(")>operator(})operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(fileno)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + + keyword(if) operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no stream)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyIO)operator(\)) ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(fileno)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_io)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(to_io)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + + keyword(if) operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no stream)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(data)operator(.)ident(currentFile)operator(;) + operator(}) + + directive(public) directive(static) ident(IRubyObject) ident(internalGets)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(line) operator(=) ident(data)operator(.)ident(currentFile)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(gets)delimiter(")>operator(,) ident(args)operator(\))operator(;) + + keyword(while) operator(()ident(line) keyword(instanceof) ident(RubyNil)operator(\)) operator({) + ident(data)operator(.)ident(currentFile)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(close)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + ident(data)operator(.)ident(currentFile) operator(=) keyword(null)operator(;) + keyword(return) ident(line)operator(;) + operator(}) + ident(line) operator(=) ident(data)operator(.)ident(currentFile)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(gets)delimiter(")>operator(,) ident(args)operator(\))operator(;) + operator(}) + + ident(data)operator(.)ident(currentLineNumber)operator(++)operator(;) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($.)delimiter(")>operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(data)operator(.)ident(currentLineNumber)operator(\))operator(\))operator(;) + + keyword(return) ident(line)operator(;) + operator(}) + + comment(// ARGF methods) + + comment(/** Read a line. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gets)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(gets)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(internalGets)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(result)operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** Read a line. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readline)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(readline)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(line) operator(=) ident(gets)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(\))operator(;) + + keyword(if) operator(()ident(line)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(line)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(readlines)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject)type([]) ident(separatorArgument)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNilClass)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(args)operator([)integer(0)operator(])operator(\)) operator(&&) + operator(!)ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getString)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getString)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(separatorArgument) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) ident(args)operator([)integer(0)operator(]) operator(})operator(;) + operator(}) keyword(else) operator({) + ident(separatorArgument) operator(=) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(;) + operator(}) + + ident(RubyArray) ident(result) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()operator(\))operator(;) + ident(IRubyObject) ident(line)operator(;) + keyword(while) operator(()operator(!) operator(()ident(line) operator(=) ident(internalGets)operator(()ident(context)operator(,) ident(recv)operator(,) ident(separatorArgument)operator(\))operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(line)operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_byte)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(each_byte)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject) ident(bt)operator(;) + + keyword(while)operator(()operator(!)operator(()ident(bt) operator(=) ident(getc)operator(()ident(context)operator(,) ident(recv)operator(\))operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(bt)operator(\))operator(;) + operator(}) + + keyword(return) ident(recv)operator(;) + operator(}) + + comment(/** Invoke a block for each line. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_line)delimiter(")>operator(,) ident(alias) operator(=) operator({)string<delimiter(")content(each)delimiter(")>operator(})operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(each_line)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject) ident(nextLine) operator(=) ident(internalGets)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(\))operator(;) + + keyword(while) operator(()operator(!)ident(nextLine)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(nextLine)operator(\))operator(;) + ident(nextLine) operator(=) ident(internalGets)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(\))operator(;) + operator(}) + + keyword(return) ident(recv)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(file)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(file)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(data)operator(.)ident(currentFile)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(skip)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(skip)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + ident(data)operator(.)ident(currentFile) operator(=) keyword(null)operator(;) + keyword(return) ident(recv)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(close)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(return) ident(recv)operator(;) + operator(}) + ident(data)operator(.)ident(currentFile) operator(=) keyword(null)operator(;) + ident(data)operator(.)ident(currentLineNumber) operator(=) integer(0)operator(;) + keyword(return) ident(recv)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(closed?)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(closed_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(return) ident(recv)operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyIO)operator(\))ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(closed_p)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(binmode)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(binmode)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no stream)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) operator(()operator(()ident(RubyIO)operator(\))ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(binmode)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lineno)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(lineno)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(.)ident(currentLineNumber)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(tell)delimiter(")>operator(,) ident(alias) operator(=) operator({)string<delimiter(")content(pos)delimiter(")>operator(})operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(tell)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no stream to tell)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyIO)operator(\))ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(pos)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rewind)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(rewind)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no stream to rewind)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyIO)operator(\))ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(rewind)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(eof)delimiter(")>operator(,) string<delimiter(")content(eof?)delimiter(")>operator(})operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(eof)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + keyword(if) operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + keyword(return) operator(()operator(()ident(RubyIO)operator(\)) ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(eof_p)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pos=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(set_pos)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(offset)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no stream to set position)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyIO)operator(\))ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(pos_set)operator(()ident(context)operator(,) ident(offset)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(seek)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(seek)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no stream to seek)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyIO)operator(\))ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(seek)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lineno=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(set_lineno)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(line)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + ident(data)operator(.)ident(currentLineNumber) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(line)operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readchar)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(readchar)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(IRubyObject) ident(c) operator(=) ident(getc)operator(()ident(context)operator(,) ident(recv)operator(\))operator(;) + + keyword(if)operator(()ident(c)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + + keyword(return) ident(c)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getc)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getc)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + ident(IRubyObject) ident(bt)operator(;) + keyword(while)operator(()keyword(true)operator(\)) operator({) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(if)operator(()operator(!)operator(()ident(data)operator(.)ident(currentFile) keyword(instanceof) ident(RubyFile)operator(\))operator(\)) operator({) + ident(bt) operator(=) ident(data)operator(.)ident(currentFile)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(getc)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(bt) operator(=) operator(()operator(()ident(RubyIO)operator(\))ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(getc)operator(()operator(\))operator(;) + operator(}) + keyword(if)operator(()ident(bt)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(data)operator(.)ident(currentFile) operator(=) keyword(null)operator(;) + keyword(continue)operator(;) + operator(}) + keyword(return) ident(bt)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(read)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(ArgsFileData) ident(data) operator(=) ident(ArgsFileData)operator(.)ident(getDataFrom)operator(()ident(recv)operator(\))operator(;) + ident(IRubyObject) ident(tmp)operator(,) ident(str)operator(,) ident(length)operator(;) + type(long) ident(len) operator(=) integer(0)operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(length) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(str) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + operator(}) keyword(else) operator({) + ident(str) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(length) operator(=) ident(str) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(if)operator(()operator(!)ident(length)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(len) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(length)operator(\))operator(;) + operator(}) + keyword(if)operator(()operator(!)ident(str)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(str) operator(=) ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(;) + operator(()operator(()ident(RubyString)operator(\))ident(str)operator(\))operator(.)ident(modify)operator(()operator(\))operator(;) + operator(()operator(()ident(RubyString)operator(\))ident(str)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()integer(0)operator(\))operator(;) + ident(args)operator([)integer(1)operator(]) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(while)operator(()keyword(true)operator(\)) operator({) + keyword(if)operator(()ident(data)operator(.)ident(currentFile) operator(==) keyword(null) operator(&&) operator(!)ident(data)operator(.)ident(nextArgsFile)operator(()ident(context)operator(\))operator(\)) operator({) + keyword(return) ident(str)operator(;) + operator(}) + keyword(if)operator(()operator(!)operator(()ident(data)operator(.)ident(currentFile) keyword(instanceof) ident(RubyIO)operator(\))operator(\)) operator({) + ident(tmp) operator(=) ident(data)operator(.)ident(currentFile)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(read)delimiter(")>operator(,) ident(args)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(tmp) operator(=) operator(()operator(()ident(RubyIO)operator(\))ident(data)operator(.)ident(currentFile)operator(\))operator(.)ident(read)operator(()ident(args)operator(\))operator(;) + operator(}) + keyword(if)operator(()ident(str)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(str) operator(=) ident(tmp)operator(;) + operator(}) keyword(else) keyword(if)operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + operator(()operator(()ident(RubyString)operator(\))ident(str)operator(\))operator(.)ident(append)operator(()ident(tmp)operator(\))operator(;) + operator(}) + keyword(if)operator(()ident(tmp)operator(.)ident(isNil)operator(()operator(\)) operator(||) ident(length)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(data)operator(.)ident(currentFile) operator(=) keyword(null)operator(;) + keyword(continue)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(args)operator(.)ident(length) operator(>=) integer(1)operator(\)) operator({) + keyword(if)operator(()operator(()operator(()ident(RubyString)operator(\))ident(str)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(<) ident(len)operator(\)) operator({) + ident(len) operator(-=) operator(()operator(()ident(RubyString)operator(\))ident(str)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + ident(args)operator([)integer(0)operator(]) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()ident(len)operator(\))operator(;) + keyword(continue)operator(;) + operator(}) + operator(}) + keyword(return) ident(str)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(filename)delimiter(")>operator(,) ident(alias) operator(=) operator({)string<delimiter(")content(path)delimiter(")>operator(})operator(\)) + directive(public) directive(static) ident(RubyString) ident(filename)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) operator(()ident(RubyString)operator(\)) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($FILENAME)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(to_s)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(ARGF)delimiter(")>operator(\))operator(;) + operator(}) +operator(}) +comment(/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Ola Bini <Ola.Bini@ki.se> + * Copyright (C\) 2006 Daniel Steer <damian.steer@hp.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.lang.reflect.Array)operator(;) +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.util.Arrays)operator(;) +keyword(import) include(java.util.Collection)operator(;) +keyword(import) include(java.util.Comparator)operator(;) +keyword(import) include(java.util.Iterator)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.ListIterator)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.javasupport.JavaUtil)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.Pack)operator(;) + +comment(/** + * The implementation of the built-in class Array in Ruby. + * + * Concurrency: no synchronization is required among readers, but + * all users must synchronize externally with writers. + * + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Array)delimiter(")>operator(\)) +directive(public) type(class) class(RubyArray) directive(extends) ident(RubyObject) directive(implements) type(List) operator({) + + directive(public) directive(static) ident(RubyClass) ident(createArrayClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(arrayc) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Array)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ARRAY_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setArray)operator(()ident(arrayc)operator(\))operator(;) + ident(arrayc)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(ARRAY)operator(;) + ident(arrayc)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyArray)operator(;) + operator(}) + operator(})operator(;) + + ident(arrayc)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + ident(arrayc)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyArray)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(arrayc)operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(ARRAY_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(ARRAY)operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(concurrentModification)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newConcurrencyError)operator(()string<delimiter(")content(Detected invalid array contents due to unsynchronized modifications with concurrent users)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** rb_ary_s_create + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(create)operator(()ident(IRubyObject) ident(klass)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyArray) ident(arr) operator(=) operator(()ident(RubyArray)operator(\)) operator(()operator(()ident(RubyClass)operator(\)) ident(klass)operator(\))operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(arr)operator(.)ident(callInit)operator(()ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(,) ident(block)operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(arr)operator(.)ident(alloc)operator(()ident(args)operator(.)ident(length)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(0)operator(,) ident(arr)operator(.)ident(values)operator(,) integer(0)operator(,) ident(args)operator(.)ident(length)operator(\))operator(;) + ident(arr)operator(.)ident(realLength) operator(=) ident(args)operator(.)ident(length)operator(;) + operator(}) + keyword(return) ident(arr)operator(;) + operator(}) + + comment(/** rb_ary_new2 + * + */) + directive(public) directive(static) directive(final) ident(RubyArray) ident(newArray)operator(()directive(final) ident(Ruby) ident(runtime)operator(,) directive(final) type(long) ident(len)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(len)operator(\))operator(;) + operator(}) + directive(public) directive(static) directive(final) ident(RubyArray) ident(newArrayLight)operator(()directive(final) ident(Ruby) ident(runtime)operator(,) directive(final) type(long) ident(len)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(len)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_new + * + */) + directive(public) directive(static) directive(final) ident(RubyArray) ident(newArray)operator(()directive(final) ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(ARRAY_DEFAULT_SIZE)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_new + * + */) + directive(public) directive(static) directive(final) ident(RubyArray) ident(newArrayLight)operator(()directive(final) ident(Ruby) ident(runtime)operator(\)) operator({) + comment(/* Ruby arrays default to holding 16 elements, so we create an + * ArrayList of the same size if we're not told otherwise + */) + ident(RubyArray) ident(arr) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) keyword(false)operator(\))operator(;) + ident(arr)operator(.)ident(alloc)operator(()ident(ARRAY_DEFAULT_SIZE)operator(\))operator(;) + keyword(return) ident(arr)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(newArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(obj) operator(})operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(newArrayLight)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(obj) operator(})operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** rb_assoc_new + * + */) + directive(public) directive(static) ident(RubyArray) ident(newArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(car)operator(,) ident(IRubyObject) ident(cdr)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(car)operator(,) ident(cdr) operator(})operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(newEmptyArray)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(NULL_ARRAY)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_new4, rb_ary_new3 + * + */) + directive(public) directive(static) ident(RubyArray) ident(newArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyArray) ident(arr) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(args)operator(.)ident(length)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(0)operator(,) ident(arr)operator(.)ident(values)operator(,) integer(0)operator(,) ident(args)operator(.)ident(length)operator(\))operator(;) + ident(arr)operator(.)ident(realLength) operator(=) ident(args)operator(.)ident(length)operator(;) + keyword(return) ident(arr)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(newArrayNoCopy)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(args)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(newArrayNoCopy)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) type(int) ident(begin)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(args)operator(,) ident(begin)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(newArrayNoCopyLight)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyArray) ident(arr) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) keyword(false)operator(\))operator(;) + ident(arr)operator(.)ident(values) operator(=) ident(args)operator(;) + ident(arr)operator(.)ident(realLength) operator(=) ident(args)operator(.)ident(length)operator(;) + keyword(return) ident(arr)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(newArray)operator(()ident(Ruby) ident(runtime)operator(,) type(Collection) ident(collection)operator(\)) operator({) + ident(RubyArray) ident(arr) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(collection)operator(.)ident(size)operator(()operator(\))operator(\))operator(;) + ident(collection)operator(.)ident(toArray)operator(()ident(arr)operator(.)ident(values)operator(\))operator(;) + ident(arr)operator(.)ident(realLength) operator(=) ident(arr)operator(.)ident(values)operator(.)ident(length)operator(;) + keyword(return) ident(arr)operator(;) + operator(}) + + directive(public) directive(static) directive(final) type(int) ident(ARRAY_DEFAULT_SIZE) operator(=) integer(16)operator(;) + + comment(// volatile to ensure that initial nil-fill is visible to other threads) + directive(private) directive(volatile) ident(IRubyObject)type([]) ident(values)operator(;) + + directive(private) directive(static) directive(final) type(int) ident(TMPLOCK_ARR_F) operator(=) integer(1) operator(<)operator(<) integer(9)operator(;) + directive(private) directive(static) directive(final) type(int) ident(TMPLOCK_OR_FROZEN_ARR_F) operator(=) ident(TMPLOCK_ARR_F) operator(|) ident(FROZEN_F)operator(;) + + directive(private) directive(volatile) type(boolean) ident(isShared) operator(=) keyword(false)operator(;) + directive(private) type(int) ident(begin) operator(=) integer(0)operator(;) + directive(private) type(int) ident(realLength) operator(=) integer(0)operator(;) + + comment(/* + * plain internal array assignment + */) + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(vals)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(\))operator(;) + ident(values) operator(=) ident(vals)operator(;) + ident(realLength) operator(=) ident(vals)operator(.)ident(length)operator(;) + operator(}) + + comment(/* + * plain internal array assignment + */) + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(vals)operator(,) type(boolean) ident(objectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(,) ident(objectSpace)operator(\))operator(;) + ident(values) operator(=) ident(vals)operator(;) + ident(realLength) operator(=) ident(vals)operator(.)ident(length)operator(;) + operator(}) + + comment(/* + * plain internal array assignment + */) + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(vals)operator(,) type(int) ident(begin)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(values) operator(=) ident(vals)operator(;) + local_variable(this)operator(.)ident(begin) operator(=) ident(begin)operator(;) + local_variable(this)operator(.)ident(realLength) operator(=) ident(vals)operator(.)ident(length) operator(-) ident(begin)operator(;) + local_variable(this)operator(.)ident(isShared) operator(=) keyword(true)operator(;) + operator(}) + + comment(/* rb_ary_new2 + * just allocates the internal array + */) + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(length)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(\))operator(;) + ident(checkLength)operator(()ident(length)operator(\))operator(;) + ident(alloc)operator(()operator(()type(int)operator(\)) ident(length)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(length)operator(,) type(boolean) ident(objectspace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(,) ident(objectspace)operator(\))operator(;) + ident(checkLength)operator(()ident(length)operator(\))operator(;) + ident(alloc)operator(()operator(()type(int)operator(\))ident(length)operator(\))operator(;) + operator(}) + + comment(/* rb_ary_new3, rb_ary_new4 + * allocates the internal array of size length and copies the 'length' elements + */) + directive(public) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(length)operator(,) ident(IRubyObject)type([]) ident(vals)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(\))operator(;) + ident(checkLength)operator(()ident(length)operator(\))operator(;) + type(int) ident(ilength) operator(=) operator(()type(int)operator(\)) ident(length)operator(;) + ident(alloc)operator(()ident(ilength)operator(\))operator(;) + keyword(if) operator(()ident(ilength) operator(>) integer(0) operator(&&) ident(vals)operator(.)ident(length) operator(>) integer(0)operator(\)) type(System)operator(.)ident(arraycopy)operator(()ident(vals)operator(,) integer(0)operator(,) ident(values)operator(,) integer(0)operator(,) ident(ilength)operator(\))operator(;) + + ident(realLength) operator(=) ident(ilength)operator(;) + operator(}) + + comment(/* NEWOBJ and OBJSETUP equivalent + * fastest one, for shared arrays, optional objectspace + */) + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) type(boolean) ident(objectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(,) ident(objectSpace)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(\))operator(;) + ident(alloc)operator(()ident(ARRAY_DEFAULT_SIZE)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + ident(alloc)operator(()ident(ARRAY_DEFAULT_SIZE)operator(\))operator(;) + operator(}) + + comment(/* Array constructors taking the MetaClass to fulfil MRI Array subclass behaviour + * + */) + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(,) type(int) ident(length)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + ident(alloc)operator(()ident(length)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(,) type(long) ident(length)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + ident(checkLength)operator(()ident(length)operator(\))operator(;) + ident(alloc)operator(()operator(()type(int)operator(\))ident(length)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(,) type(long) ident(length)operator(,) type(boolean) ident(objectspace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(,) ident(objectspace)operator(\))operator(;) + ident(checkLength)operator(()ident(length)operator(\))operator(;) + ident(alloc)operator(()operator(()type(int)operator(\))ident(length)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(,) type(boolean) ident(objectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(,) ident(objectSpace)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyArray)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(,) ident(RubyArray) ident(original)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + ident(realLength) operator(=) ident(original)operator(.)ident(realLength)operator(;) + ident(alloc)operator(()ident(realLength)operator(\))operator(;) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(original)operator(.)ident(values)operator(,) ident(original)operator(.)ident(begin)operator(,) ident(values)operator(,) integer(0)operator(,) ident(realLength)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(final) ident(IRubyObject)type([]) ident(reserve)operator(()type(int) ident(length)operator(\)) operator({) + directive(final) ident(IRubyObject)type([]) ident(arr) operator(=) keyword(new) ident(IRubyObject)operator([)ident(length)operator(])operator(;) + type(Arrays)operator(.)ident(fill)operator(()ident(arr)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(arr)operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(alloc)operator(()type(int) ident(length)operator(\)) operator({) + directive(final) ident(IRubyObject)type([]) ident(newValues) operator(=) keyword(new) ident(IRubyObject)operator([)ident(length)operator(])operator(;) + type(Arrays)operator(.)ident(fill)operator(()ident(newValues)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + ident(values) operator(=) ident(newValues)operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(realloc)operator(()type(int) ident(newLength)operator(\)) operator({) + ident(IRubyObject)type([]) ident(reallocated) operator(=) keyword(new) ident(IRubyObject)operator([)ident(newLength)operator(])operator(;) + type(Arrays)operator(.)ident(fill)operator(()ident(reallocated)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) integer(0)operator(,) ident(reallocated)operator(,) integer(0)operator(,) ident(newLength) operator(>) ident(realLength) operator(?) ident(realLength) operator(:) ident(newLength)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + ident(values) operator(=) ident(reallocated)operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(checkLength)operator(()type(long) ident(length)operator(\)) operator({) + keyword(if) operator(()ident(length) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative array size (or size too big\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(length) operator(>=) type(Integer)operator(.)ident(MAX_VALUE)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(array size too big)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** Getter for property list. + * @return Value of property list. + */) + directive(public) type(List) ident(getList)operator(()operator(\)) operator({) + keyword(return) type(Arrays)operator(.)ident(asList)operator(()ident(toJavaArray)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(int) ident(getLength)operator(()operator(\)) operator({) + keyword(return) ident(realLength)operator(;) + operator(}) + + directive(public) ident(IRubyObject)type([]) ident(toJavaArray)operator(()operator(\)) operator({) + ident(IRubyObject)type([]) ident(copy) operator(=) ident(reserve)operator(()ident(realLength)operator(\))operator(;) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) ident(begin)operator(,) ident(copy)operator(,) integer(0)operator(,) ident(realLength)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(copy)operator(;) + operator(}) + + directive(public) ident(IRubyObject)type([]) ident(toJavaArrayUnsafe)operator(()operator(\)) operator({) + keyword(return) operator(!)ident(isShared) operator(?) ident(values) operator(:) ident(toJavaArray)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject)type([]) ident(toJavaArrayMaybeUnsafe)operator(()operator(\)) operator({) + keyword(return) operator(()operator(!)ident(isShared) operator(&&) ident(begin) operator(==) integer(0) operator(&&) ident(values)operator(.)ident(length) operator(==) ident(realLength)operator(\)) operator(?) ident(values) operator(:) ident(toJavaArray)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_ary_make_shared + * + */) + directive(private) directive(final) ident(RubyArray) ident(makeShared)operator(()type(int) ident(beg)operator(,) type(int) ident(len)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) ident(makeShared)operator(()ident(beg)operator(,) ident(len)operator(,) ident(klass)operator(,) ident(klass)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(isObjectSpaceEnabled)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_ary_make_shared + * + */) + directive(private) directive(final) ident(RubyArray) ident(makeShared)operator(()type(int) ident(beg)operator(,) type(int) ident(len)operator(,) ident(RubyClass) ident(klass)operator(,) type(boolean) ident(objectSpace)operator(\)) operator({) + ident(RubyArray) ident(sharedArray) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(klass)operator(,) ident(objectSpace)operator(\))operator(;) + ident(isShared) operator(=) keyword(true)operator(;) + ident(sharedArray)operator(.)ident(values) operator(=) ident(values)operator(;) + ident(sharedArray)operator(.)ident(isShared) operator(=) keyword(true)operator(;) + ident(sharedArray)operator(.)ident(begin) operator(=) ident(beg)operator(;) + ident(sharedArray)operator(.)ident(realLength) operator(=) ident(len)operator(;) + keyword(return) ident(sharedArray)operator(;) + operator(}) + + comment(/** rb_ary_modify_check + * + */) + directive(private) directive(final) type(void) ident(modifyCheck)operator(()operator(\)) operator({) + keyword(if) operator(()operator(()ident(flags) operator(&) ident(TMPLOCK_OR_FROZEN_ARR_F)operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(if) operator(()operator(()ident(flags) operator(&) ident(FROZEN_F)operator(\)) operator(!=) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newFrozenError)operator(()string<delimiter(")content(array)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(()ident(flags) operator(&) ident(TMPLOCK_ARR_F)operator(\)) operator(!=) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't modify array during iteration)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(isTaint)operator(()operator(\)) operator(&&) ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't modify array)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_ary_modify + * + */) + directive(private) directive(final) type(void) ident(modify)operator(()operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isShared)operator(\)) operator({) + ident(IRubyObject)type([]) ident(vals) operator(=) ident(reserve)operator(()ident(realLength)operator(\))operator(;) + ident(isShared) operator(=) keyword(false)operator(;) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) ident(begin)operator(,) ident(vals)operator(,) integer(0)operator(,) ident(realLength)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + ident(begin) operator(=) integer(0)operator(;) + ident(values) operator(=) ident(vals)operator(;) + operator(}) + operator(}) + + comment(/* ================ + * Instance Methods + * ================ + */) + + comment(/** rb_ary_initialize + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(0)operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(int) ident(argc) operator(=) ident(args)operator(.)ident(length)operator(;) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(argc) operator(==) integer(0)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + ident(realLength) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(BLOCK_UNUSED)operator(,) string<delimiter(")content(given block not used)delimiter(")>operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + keyword(if) operator(()ident(argc) operator(==) integer(1) operator(&&) operator(!)operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + ident(IRubyObject) ident(val) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(checkArrayType)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(val)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(replace)operator(()ident(val)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) + + type(long) ident(len) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative array size)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(len) operator(>=) type(Integer)operator(.)ident(MAX_VALUE)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(array size too big)delimiter(")>operator(\))operator(;) + + type(int) ident(ilen) operator(=) operator(()type(int)operator(\)) ident(len)operator(;) + + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(ilen) operator(>) ident(values)operator(.)ident(length)operator(\)) ident(values) operator(=) ident(reserve)operator(()ident(ilen)operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(argc) operator(==) integer(2)operator(\)) operator({) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(BLOCK_BEATS_DEFAULT_VALUE)operator(,) string<delimiter(")content(block supersedes default value argument)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(ilen)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(store)operator(()ident(i)operator(,) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) keyword(new) ident(RubyFixnum)operator(()ident(runtime)operator(,) ident(i)operator(\))operator(\))operator(\))operator(;) + ident(realLength) operator(=) ident(i) operator(+) integer(1)operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(try) operator({) + type(Arrays)operator(.)ident(fill)operator(()ident(values)operator(,) integer(0)operator(,) ident(ilen)operator(,) operator(()ident(argc) operator(==) integer(2)operator(\)) operator(?) ident(args)operator([)integer(1)operator(]) operator(:) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + ident(realLength) operator(=) ident(ilen)operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_initialize_copy + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(initialize_copy)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility)operator(=)type(Visibility)operator(.)ident(PRIVATE)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(orig)operator(\)) operator({) + keyword(return) local_variable(this)operator(.)ident(replace)operator(()ident(orig)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_replace + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(replace)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(replace)operator(()ident(IRubyObject) ident(orig)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + + ident(RubyArray) ident(origArr) operator(=) ident(orig)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(orig)operator(\)) keyword(return) local_variable(this)operator(;) + + ident(origArr)operator(.)ident(isShared) operator(=) keyword(true)operator(;) + ident(isShared) operator(=) keyword(true)operator(;) + ident(values) operator(=) ident(origArr)operator(.)ident(values)operator(;) + ident(realLength) operator(=) ident(origArr)operator(.)ident(realLength)operator(;) + ident(begin) operator(=) ident(origArr)operator(.)ident(begin)operator(;) + + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_to_s + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(if) operator(()ident(realLength) operator(==) integer(0)operator(\)) keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(join)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($,)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + + directive(public) type(boolean) ident(includes)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(item)operator(\)) operator({) + type(int) ident(begin) operator(=) local_variable(this)operator(.)ident(begin)operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + directive(final) ident(IRubyObject) ident(value)operator(;) + keyword(try) operator({) + ident(value) operator(=) ident(values)operator([)ident(i)operator(])operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(continue)operator(;) + operator(}) + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(value)operator(,) ident(item)operator(\))operator(\)) keyword(return) keyword(true)operator(;) + operator(}) + + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** rb_ary_hash + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(hash)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(int) ident(h) operator(=) ident(realLength)operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(begin) operator(=) local_variable(this)operator(.)ident(begin)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(h) operator(=) operator(()ident(h) operator(<)operator(<) integer(1)operator(\)) operator(|) operator(()ident(h) operator(<) integer(0) operator(?) integer(1) operator(:) integer(0)operator(\))operator(;) + directive(final) ident(IRubyObject) ident(value)operator(;) + keyword(try) operator({) + ident(value) operator(=) ident(values)operator([)ident(i)operator(])operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(continue)operator(;) + operator(}) + ident(h) operator(^=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(value)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(HASH)operator(,) string<delimiter(")content(hash)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(h)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_store + * + */) + directive(public) directive(final) ident(IRubyObject) ident(store)operator(()type(long) ident(index)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(index) operator(<) integer(0)operator(\)) operator({) + ident(index) operator(+=) ident(realLength)operator(;) + keyword(if) operator(()ident(index) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) operator(()ident(index) operator(-) ident(realLength)operator(\)) operator(+) string<delimiter(")content( out of array)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(index) operator(>=) ident(realLength)operator(\)) operator({) + keyword(if) operator(()ident(index) operator(>=) ident(values)operator(.)ident(length)operator(\)) operator({) + type(long) ident(newLength) operator(=) ident(values)operator(.)ident(length) operator(>)operator(>) integer(1)operator(;) + + keyword(if) operator(()ident(newLength) operator(<) ident(ARRAY_DEFAULT_SIZE)operator(\)) ident(newLength) operator(=) ident(ARRAY_DEFAULT_SIZE)operator(;) + + ident(newLength) operator(+=) ident(index)operator(;) + keyword(if) operator(()ident(index) operator(>=) type(Integer)operator(.)ident(MAX_VALUE) operator(||) ident(newLength) operator(>=) type(Integer)operator(.)ident(MAX_VALUE)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(index too big)delimiter(")>operator(\))operator(;) + operator(}) + ident(realloc)operator(()operator(()type(int)operator(\)) ident(newLength)operator(\))operator(;) + operator(}) + + ident(realLength) operator(=) operator(()type(int)operator(\)) ident(index) operator(+) integer(1)operator(;) + operator(}) + + keyword(try) operator({) + ident(values)operator([)operator(()type(int)operator(\)) ident(index)operator(]) operator(=) ident(value)operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + comment(/** rb_ary_elt + * + */) + directive(private) directive(final) ident(IRubyObject) ident(elt)operator(()type(long) ident(offset)operator(\)) operator({) + keyword(if) operator(()ident(offset) operator(<) integer(0) operator(||) ident(offset) operator(>=) ident(realLength)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(try) operator({) + keyword(return) ident(values)operator([)ident(begin) operator(+) operator(()type(int)operator(\))ident(offset)operator(])operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_ary_entry + * + */) + directive(public) directive(final) ident(IRubyObject) ident(entry)operator(()type(long) ident(offset)operator(\)) operator({) + keyword(return) operator(()ident(offset) operator(<) integer(0) operator(\)) operator(?) ident(elt)operator(()ident(offset) operator(+) ident(realLength)operator(\)) operator(:) ident(elt)operator(()ident(offset)operator(\))operator(;) + operator(}) + + + comment(/** rb_ary_entry + * + */) + directive(public) directive(final) ident(IRubyObject) ident(entry)operator(()type(int) ident(offset)operator(\)) operator({) + keyword(return) operator(()ident(offset) operator(<) integer(0) operator(\)) operator(?) ident(elt)operator(()ident(offset) operator(+) ident(realLength)operator(\)) operator(:) ident(elt)operator(()ident(offset)operator(\))operator(;) + operator(}) + + directive(public) directive(final) ident(IRubyObject) ident(eltInternal)operator(()type(int) ident(offset)operator(\)) operator({) + keyword(return) ident(values)operator([)ident(begin) operator(+) ident(offset)operator(])operator(;) + operator(}) + + directive(public) directive(final) ident(IRubyObject) ident(eltInternalSet)operator(()type(int) ident(offset)operator(,) ident(IRubyObject) ident(item)operator(\)) operator({) + keyword(return) ident(values)operator([)ident(begin) operator(+) ident(offset)operator(]) operator(=) ident(item)operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) ident(IRubyObject) ident(fetch)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(fetch)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(fetch)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_ary_fetch + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fetch)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(fetch)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(long) ident(index) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(;) + + keyword(if) operator(()ident(index) operator(<) integer(0)operator(\)) ident(index) operator(+=) ident(realLength)operator(;) + keyword(if) operator(()ident(index) operator(<) integer(0) operator(||) ident(index) operator(>=) ident(realLength)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(arg0)operator(\))operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(index) operator(+) string<delimiter(")content( out of array)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(try) operator({) + keyword(return) ident(values)operator([)ident(begin) operator(+) operator(()type(int)operator(\)) ident(index)operator(])operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_ary_fetch + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fetch)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(fetch)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(BLOCK_BEATS_DEFAULT_VALUE)operator(,) string<delimiter(")content(block supersedes default value argument)delimiter(")>operator(\))operator(;) + + type(long) ident(index) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(;) + + keyword(if) operator(()ident(index) operator(<) integer(0)operator(\)) ident(index) operator(+=) ident(realLength)operator(;) + keyword(if) operator(()ident(index) operator(<) integer(0) operator(||) ident(index) operator(>=) ident(realLength)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(arg0)operator(\))operator(;) + keyword(return) ident(arg1)operator(;) + operator(}) + + keyword(try) operator({) + keyword(return) ident(values)operator([)ident(begin) operator(+) operator(()type(int)operator(\)) ident(index)operator(])operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_ary_to_ary + * + */) + directive(private) directive(static) ident(RubyArray) ident(aryToAry)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()ident(obj) keyword(instanceof) ident(RubyArray)operator(\)) keyword(return) operator(()ident(RubyArray)operator(\)) ident(obj)operator(;) + + keyword(if) operator(()ident(obj)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_ary)delimiter(")>operator(\))operator(\)) keyword(return) ident(obj)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + + ident(RubyArray) ident(arr) operator(=) keyword(new) ident(RubyArray)operator(()ident(obj)operator(.)ident(getRuntime)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) comment(// possibly should not in object space) + ident(arr)operator(.)ident(alloc)operator(()integer(1)operator(\))operator(;) + ident(arr)operator(.)ident(values)operator([)integer(0)operator(]) operator(=) ident(obj)operator(;) + ident(arr)operator(.)ident(realLength) operator(=) integer(1)operator(;) + keyword(return) ident(arr)operator(;) + operator(}) + + comment(/** rb_ary_splice + * + */) + directive(private) directive(final) type(void) ident(splice)operator(()type(long) ident(beg)operator(,) type(long) ident(len)operator(,) ident(IRubyObject) ident(rpl)operator(\)) operator({) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(negative length ()delimiter(")> operator(+) ident(len) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(+=) ident(realLength)operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(-=) ident(realLength)operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(beg) operator(+) string<delimiter(")content( out of array)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(final) ident(RubyArray) ident(rplArr)operator(;) + directive(final) type(int) ident(rlen)operator(;) + + keyword(if) operator(()ident(rpl) operator(==) keyword(null) operator(||) ident(rpl)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(rplArr) operator(=) keyword(null)operator(;) + ident(rlen) operator(=) integer(0)operator(;) + operator(}) keyword(else) operator({) + ident(rplArr) operator(=) ident(aryToAry)operator(()ident(rpl)operator(\))operator(;) + ident(rlen) operator(=) ident(rplArr)operator(.)ident(realLength)operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(>=) ident(realLength)operator(\)) operator({) + ident(len) operator(=) ident(beg) operator(+) ident(rlen)operator(;) + + keyword(if) operator(()ident(len) operator(>=) ident(values)operator(.)ident(length)operator(\)) operator({) + type(int) ident(tryNewLength) operator(=) ident(values)operator(.)ident(length) operator(+) operator(()ident(values)operator(.)ident(length) operator(>)operator(>) integer(1)operator(\))operator(;) + ident(realloc)operator(()ident(len) operator(>) ident(tryNewLength) operator(?) operator(()type(int)operator(\))ident(len) operator(:) ident(tryNewLength)operator(\))operator(;) + operator(}) + + ident(realLength) operator(=) operator(()type(int)operator(\)) ident(len)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(beg) operator(+) ident(len) operator(>) ident(realLength)operator(\)) ident(len) operator(=) ident(realLength) operator(-) ident(beg)operator(;) + + type(long) ident(alen) operator(=) ident(realLength) operator(+) ident(rlen) operator(-) ident(len)operator(;) + keyword(if) operator(()ident(alen) operator(>=) ident(values)operator(.)ident(length)operator(\)) operator({) + type(int) ident(tryNewLength) operator(=) ident(values)operator(.)ident(length) operator(+) operator(()ident(values)operator(.)ident(length) operator(>)operator(>) integer(1)operator(\))operator(;) + ident(realloc)operator(()ident(alen) operator(>) ident(tryNewLength) operator(?) operator(()type(int)operator(\))ident(alen) operator(:) ident(tryNewLength)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(len) operator(!=) ident(rlen)operator(\)) operator({) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) operator(()type(int)operator(\)) operator(()ident(beg) operator(+) ident(len)operator(\))operator(,) ident(values)operator(,) operator(()type(int)operator(\)) ident(beg) operator(+) ident(rlen)operator(,) ident(realLength) operator(-) operator(()type(int)operator(\)) operator(()ident(beg) operator(+) ident(len)operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + ident(realLength) operator(=) operator(()type(int)operator(\)) ident(alen)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(rlen) operator(>) integer(0)operator(\)) operator({) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(rplArr)operator(.)ident(values)operator(,) ident(rplArr)operator(.)ident(begin)operator(,) ident(values)operator(,) operator(()type(int)operator(\)) ident(beg)operator(,) ident(rlen)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** rb_ary_splice + * + */) + directive(private) directive(final) type(void) ident(spliceOne)operator(()type(long) ident(beg)operator(,) type(long) ident(len)operator(,) ident(IRubyObject) ident(rpl)operator(\)) operator({) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(negative length ()delimiter(")> operator(+) ident(len) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(+=) ident(realLength)operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(-=) ident(realLength)operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(beg) operator(+) string<delimiter(")content( out of array)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(>=) ident(realLength)operator(\)) operator({) + ident(len) operator(=) ident(beg) operator(+) integer(1)operator(;) + + keyword(if) operator(()ident(len) operator(>=) ident(values)operator(.)ident(length)operator(\)) operator({) + type(int) ident(tryNewLength) operator(=) ident(values)operator(.)ident(length) operator(+) operator(()ident(values)operator(.)ident(length) operator(>)operator(>) integer(1)operator(\))operator(;) + ident(realloc)operator(()ident(len) operator(>) ident(tryNewLength) operator(?) operator(()type(int)operator(\))ident(len) operator(:) ident(tryNewLength)operator(\))operator(;) + operator(}) + + ident(realLength) operator(=) operator(()type(int)operator(\)) ident(len)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(beg) operator(+) ident(len) operator(>) ident(realLength)operator(\)) ident(len) operator(=) ident(realLength) operator(-) ident(beg)operator(;) + + type(int) ident(alen) operator(=) ident(realLength) operator(+) integer(1) operator(-) operator(()type(int)operator(\))ident(len)operator(;) + keyword(if) operator(()ident(alen) operator(>=) ident(values)operator(.)ident(length)operator(\)) operator({) + type(int) ident(tryNewLength) operator(=) ident(values)operator(.)ident(length) operator(+) operator(()ident(values)operator(.)ident(length) operator(>)operator(>) integer(1)operator(\))operator(;) + ident(realloc)operator(()ident(alen) operator(>) ident(tryNewLength) operator(?) ident(alen) operator(:) ident(tryNewLength)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(len) operator(!=) integer(1)operator(\)) operator({) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) operator(()type(int)operator(\)) operator(()ident(beg) operator(+) ident(len)operator(\))operator(,) ident(values)operator(,) operator(()type(int)operator(\)) ident(beg) operator(+) integer(1)operator(,) ident(realLength) operator(-) operator(()type(int)operator(\)) operator(()ident(beg) operator(+) ident(len)operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + ident(realLength) operator(=) ident(alen)operator(;) + operator(}) + operator(}) + + keyword(try) operator({) + ident(values)operator([)operator(()type(int)operator(\))ident(beg)operator(]) operator(=) ident(rpl)operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(insert)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(0)operator(,) integer(1)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_insert + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(insert)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_insert + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(insert)operator(()ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + type(long) ident(pos) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg1)operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(==) operator(-)integer(1)operator(\)) ident(pos) operator(=) ident(realLength)operator(;) + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) ident(pos)operator(++)operator(;) + + ident(spliceOne)operator(()ident(pos)operator(,) integer(0)operator(,) ident(arg2)operator(\))operator(;) comment(// rb_ary_new4) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_insert + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(insert)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(insert)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) keyword(return) local_variable(this)operator(;) + + type(long) ident(pos) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(==) operator(-)integer(1)operator(\)) ident(pos) operator(=) ident(realLength)operator(;) + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) ident(pos)operator(++)operator(;) + + ident(RubyArray) ident(inserted) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + ident(inserted)operator(.)ident(values) operator(=) ident(args)operator(;) + ident(inserted)operator(.)ident(begin) operator(=) integer(1)operator(;) + ident(inserted)operator(.)ident(realLength) operator(=) ident(args)operator(.)ident(length) operator(-) integer(1)operator(;) + + ident(splice)operator(()ident(pos)operator(,) integer(0)operator(,) ident(inserted)operator(\))operator(;) comment(// rb_ary_new4) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_dup + * + */) + directive(public) directive(final) ident(RubyArray) ident(aryDup)operator(()operator(\)) operator({) + ident(RubyArray) ident(dup) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) local_variable(this)operator(\))operator(;) + ident(dup)operator(.)ident(flags) operator(|=) ident(flags) operator(&) ident(TAINTED_F)operator(;) comment(// from DUP_SETUP) + comment(// rb_copy_generic_ivar from DUP_SETUP here ...unlikely..) + keyword(return) ident(dup)operator(;) + operator(}) + + comment(/** rb_ary_transpose + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(transpose)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(transpose)operator(()operator(\)) operator({) + ident(RubyArray) ident(tmp)operator(,) ident(result) operator(=) keyword(null)operator(;) + + type(int) ident(alen) operator(=) ident(realLength)operator(;) + keyword(if) operator(()ident(alen) operator(==) integer(0)operator(\)) keyword(return) ident(aryDup)operator(()operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(elen) operator(=) operator(-)integer(1)operator(;) + type(int) ident(end) operator(=) ident(begin) operator(+) ident(alen)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(end)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(tmp) operator(=) ident(elt)operator(()ident(i)operator(\))operator(.)ident(convertToArray)operator(()operator(\))operator(;) + keyword(if) operator(()ident(elen) operator(<) integer(0)operator(\)) operator({) + ident(elen) operator(=) ident(tmp)operator(.)ident(realLength)operator(;) + ident(result) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(elen)operator(\))operator(;) + keyword(for) operator(()type(int) ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) ident(elen)operator(;) ident(j)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(store)operator(()ident(j)operator(,) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(alen)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(elen) operator(!=) ident(tmp)operator(.)ident(realLength)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIndexError)operator(()string<delimiter(")content(element size differs ()delimiter(")> operator(+) ident(tmp)operator(.)ident(realLength) + operator(+) string<delimiter(")content( should be )delimiter(")> operator(+) ident(elen) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + keyword(for) operator(()type(int) ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) ident(elen)operator(;) ident(j)operator(++)operator(\)) operator({) + operator(()operator(()ident(RubyArray)operator(\)) ident(result)operator(.)ident(elt)operator(()ident(j)operator(\))operator(\))operator(.)ident(store)operator(()ident(i) operator(-) ident(begin)operator(,) ident(tmp)operator(.)ident(elt)operator(()ident(j)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_values_at (internal\) + * + */) + directive(private) directive(final) ident(IRubyObject) ident(values_at)operator(()type(long) ident(olen)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyArray) ident(result) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)ident(i)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(entry)operator(()operator(()operator(()ident(RubyFixnum)operator(\))ident(args)operator([)ident(i)operator(])operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(continue)operator(;) + operator(}) + + type(long) ident(beglen)type([])operator(;) + keyword(if) operator(()operator(!)operator(()ident(args)operator([)ident(i)operator(]) keyword(instanceof) ident(RubyRange)operator(\))operator(\)) operator({) + operator(}) keyword(else) keyword(if) operator(()operator(()ident(beglen) operator(=) operator(()operator(()ident(RubyRange)operator(\)) ident(args)operator([)ident(i)operator(])operator(\))operator(.)ident(begLen)operator(()ident(olen)operator(,) integer(0)operator(\))operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(continue)operator(;) + operator(}) keyword(else) operator({) + type(int) ident(beg) operator(=) operator(()type(int)operator(\)) ident(beglen)operator([)integer(0)operator(])operator(;) + type(int) ident(len) operator(=) operator(()type(int)operator(\)) ident(beglen)operator([)integer(1)operator(])operator(;) + type(int) ident(end) operator(=) ident(begin) operator(+) ident(len)operator(;) + keyword(for) operator(()type(int) ident(j) operator(=) ident(begin)operator(;) ident(j) operator(<) ident(end)operator(;) ident(j)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(entry)operator(()ident(j) operator(+) ident(beg)operator(\))operator(\))operator(;) + operator(}) + keyword(continue)operator(;) + operator(}) + ident(result)operator(.)ident(append)operator(()ident(entry)operator(()ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_values_at + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(values_at)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(values_at)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(values_at)operator(()ident(realLength)operator(,) ident(args)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_subseq + * + */) + directive(public) ident(IRubyObject) ident(subseq)operator(()type(long) ident(beg)operator(,) type(long) ident(len)operator(\)) operator({) + keyword(if) operator(()ident(beg) operator(>) ident(realLength) operator(||) ident(beg) operator(<) integer(0) operator(||) ident(len) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(+) ident(len) operator(>) ident(realLength)operator(\)) operator({) + ident(len) operator(=) ident(realLength) operator(-) ident(beg)operator(;) + + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) ident(len) operator(=) integer(0)operator(;) + operator(}) + + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) keyword(return) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) integer(0)operator(\))operator(;) + + keyword(return) ident(makeShared)operator(()ident(begin) operator(+) operator(()type(int)operator(\)) ident(beg)operator(,) operator(()type(int)operator(\)) ident(len)operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_ary_subseq + * + */) + directive(public) ident(IRubyObject) ident(subseqLight)operator(()type(long) ident(beg)operator(,) type(long) ident(len)operator(\)) operator({) + keyword(if) operator(()ident(beg) operator(>) ident(realLength) operator(||) ident(beg) operator(<) integer(0) operator(||) ident(len) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(+) ident(len) operator(>) ident(realLength)operator(\)) operator({) + ident(len) operator(=) ident(realLength) operator(-) ident(beg)operator(;) + + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) ident(len) operator(=) integer(0)operator(;) + operator(}) + + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) keyword(return) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) integer(0)operator(,) keyword(false)operator(\))operator(;) + + keyword(return) ident(makeShared)operator(()ident(begin) operator(+) operator(()type(int)operator(\)) ident(beg)operator(,) operator(()type(int)operator(\)) ident(len)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_length + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(length)delimiter(")>operator(,) ident(alias) operator(=) string<delimiter(")content(size)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(length)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(realLength)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_push - specialized rb_ary_store + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyArray) ident(append)operator(()ident(IRubyObject) ident(item)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(realLength) operator(==) ident(values)operator(.)ident(length)operator(\)) operator({) + keyword(if) operator(()ident(realLength) operator(==) type(Integer)operator(.)ident(MAX_VALUE)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(index too big)delimiter(")>operator(\))operator(;) + + type(long) ident(newLength) operator(=) ident(values)operator(.)ident(length) operator(+) operator(()ident(values)operator(.)ident(length) operator(>)operator(>) integer(1)operator(\))operator(;) + keyword(if) operator(() ident(newLength) operator(>) type(Integer)operator(.)ident(MAX_VALUE) operator(\)) operator({) + ident(newLength) operator(=) type(Integer)operator(.)ident(MAX_VALUE)operator(;) + operator(})keyword(else) keyword(if) operator(() ident(newLength) operator(<) ident(ARRAY_DEFAULT_SIZE) operator(\)) operator({) + ident(newLength) operator(=) ident(ARRAY_DEFAULT_SIZE)operator(;) + operator(}) + + ident(realloc)operator(()operator(()type(int)operator(\)) ident(newLength)operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(values)operator([)ident(realLength)operator(++)operator(]) operator(=) ident(item)operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_push_m + * FIXME: Whis is this named "push_m"? + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(push)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(push_m)operator(()ident(IRubyObject)type([]) ident(items)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(items)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(append)operator(()ident(items)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_pop + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pop)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(pop)operator(()operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(realLength) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(isShared)operator(\)) operator({) + keyword(try) operator({) + keyword(return) ident(values)operator([)ident(begin) operator(+) operator(--)ident(realLength)operator(])operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + type(int) ident(index) operator(=) ident(begin) operator(+) operator(--)ident(realLength)operator(;) + keyword(try) operator({) + directive(final) ident(IRubyObject) ident(obj) operator(=) ident(values)operator([)ident(index)operator(])operator(;) + ident(values)operator([)ident(index)operator(]) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** rb_ary_shift + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(shift)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(shift)operator(()operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(realLength) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + directive(final) ident(IRubyObject) ident(obj)operator(;) + keyword(try) operator({) + ident(obj) operator(=) ident(values)operator([)ident(begin)operator(])operator(;) + ident(values)operator([)ident(begin)operator(]) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + ident(isShared) operator(=) keyword(true)operator(;) + + ident(begin)operator(++)operator(;) + ident(realLength)operator(--)operator(;) + + keyword(return) ident(obj)operator(;) + operator(}) + + comment(/** rb_ary_unshift + * + */) + directive(public) ident(RubyArray) ident(unshift)operator(()ident(IRubyObject) ident(item)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(realLength) operator(==) ident(values)operator(.)ident(length)operator(\)) operator({) + type(int) ident(newLength) operator(=) ident(values)operator(.)ident(length) operator(>)operator(>) integer(1)operator(;) + keyword(if) operator(()ident(newLength) operator(<) ident(ARRAY_DEFAULT_SIZE)operator(\)) ident(newLength) operator(=) ident(ARRAY_DEFAULT_SIZE)operator(;) + + ident(newLength) operator(+=) ident(values)operator(.)ident(length)operator(;) + ident(realloc)operator(()ident(newLength)operator(\))operator(;) + operator(}) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) integer(0)operator(,) ident(values)operator(,) integer(1)operator(,) ident(realLength)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + + ident(realLength)operator(++)operator(;) + ident(values)operator([)integer(0)operator(]) operator(=) ident(item)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_unshift_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(unshift)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(unshift_m)operator(()ident(IRubyObject)type([]) ident(items)operator(\)) operator({) + type(long) ident(len) operator(=) ident(realLength)operator(;) + + keyword(if) operator(()ident(items)operator(.)ident(length) operator(==) integer(0)operator(\)) keyword(return) local_variable(this)operator(;) + + ident(store)operator(()ident(len) operator(+) ident(items)operator(.)ident(length) operator(-) integer(1)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + + keyword(try) operator({) + comment(// it's safe to use zeroes here since modified by store(\)) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) integer(0)operator(,) ident(values)operator(,) ident(items)operator(.)ident(length)operator(,) operator(()type(int)operator(\)) ident(len)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(items)operator(,) integer(0)operator(,) ident(values)operator(,) integer(0)operator(,) ident(items)operator(.)ident(length)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_includes + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(include?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(include_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(item)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(includes)operator(()ident(context)operator(,) ident(item)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_ary_frozen_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(frozen?)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyBoolean) ident(frozen_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isFrozen)operator(()operator(\)) operator(||) operator(()ident(flags) operator(&) ident(TMPLOCK_ARR_F)operator(\)) operator(!=) integer(0)operator(\))operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) ident(IRubyObject) ident(aref)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(aref)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(aref)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_ary_aref + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content([])delimiter(")>operator(,) string<delimiter(")content(slice)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(aref)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyFixnum)operator(\)) keyword(return) ident(entry)operator(()operator(()operator(()ident(RubyFixnum)operator(\))ident(arg0)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubySymbol)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Symbol as array index)delimiter(")>operator(\))operator(;) + + type(long)type([]) ident(beglen)operator(;) + keyword(if) operator(()operator(!)operator(()ident(arg0) keyword(instanceof) ident(RubyRange)operator(\))operator(\)) operator({) + operator(}) keyword(else) keyword(if) operator(()operator(()ident(beglen) operator(=) operator(()operator(()ident(RubyRange)operator(\)) ident(arg0)operator(\))operator(.)ident(begLen)operator(()ident(realLength)operator(,) integer(0)operator(\))operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(subseq)operator(()ident(beglen)operator([)integer(0)operator(])operator(,) ident(beglen)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(entry)operator(()ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_ary_aref + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content([])delimiter(")>operator(,) string<delimiter(")content(slice)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(aref)operator(()ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubySymbol)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Symbol as array index)delimiter(")>operator(\))operator(;) + + type(long) ident(beg) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) ident(beg) operator(+=) ident(realLength)operator(;) + + keyword(return) ident(subseq)operator(()ident(beg)operator(,) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg1)operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) ident(IRubyObject) ident(aset)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(2)operator(:) + keyword(return) ident(aset)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) integer(3)operator(:) + keyword(return) ident(aset)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(args)operator([)integer(2)operator(])operator(\))operator(;) + keyword(default)operator(:) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments ()delimiter(")> operator(+) ident(args)operator(.)ident(length) operator(+) string<delimiter(")content( for 2\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_ary_aset + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([]=)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(aset)operator(()ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(store)operator(()operator(()operator(()ident(RubyFixnum)operator(\))ident(arg0)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(,) ident(arg1)operator(\))operator(;) + keyword(return) ident(arg1)operator(;) + operator(}) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyRange)operator(\)) operator({) + type(long)type([]) ident(beglen) operator(=) operator(()operator(()ident(RubyRange)operator(\)) ident(arg0)operator(\))operator(.)ident(begLen)operator(()ident(realLength)operator(,) integer(1)operator(\))operator(;) + ident(splice)operator(()ident(beglen)operator([)integer(0)operator(])operator(,) ident(beglen)operator([)integer(1)operator(])operator(,) ident(arg1)operator(\))operator(;) + keyword(return) ident(arg1)operator(;) + operator(}) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubySymbol)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Symbol as array index)delimiter(")>operator(\))operator(;) + + ident(store)operator(()ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(,) ident(arg1)operator(\))operator(;) + keyword(return) ident(arg1)operator(;) + operator(}) + + comment(/** rb_ary_aset + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([]=)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(aset)operator(()ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubySymbol)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Symbol as array index)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(arg1) keyword(instanceof) ident(RubySymbol)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Symbol as subarray length)delimiter(")>operator(\))operator(;) + ident(splice)operator(()ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(,) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg1)operator(\))operator(,) ident(arg2)operator(\))operator(;) + keyword(return) ident(arg2)operator(;) + operator(}) + + comment(/** rb_ary_at + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(at)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(at)operator(()ident(IRubyObject) ident(pos)operator(\)) operator({) + keyword(return) ident(entry)operator(()ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(pos)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_ary_concat + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(concat)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyArray) ident(concat)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(obj)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(ary)operator(.)ident(realLength) operator(>) integer(0)operator(\)) ident(splice)operator(()ident(realLength)operator(,) integer(0)operator(,) ident(ary)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** inspect_ary + * + */) + directive(private) ident(IRubyObject) ident(inspectAry)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(ByteList) ident(buffer) operator(=) keyword(new) ident(ByteList)operator(()operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content([)delimiter(')>operator(\))operator(;) + type(boolean) ident(tainted) operator(=) ident(isTaint)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(i) operator(>) integer(0)operator(\)) ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content(,)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content( )delimiter(')>operator(\))operator(;) + + ident(RubyString) ident(str) operator(=) ident(inspect)operator(()ident(context)operator(,) ident(values)operator([)ident(begin) operator(+) ident(i)operator(])operator(\))operator(;) + keyword(if) operator(()ident(str)operator(.)ident(isTaint)operator(()operator(\))operator(\)) ident(tainted) operator(=) keyword(true)operator(;) + ident(buffer)operator(.)ident(append)operator(()ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content(])delimiter(')>operator(\))operator(;) + + ident(RubyString) ident(str) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buffer)operator(\))operator(;) + keyword(if) operator(()ident(tainted)operator(\)) ident(str)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_ary_inspect + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + keyword(if) operator(()ident(realLength) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content([])delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(isInspecting)operator(()local_variable(this)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content([...])delimiter(")>operator(\))operator(;) + + keyword(try) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(registerInspecting)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(inspectAry)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(unregisterInspecting)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) ident(IRubyObject) ident(first)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(return) ident(first)operator(()operator(\))operator(;) + keyword(case) integer(1)operator(:) + keyword(return) ident(first)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_ary_first + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(first)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(first)operator(()operator(\)) operator({) + keyword(if) operator(()ident(realLength) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(values)operator([)ident(begin)operator(])operator(;) + operator(}) + + comment(/** rb_ary_first + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(first)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(first)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + type(long) ident(n) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(;) + keyword(if) operator(()ident(n) operator(>) ident(realLength)operator(\)) operator({) + ident(n) operator(=) ident(realLength)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative array size (or size too big\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(makeShared)operator(()ident(begin)operator(,) operator(()type(int)operator(\)) ident(n)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getArray)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) ident(IRubyObject) ident(last)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(return) ident(last)operator(()operator(\))operator(;) + keyword(case) integer(1)operator(:) + keyword(return) ident(last)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_ary_last + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(last)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(last)operator(()operator(\)) operator({) + keyword(if) operator(()ident(realLength) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(values)operator([)ident(begin) operator(+) ident(realLength) operator(-) integer(1)operator(])operator(;) + operator(}) + + comment(/** rb_ary_last + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(last)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(last)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + type(long) ident(n) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(;) + keyword(if) operator(()ident(n) operator(>) ident(realLength)operator(\)) operator({) + ident(n) operator(=) ident(realLength)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative array size (or size too big\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(makeShared)operator(()ident(begin) operator(+) ident(realLength) operator(-) operator(()type(int)operator(\)) ident(n)operator(,) operator(()type(int)operator(\)) ident(n)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getArray)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_ary_each + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(values)operator([)ident(begin) operator(+) ident(i)operator(])operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_each_index + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_index)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each_index)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(i)operator(\))operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_reverse_each + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reverse_each)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(reverse_each)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(int) ident(len) operator(=) ident(realLength)operator(;) + + keyword(while)operator(()ident(len)operator(--) operator(>) integer(0)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(values)operator([)ident(begin) operator(+) ident(len)operator(])operator(\))operator(;) + + keyword(if) operator(()ident(realLength) operator(<) ident(len)operator(\)) ident(len) operator(=) ident(realLength)operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(inspectJoin)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyArray) ident(tmp)operator(,) ident(IRubyObject) ident(sep)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + comment(// If already inspecting, there is no need to register/unregister again.) + keyword(if) operator(()ident(runtime)operator(.)ident(isInspecting)operator(()local_variable(this)operator(\))operator(\)) operator({) + keyword(return) ident(tmp)operator(.)ident(join)operator(()ident(context)operator(,) ident(sep)operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(runtime)operator(.)ident(registerInspecting)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(tmp)operator(.)ident(join)operator(()ident(context)operator(,) ident(sep)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(runtime)operator(.)ident(unregisterInspecting)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_ary_join + * + */) + directive(public) ident(RubyString) ident(join)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(sep)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(realLength) operator(==) integer(0)operator(\)) keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + type(boolean) ident(taint) operator(=) ident(isTaint)operator(()operator(\)) operator(||) ident(sep)operator(.)ident(isTaint)operator(()operator(\))operator(;) + + type(long) ident(len) operator(=) integer(1)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(value)operator(;) + keyword(try) operator({) + ident(value) operator(=) ident(values)operator([)ident(i)operator(])operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")delimiter(")>operator(\))operator(;) + operator(}) + ident(IRubyObject) ident(tmp) operator(=) ident(value)operator(.)ident(checkStringType)operator(()operator(\))operator(;) + ident(len) operator(+=) ident(tmp)operator(.)ident(isNil)operator(()operator(\)) operator(?) integer(10) operator(:) operator(()operator(()ident(RubyString)operator(\)) ident(tmp)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + + ident(RubyString) ident(strSep) operator(=) keyword(null)operator(;) + keyword(if) operator(()operator(!)ident(sep)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(sep) operator(=) ident(strSep) operator(=) ident(sep)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(len) operator(+=) ident(strSep)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(*) operator(()ident(realLength) operator(-) integer(1)operator(\))operator(;) + operator(}) + + ident(ByteList) ident(buf) operator(=) keyword(new) ident(ByteList)operator(()operator(()type(int)operator(\))ident(len)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(tmp)operator(;) + keyword(try) operator({) + ident(tmp) operator(=) ident(values)operator([)ident(i)operator(])operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(tmp) keyword(instanceof) ident(RubyString)operator(\)) operator({) + comment(// do nothing) + operator(}) keyword(else) keyword(if) operator(()ident(tmp) keyword(instanceof) ident(RubyArray)operator(\)) operator({) + keyword(if) operator(()ident(runtime)operator(.)ident(isInspecting)operator(()ident(tmp)operator(\))operator(\)) operator({) + ident(tmp) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content([...])delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(tmp) operator(=) ident(inspectJoin)operator(()ident(context)operator(,) operator(()ident(RubyArray)operator(\))ident(tmp)operator(,) ident(sep)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(tmp) operator(=) ident(RubyString)operator(.)ident(objAsString)operator(()ident(context)operator(,) ident(tmp)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(i) operator(>) ident(begin) operator(&&) operator(!)ident(sep)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(buf)operator(.)ident(append)operator(()ident(strSep)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + + ident(buf)operator(.)ident(append)operator(()ident(tmp)operator(.)ident(asString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(tmp)operator(.)ident(isTaint)operator(()operator(\))operator(\)) ident(taint) operator(=) keyword(true)operator(;) + operator(}) + + ident(RubyString) ident(result) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(buf)operator(\))operator(;) + + keyword(if) operator(()ident(taint)operator(\)) ident(result)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_ary_join_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(join)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyString) ident(join_m)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(int) ident(argc) operator(=) ident(args)operator(.)ident(length)operator(;) + ident(IRubyObject) ident(sep) operator(=) operator(()ident(argc) operator(==) integer(1)operator(\)) operator(?) ident(args)operator([)integer(0)operator(]) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($,)delimiter(")>operator(\))operator(;) + + keyword(return) ident(join)operator(()ident(context)operator(,) ident(sep)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_to_a + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_a)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyArray) ident(to_a)operator(()operator(\)) operator({) + keyword(if)operator(()ident(getMetaClass)operator(()operator(\)) operator(!=) ident(getRuntime)operator(()operator(\))operator(.)ident(getArray)operator(()operator(\))operator(\)) operator({) + ident(RubyArray) ident(dup) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(isObjectSpaceEnabled)operator(()operator(\))operator(\))operator(;) + + ident(isShared) operator(=) keyword(true)operator(;) + ident(dup)operator(.)ident(isShared) operator(=) keyword(true)operator(;) + ident(dup)operator(.)ident(values) operator(=) ident(values)operator(;) + ident(dup)operator(.)ident(realLength) operator(=) ident(realLength)operator(;) + ident(dup)operator(.)ident(begin) operator(=) ident(begin)operator(;) + + keyword(return) ident(dup)operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_ary)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_ary)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyArray) ident(convertToArray)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(checkArrayType)operator(()operator(\))operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_equal + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(obj)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)operator(()ident(obj) keyword(instanceof) ident(RubyArray)operator(\))operator(\)) operator({) + keyword(if) operator(()operator(!)ident(obj)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_ary)delimiter(")>operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(obj)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_ary)delimiter(")>operator(\))operator(,) local_variable(this)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + operator(}) + + ident(RubyArray) ident(ary) operator(=) operator(()ident(RubyArray)operator(\)) ident(obj)operator(;) + keyword(if) operator(()ident(realLength) operator(!=) ident(ary)operator(.)ident(realLength)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(for) operator(()type(long) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(equalInternal)operator(()ident(context)operator(,) ident(elt)operator(()ident(i)operator(\))operator(,) ident(ary)operator(.)ident(elt)operator(()ident(i)operator(\))operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_ary_eql + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(eql_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(obj)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(obj) keyword(instanceof) ident(RubyArray)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + + ident(RubyArray) ident(ary) operator(=) operator(()ident(RubyArray)operator(\)) ident(obj)operator(;) + + keyword(if) operator(()ident(realLength) operator(!=) ident(ary)operator(.)ident(realLength)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(eqlInternal)operator(()ident(context)operator(,) ident(elt)operator(()ident(i)operator(\))operator(,) ident(ary)operator(.)ident(elt)operator(()ident(i)operator(\))operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_ary_compact_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(compact!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(compact_bang)operator(()operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + type(int) ident(p) operator(=) integer(0)operator(;) + type(int) ident(t) operator(=) integer(0)operator(;) + type(int) ident(end) operator(=) ident(p) operator(+) ident(realLength)operator(;) + + keyword(while) operator(()ident(t) operator(<) ident(end)operator(\)) operator({) + keyword(if) operator(()ident(values)operator([)ident(t)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(t)operator(++)operator(;) + operator(}) keyword(else) operator({) + ident(values)operator([)ident(p)operator(++)operator(]) operator(=) ident(values)operator([)ident(t)operator(++)operator(])operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(realLength) operator(==) ident(p)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(realloc)operator(()ident(p)operator(\))operator(;) + ident(realLength) operator(=) ident(p)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_compact + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(compact)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(compact)operator(()operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(aryDup)operator(()operator(\))operator(;) + ident(ary)operator(.)ident(compact_bang)operator(()operator(\))operator(;) + keyword(return) ident(ary)operator(;) + operator(}) + + comment(/** rb_ary_empty_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(empty?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(empty_p)operator(()operator(\)) operator({) + keyword(return) ident(realLength) operator(==) integer(0) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_ary_clear + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(clear)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rb_clear)operator(()operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + + keyword(if)operator(()ident(isShared)operator(\)) operator({) + ident(alloc)operator(()ident(ARRAY_DEFAULT_SIZE)operator(\))operator(;) + ident(isShared) operator(=) keyword(true)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(values)operator(.)ident(length) operator(>) ident(ARRAY_DEFAULT_SIZE) operator(<)operator(<) integer(1)operator(\))operator({) + ident(alloc)operator(()ident(ARRAY_DEFAULT_SIZE) operator(<)operator(<) integer(1)operator(\))operator(;) + operator(}) keyword(else) operator({) + directive(final) type(int) ident(begin) operator(=) local_variable(this)operator(.)ident(begin)operator(;) + keyword(try) operator({) + type(Arrays)operator(.)ident(fill)operator(()ident(values)operator(,) ident(begin)operator(,) ident(begin) operator(+) ident(realLength)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + operator(}) + + ident(begin) operator(=) integer(0)operator(;) + ident(realLength) operator(=) integer(0)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_fill + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fill)delimiter(")>operator(,) ident(optional) operator(=) integer(3)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(fill)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject) ident(item) operator(=) keyword(null)operator(;) + ident(IRubyObject) ident(begObj) operator(=) keyword(null)operator(;) + ident(IRubyObject) ident(lenObj) operator(=) keyword(null)operator(;) + type(int) ident(argc) operator(=) ident(args)operator(.)ident(length)operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) integer(0)operator(,) integer(2)operator(\))operator(;) + ident(item) operator(=) keyword(null)operator(;) + ident(begObj) operator(=) ident(argc) operator(>) integer(0) operator(?) ident(args)operator([)integer(0)operator(]) operator(:) keyword(null)operator(;) + ident(lenObj) operator(=) ident(argc) operator(>) integer(1) operator(?) ident(args)operator([)integer(1)operator(]) operator(:) keyword(null)operator(;) + ident(argc)operator(++)operator(;) + operator(}) keyword(else) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) integer(1)operator(,) integer(3)operator(\))operator(;) + ident(item) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(begObj) operator(=) ident(argc) operator(>) integer(1) operator(?) ident(args)operator([)integer(1)operator(]) operator(:) keyword(null)operator(;) + ident(lenObj) operator(=) ident(argc) operator(>) integer(2) operator(?) ident(args)operator([)integer(2)operator(]) operator(:) keyword(null)operator(;) + operator(}) + + type(int) ident(beg) operator(=) integer(0)operator(,) ident(end) operator(=) integer(0)operator(,) ident(len) operator(=) integer(0)operator(;) + keyword(switch) operator(()ident(argc)operator(\)) operator({) + keyword(case) integer(1)operator(:) + ident(beg) operator(=) integer(0)operator(;) + ident(len) operator(=) ident(realLength)operator(;) + keyword(break)operator(;) + keyword(case) integer(2)operator(:) + keyword(if) operator(()ident(begObj) keyword(instanceof) ident(RubyRange)operator(\)) operator({) + type(long)type([]) ident(beglen) operator(=) operator(()operator(()ident(RubyRange)operator(\)) ident(begObj)operator(\))operator(.)ident(begLen)operator(()ident(realLength)operator(,) integer(1)operator(\))operator(;) + ident(beg) operator(=) operator(()type(int)operator(\)) ident(beglen)operator([)integer(0)operator(])operator(;) + ident(len) operator(=) operator(()type(int)operator(\)) ident(beglen)operator([)integer(1)operator(])operator(;) + keyword(break)operator(;) + operator(}) + comment(/* fall through */) + keyword(case) integer(3)operator(:) + ident(beg) operator(=) ident(begObj)operator(.)ident(isNil)operator(()operator(\)) operator(?) integer(0) operator(:) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(begObj)operator(\))operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(=) ident(realLength) operator(+) ident(beg)operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) ident(beg) operator(=) integer(0)operator(;) + operator(}) + ident(len) operator(=) operator(()ident(lenObj) operator(==) keyword(null) operator(||) ident(lenObj)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator(?) ident(realLength) operator(-) ident(beg) operator(:) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(lenObj)operator(\))operator(;) + comment(// TODO: In MRI 1.9, an explicit check for negative length is) + comment(// added here. IndexError is raised when length is negative.) + comment(// See [ruby-core:12953] for more details.) + comment(//) + comment(// New note: This is actually under re-evaluation,) + comment(// see [ruby-core:17483].) + keyword(break)operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + comment(// See [ruby-core:17483]) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + keyword(if) operator(()ident(len) operator(>) type(Integer)operator(.)ident(MAX_VALUE) operator(-) ident(beg)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(argument too big)delimiter(")>operator(\))operator(;) + operator(}) + + ident(end) operator(=) ident(beg) operator(+) ident(len)operator(;) + keyword(if) operator(()ident(end) operator(>) ident(realLength)operator(\)) operator({) + keyword(if) operator(()ident(end) operator(>=) ident(values)operator(.)ident(length)operator(\)) ident(realloc)operator(()ident(end)operator(\))operator(;) + + ident(realLength) operator(=) ident(end)operator(;) + operator(}) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(beg)operator(;) ident(i) operator(<) ident(end)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(i)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(i) operator(>=) ident(realLength)operator(\)) keyword(break)operator(;) + keyword(try) operator({) + ident(values)operator([)ident(i)operator(]) operator(=) ident(v)operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(len) operator(>) integer(0)operator(\)) operator({) + keyword(try) operator({) + type(Arrays)operator(.)ident(fill)operator(()ident(values)operator(,) ident(beg)operator(,) ident(beg) operator(+) ident(len)operator(,) ident(item)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_index + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(index)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(index)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(,) ident(obj)operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(i) operator(-) ident(begin)operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_ary_rindex + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rindex)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(rindex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(i) operator(=) ident(realLength)operator(;) + + keyword(while) operator(()ident(i)operator(--) operator(>) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(i) operator(>) ident(realLength)operator(\)) operator({) + ident(i) operator(=) ident(realLength)operator(;) + keyword(continue)operator(;) + operator(}) + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(values)operator([)ident(begin) operator(+) ident(i)operator(])operator(,) ident(obj)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(i)operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_ary_indexes + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(indexes)delimiter(")>operator(,) string<delimiter(")content(indices)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(indexes)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(Array#indexes is deprecated; use Array#values_at)delimiter(")>operator(,) string<delimiter(")content(Array#indexes)delimiter(")>operator(,) string<delimiter(")content(Array#values_at)delimiter(")>operator(\))operator(;) + + ident(RubyArray) ident(ary) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(\))operator(;) + + ident(IRubyObject)type([]) ident(arefArgs) operator(=) keyword(new) ident(IRubyObject)operator([)integer(1)operator(])operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(arefArgs)operator([)integer(0)operator(]) operator(=) ident(args)operator([)ident(i)operator(])operator(;) + ident(ary)operator(.)ident(append)operator(()ident(aref)operator(()ident(arefArgs)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(ary)operator(;) + operator(}) + + comment(/** rb_ary_reverse_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reverse!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(reverse_bang)operator(()operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + directive(final) type(int) ident(realLength) operator(=) local_variable(this)operator(.)ident(realLength)operator(;) + directive(final) ident(IRubyObject)type([]) ident(values) operator(=) local_variable(this)operator(.)ident(values)operator(;) + keyword(try) operator({) + keyword(if) operator(()ident(realLength) operator(>) integer(1)operator(\)) operator({) + type(int) ident(p1) operator(=) integer(0)operator(;) + type(int) ident(p2) operator(=) ident(p1) operator(+) ident(realLength) operator(-) integer(1)operator(;) + + keyword(while) operator(()ident(p1) operator(<) ident(p2)operator(\)) operator({) + directive(final) ident(IRubyObject) ident(tmp) operator(=) ident(values)operator([)ident(p1)operator(])operator(;) + ident(values)operator([)ident(p1)operator(++)operator(]) operator(=) ident(values)operator([)ident(p2)operator(])operator(;) + ident(values)operator([)ident(p2)operator(--)operator(]) operator(=) ident(tmp)operator(;) + operator(}) + operator(}) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_reverse_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reverse)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(reverse)operator(()operator(\)) operator({) + keyword(return) ident(aryDup)operator(()operator(\))operator(.)ident(reverse_bang)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_ary_collect + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(collect)delimiter(")>operator(,) string<delimiter(")content(map)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(collect)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(return) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(,) local_variable(this)operator(\))operator(;) + + ident(RubyArray) ident(collect) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(realLength)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(collect)operator(.)ident(append)operator(()ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(collect)operator(;) + operator(}) + + comment(/** rb_ary_collect_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(collect!)delimiter(")>operator(,) string<delimiter(")content(map!)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(collect_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(,) ident(len) operator(=) ident(realLength)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(store)operator(()ident(i)operator(,) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(values)operator([)ident(begin) operator(+) ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_select + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(select)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(select)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(result) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(realLength)operator(\))operator(;) + + keyword(if) operator(()ident(isShared)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) ident(result)operator(.)ident(append)operator(()ident(elt)operator(()ident(i) operator(-) ident(begin)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) ident(result)operator(.)ident(append)operator(()ident(elt)operator(()ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_ary_delete + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(delete)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(delete)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(item)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(int) ident(i2) operator(=) integer(0)operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i1) operator(=) integer(0)operator(;) ident(i1) operator(<) ident(realLength)operator(;) ident(i1)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(e) operator(=) ident(values)operator([)ident(begin) operator(+) ident(i1)operator(])operator(;) + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(e)operator(,) ident(item)operator(\))operator(\)) keyword(continue)operator(;) + keyword(if) operator(()ident(i1) operator(!=) ident(i2)operator(\)) ident(store)operator(()ident(i2)operator(,) ident(e)operator(\))operator(;) + ident(i2)operator(++)operator(;) + operator(}) + + keyword(if) operator(()ident(realLength) operator(==) ident(i2)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(item)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + directive(final) type(int) ident(realLength) operator(=) local_variable(this)operator(.)ident(realLength)operator(;) + directive(final) type(int) ident(begin) operator(=) local_variable(this)operator(.)ident(begin)operator(;) + directive(final) ident(IRubyObject)type([]) ident(values) operator(=) local_variable(this)operator(.)ident(values)operator(;) + keyword(if) operator(()ident(realLength) operator(>) ident(i2)operator(\)) operator({) + keyword(try) operator({) + type(Arrays)operator(.)ident(fill)operator(()ident(values)operator(,) ident(begin) operator(+) ident(i2)operator(,) ident(begin) operator(+) ident(realLength)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + local_variable(this)operator(.)ident(realLength) operator(=) ident(i2)operator(;) + keyword(if) operator(()ident(i2) operator(<)operator(<) integer(1) operator(<) ident(values)operator(.)ident(length) operator(&&) ident(values)operator(.)ident(length) operator(>) ident(ARRAY_DEFAULT_SIZE)operator(\)) ident(realloc)operator(()ident(i2) operator(<)operator(<) integer(1)operator(\))operator(;) + operator(}) + + keyword(return) ident(item)operator(;) + operator(}) + + comment(/** rb_ary_delete_at + * + */) + directive(private) directive(final) ident(IRubyObject) ident(delete_at)operator(()type(int) ident(pos)operator(\)) operator({) + type(int) ident(len) operator(=) ident(realLength)operator(;) + + keyword(if) operator(()ident(pos) operator(>=) ident(len)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) ident(pos) operator(+=) ident(len)operator(;) + + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(modify)operator(()operator(\))operator(;) + + ident(IRubyObject) ident(obj) operator(=) ident(values)operator([)ident(pos)operator(])operator(;) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) ident(pos) operator(+) integer(1)operator(,) ident(values)operator(,) ident(pos)operator(,) ident(len) operator(-) operator(()ident(pos) operator(+) integer(1)operator(\))operator(\))operator(;) + ident(values)operator([)ident(realLength)operator(-)integer(1)operator(]) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + ident(realLength)operator(--)operator(;) + + keyword(return) ident(obj)operator(;) + operator(}) + + comment(/** rb_ary_delete_at_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(delete_at)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(delete_at)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) ident(delete_at)operator(()operator(()type(int)operator(\)) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(obj)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_ary_reject_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reject)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(reject)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(aryDup)operator(()operator(\))operator(;) + ident(ary)operator(.)ident(reject_bang)operator(()ident(context)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(ary)operator(;) + operator(}) + + comment(/** rb_ary_reject_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reject!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(reject_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(int) ident(i2) operator(=) integer(0)operator(;) + ident(modify)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i1) operator(=) integer(0)operator(;) ident(i1) operator(<) ident(realLength)operator(;) ident(i1)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(values)operator([)ident(i1)operator(])operator(;) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(v)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) keyword(continue)operator(;) + + keyword(if) operator(()ident(i1) operator(!=) ident(i2)operator(\)) ident(store)operator(()ident(i2)operator(,) ident(v)operator(\))operator(;) + ident(i2)operator(++)operator(;) + operator(}) + keyword(if) operator(()ident(realLength) operator(==) ident(i2)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(i2) operator(<) ident(realLength)operator(\)) operator({) + keyword(try) operator({) + type(Arrays)operator(.)ident(fill)operator(()ident(values)operator(,) ident(i2)operator(,) ident(realLength)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + ident(realLength) operator(=) ident(i2)operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_delete_if + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(delete_if)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(delete_if)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(reject_bang)operator(()ident(context)operator(,) ident(block)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_zip + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zip)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(zip)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(args)operator([)ident(i)operator(]) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(convertToArray)operator(()operator(\))operator(;) + operator(}) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyArray) ident(tmp) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(args)operator(.)ident(length) operator(+) integer(1)operator(\))operator(;) + ident(tmp)operator(.)ident(append)operator(()ident(elt)operator(()ident(i)operator(\))operator(\))operator(;) + keyword(for) operator(()type(int) ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) ident(args)operator(.)ident(length)operator(;) ident(j)operator(++)operator(\)) operator({) + ident(tmp)operator(.)ident(append)operator(()operator(()operator(()ident(RubyArray)operator(\)) ident(args)operator([)ident(j)operator(])operator(\))operator(.)ident(elt)operator(()ident(i)operator(\))operator(\))operator(;) + operator(}) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(tmp)operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + type(int) ident(len) operator(=) ident(realLength)operator(;) + ident(RubyArray) ident(result) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(len)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyArray) ident(tmp) operator(=) keyword(new) ident(RubyArray)operator(()ident(runtime)operator(,) ident(args)operator(.)ident(length) operator(+) integer(1)operator(\))operator(;) + ident(tmp)operator(.)ident(append)operator(()ident(elt)operator(()ident(i)operator(\))operator(\))operator(;) + keyword(for) operator(()type(int) ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) ident(args)operator(.)ident(length)operator(;) ident(j)operator(++)operator(\)) operator({) + ident(tmp)operator(.)ident(append)operator(()operator(()operator(()ident(RubyArray)operator(\)) ident(args)operator([)ident(j)operator(])operator(\))operator(.)ident(elt)operator(()ident(i)operator(\))operator(\))operator(;) + operator(}) + ident(result)operator(.)ident(append)operator(()ident(tmp)operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_ary_cmp + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(RubyArray) ident(ary2) operator(=) ident(obj)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + + type(int) ident(len) operator(=) ident(realLength)operator(;) + + keyword(if) operator(()ident(len) operator(>) ident(ary2)operator(.)ident(realLength)operator(\)) ident(len) operator(=) ident(ary2)operator(.)ident(realLength)operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(elt)operator(()ident(i)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(ary2)operator(.)ident(elt)operator(()ident(i)operator(\))operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(v) keyword(instanceof) ident(RubyFixnum)operator(\)) operator(||) operator(()operator(()ident(RubyFixnum)operator(\)) ident(v)operator(\))operator(.)ident(getLongValue)operator(()operator(\)) operator(!=) integer(0)operator(\)) keyword(return) ident(v)operator(;) + operator(}) + ident(len) operator(=) ident(realLength) operator(-) ident(ary2)operator(.)ident(realLength)operator(;) + + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + keyword(if) operator(()ident(len) operator(>) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) ident(IRubyObject) ident(slice_bang)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(slice_bang)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(slice_bang)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_ary_slice_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(slice!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(slice_bang)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyRange)operator(\)) operator({) + type(long)type([]) ident(beglen) operator(=) operator(()operator(()ident(RubyRange)operator(\)) ident(arg0)operator(\))operator(.)ident(begLen)operator(()ident(realLength)operator(,) integer(1)operator(\))operator(;) + type(long) ident(pos) operator(=) ident(beglen)operator([)integer(0)operator(])operator(;) + type(long) ident(len) operator(=) ident(beglen)operator([)integer(1)operator(])operator(;) + + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) ident(pos) operator(=) ident(realLength) operator(+) ident(pos)operator(;) + + ident(arg0) operator(=) ident(subseq)operator(()ident(pos)operator(,) ident(len)operator(\))operator(;) + ident(splice)operator(()ident(pos)operator(,) ident(len)operator(,) keyword(null)operator(\))operator(;) + keyword(return) ident(arg0)operator(;) + operator(}) + keyword(return) ident(delete_at)operator(()operator(()type(int)operator(\)) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_ary_slice_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(slice!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(slice_bang)operator(()ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + type(long) ident(pos) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(;) + type(long) ident(len) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg1)operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) ident(pos) operator(=) ident(realLength) operator(+) ident(pos)operator(;) + + ident(arg1) operator(=) ident(subseq)operator(()ident(pos)operator(,) ident(len)operator(\))operator(;) + ident(splice)operator(()ident(pos)operator(,) ident(len)operator(,) keyword(null)operator(\))operator(;) + + keyword(return) ident(arg1)operator(;) + operator(}) + + comment(/** rb_ary_assoc + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(assoc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(assoc)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(key)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(values)operator([)ident(i)operator(])operator(;) + keyword(if) operator(()ident(v) keyword(instanceof) ident(RubyArray)operator(\)) operator({) + ident(RubyArray) ident(arr) operator(=) operator(()ident(RubyArray)operator(\))ident(v)operator(;) + keyword(if) operator(()ident(arr)operator(.)ident(realLength) operator(>) integer(0) operator(&&) ident(equalInternal)operator(()ident(context)operator(,) ident(arr)operator(.)ident(values)operator([)ident(arr)operator(.)ident(begin)operator(])operator(,) ident(key)operator(\))operator(\)) keyword(return) ident(arr)operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_ary_rassoc + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rassoc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(rassoc)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(values)operator([)ident(i)operator(])operator(;) + keyword(if) operator(()ident(v) keyword(instanceof) ident(RubyArray)operator(\)) operator({) + ident(RubyArray) ident(arr) operator(=) operator(()ident(RubyArray)operator(\))ident(v)operator(;) + keyword(if) operator(()ident(arr)operator(.)ident(realLength) operator(>) integer(1) operator(&&) ident(equalInternal)operator(()ident(context)operator(,) ident(arr)operator(.)ident(values)operator([)ident(arr)operator(.)ident(begin) operator(+) integer(1)operator(])operator(,) ident(value)operator(\))operator(\)) keyword(return) ident(arr)operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** flatten + * + */) + directive(private) directive(final) type(int) ident(flatten)operator(()ident(ThreadContext) ident(context)operator(,) type(int) ident(index)operator(,) ident(RubyArray) ident(ary2)operator(,) ident(RubyArray) ident(memo)operator(\)) operator({) + type(int) ident(i) operator(=) ident(index)operator(;) + type(int) ident(n)operator(;) + type(int) ident(lim) operator(=) ident(index) operator(+) ident(ary2)operator(.)ident(realLength)operator(;) + + ident(IRubyObject) ident(id) operator(=) ident(ary2)operator(.)ident(id)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(memo)operator(.)ident(includes)operator(()ident(context)operator(,) ident(id)operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(tried to flatten recursive array)delimiter(")>operator(\))operator(;) + + ident(memo)operator(.)ident(append)operator(()ident(id)operator(\))operator(;) + ident(splice)operator(()ident(index)operator(,) integer(1)operator(,) ident(ary2)operator(\))operator(;) + keyword(while) operator(()ident(i) operator(<) ident(lim)operator(\)) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(elt)operator(()ident(i)operator(\))operator(.)ident(checkArrayType)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(n) operator(=) ident(flatten)operator(()ident(context)operator(,) ident(i)operator(,) operator(()ident(RubyArray)operator(\)) ident(tmp)operator(,) ident(memo)operator(\))operator(;) + ident(i) operator(+=) ident(n)operator(;) + ident(lim) operator(+=) ident(n)operator(;) + operator(}) + ident(i)operator(++)operator(;) + operator(}) + ident(memo)operator(.)ident(pop)operator(()operator(\))operator(;) + keyword(return) ident(lim) operator(-) ident(index) operator(-) integer(1)operator(;) comment(/* returns number of increased items */) + operator(}) + + comment(/** rb_ary_flatten_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(flatten!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(flatten_bang)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(int) ident(i) operator(=) integer(0)operator(;) + ident(RubyArray) ident(memo) operator(=) keyword(null)operator(;) + + keyword(while) operator(()ident(i) operator(<) ident(realLength)operator(\)) operator({) + ident(IRubyObject) ident(ary2) operator(=) ident(values)operator([)ident(begin) operator(+) ident(i)operator(])operator(;) + ident(IRubyObject) ident(tmp) operator(=) ident(ary2)operator(.)ident(checkArrayType)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(memo) operator(==) keyword(null)operator(\)) operator({) + ident(memo) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + ident(memo)operator(.)ident(values) operator(=) ident(reserve)operator(()ident(ARRAY_DEFAULT_SIZE)operator(\))operator(;) + operator(}) + + ident(i) operator(+=) ident(flatten)operator(()ident(context)operator(,) ident(i)operator(,) operator(()ident(RubyArray)operator(\)) ident(tmp)operator(,) ident(memo)operator(\))operator(;) + operator(}) + ident(i)operator(++)operator(;) + operator(}) + keyword(if) operator(()ident(memo) operator(==) keyword(null)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_flatten + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(flatten)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(flatten)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(aryDup)operator(()operator(\))operator(;) + ident(ary)operator(.)ident(flatten_bang)operator(()ident(context)operator(\))operator(;) + keyword(return) ident(ary)operator(;) + operator(}) + + comment(/** rb_ary_nitems + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nitems)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(nitems)operator(()operator(\)) operator({) + type(int) ident(n) operator(=) integer(0)operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(values)operator([)ident(i)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(n)operator(++)operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(n)operator(\))operator(;) + operator(}) + + comment(/** rb_ary_plus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_plus)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(RubyArray) ident(y) operator(=) ident(obj)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + type(int) ident(len) operator(=) ident(realLength) operator(+) ident(y)operator(.)ident(realLength)operator(;) + ident(RubyArray) ident(z) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(len)operator(\))operator(;) + keyword(try) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) ident(begin)operator(,) ident(z)operator(.)ident(values)operator(,) integer(0)operator(,) ident(realLength)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(y)operator(.)ident(values)operator(,) ident(y)operator(.)ident(begin)operator(,) ident(z)operator(.)ident(values)operator(,) ident(realLength)operator(,) ident(y)operator(.)ident(realLength)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + ident(z)operator(.)ident(realLength) operator(=) ident(len)operator(;) + keyword(return) ident(z)operator(;) + operator(}) + + comment(/** rb_ary_times + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(*)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_times)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(times)operator(\)) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(times)operator(.)ident(checkStringType)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(join)operator(()ident(context)operator(,) ident(tmp)operator(\))operator(;) + + type(long) ident(len) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(times)operator(\))operator(;) + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) keyword(return) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) integer(0)operator(\))operator(;) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative argument)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()type(Long)operator(.)ident(MAX_VALUE) operator(/) ident(len) operator(<) ident(realLength)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(argument too big)delimiter(")>operator(\))operator(;) + operator(}) + + ident(len) operator(*=) ident(realLength)operator(;) + + ident(RubyArray) ident(ary2) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(len)operator(\))operator(;) + ident(ary2)operator(.)ident(realLength) operator(=) operator(()type(int)operator(\)) ident(len)operator(;) + + keyword(try) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i) operator(+=) ident(realLength)operator(\)) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) ident(begin)operator(,) ident(ary2)operator(.)ident(values)operator(,) ident(i)operator(,) ident(realLength)operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()type(ArrayIndexOutOfBoundsException) ident(e)operator(\)) operator({) + ident(concurrentModification)operator(()operator(\))operator(;) + operator(}) + + ident(ary2)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + + keyword(return) ident(ary2)operator(;) + operator(}) + + comment(/** ary_make_hash + * + */) + directive(private) directive(final) ident(RubyHash) ident(makeHash)operator(()ident(RubyArray) ident(ary2)operator(\)) operator({) + ident(RubyHash) ident(hash) operator(=) keyword(new) ident(RubyHash)operator(()ident(getRuntime)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + type(int) ident(begin) operator(=) local_variable(this)operator(.)ident(begin)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(hash)operator(.)ident(fastASet)operator(()ident(values)operator([)ident(i)operator(])operator(,) ident(NEVER)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(ary2) operator(!=) keyword(null)operator(\)) operator({) + ident(begin) operator(=) ident(ary2)operator(.)ident(begin)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(ary2)operator(.)ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(hash)operator(.)ident(fastASet)operator(()ident(ary2)operator(.)ident(values)operator([)ident(i)operator(])operator(,) ident(NEVER)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(hash)operator(;) + operator(}) + + comment(/** rb_ary_uniq_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(uniq!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(uniq_bang)operator(()operator(\)) operator({) + ident(RubyHash) ident(hash) operator(=) ident(makeHash)operator(()keyword(null)operator(\))operator(;) + + keyword(if) operator(()ident(realLength) operator(==) ident(hash)operator(.)ident(size)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + type(int) ident(j) operator(=) integer(0)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(elt)operator(()ident(i)operator(\))operator(;) + keyword(if) operator(()ident(hash)operator(.)ident(fastDelete)operator(()ident(v)operator(\))operator(\)) ident(store)operator(()ident(j)operator(++)operator(,) ident(v)operator(\))operator(;) + operator(}) + ident(realLength) operator(=) ident(j)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_ary_uniq + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(uniq)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(uniq)operator(()operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(aryDup)operator(()operator(\))operator(;) + ident(ary)operator(.)ident(uniq_bang)operator(()operator(\))operator(;) + keyword(return) ident(ary)operator(;) + operator(}) + + comment(/** rb_ary_diff + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_diff)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyHash) ident(hash) operator(=) ident(other)operator(.)ident(convertToArray)operator(()operator(\))operator(.)ident(makeHash)operator(()keyword(null)operator(\))operator(;) + ident(RubyArray) ident(ary3) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + type(int) ident(begin) operator(=) local_variable(this)operator(.)ident(begin)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(hash)operator(.)ident(fastARef)operator(()ident(values)operator([)ident(i)operator(])operator(\)) operator(!=) keyword(null)operator(\)) keyword(continue)operator(;) + ident(ary3)operator(.)ident(append)operator(()ident(elt)operator(()ident(i) operator(-) ident(begin)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(ary3)operator(;) + operator(}) + + comment(/** rb_ary_and + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(&)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_and)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyArray) ident(ary2) operator(=) ident(other)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + ident(RubyHash) ident(hash) operator(=) ident(ary2)operator(.)ident(makeHash)operator(()keyword(null)operator(\))operator(;) + ident(RubyArray) ident(ary3) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(realLength) operator(<) ident(ary2)operator(.)ident(realLength) operator(?) ident(realLength) operator(:) ident(ary2)operator(.)ident(realLength)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(elt)operator(()ident(i)operator(\))operator(;) + keyword(if) operator(()ident(hash)operator(.)ident(fastDelete)operator(()ident(v)operator(\))operator(\)) ident(ary3)operator(.)ident(append)operator(()ident(v)operator(\))operator(;) + operator(}) + + keyword(return) ident(ary3)operator(;) + operator(}) + + comment(/** rb_ary_or + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(|)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_or)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyArray) ident(ary2) operator(=) ident(other)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + ident(RubyHash) ident(set) operator(=) ident(makeHash)operator(()ident(ary2)operator(\))operator(;) + + ident(RubyArray) ident(ary3) operator(=) keyword(new) ident(RubyArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(realLength) operator(+) ident(ary2)operator(.)ident(realLength)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(elt)operator(()ident(i)operator(\))operator(;) + keyword(if) operator(()ident(set)operator(.)ident(fastDelete)operator(()ident(v)operator(\))operator(\)) ident(ary3)operator(.)ident(append)operator(()ident(v)operator(\))operator(;) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(ary2)operator(.)ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(ary2)operator(.)ident(elt)operator(()ident(i)operator(\))operator(;) + keyword(if) operator(()ident(set)operator(.)ident(fastDelete)operator(()ident(v)operator(\))operator(\)) ident(ary3)operator(.)ident(append)operator(()ident(v)operator(\))operator(;) + operator(}) + keyword(return) ident(ary3)operator(;) + operator(}) + + comment(/** rb_ary_sort + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sort)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(sort)operator(()ident(Block) ident(block)operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(aryDup)operator(()operator(\))operator(;) + ident(ary)operator(.)ident(sort_bang)operator(()ident(block)operator(\))operator(;) + keyword(return) ident(ary)operator(;) + operator(}) + + comment(/** rb_ary_sort_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sort!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(sort_bang)operator(()ident(Block) ident(block)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + keyword(if) operator(()ident(realLength) operator(>) integer(1)operator(\)) operator({) + ident(flags) operator(|=) ident(TMPLOCK_ARR_F)operator(;) + keyword(try) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + type(Arrays)operator(.)ident(sort)operator(()ident(values)operator(,) integer(0)operator(,) ident(realLength)operator(,) keyword(new) ident(BlockComparator)operator(()ident(block)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + type(Arrays)operator(.)ident(sort)operator(()ident(values)operator(,) integer(0)operator(,) ident(realLength)operator(,) keyword(new) ident(DefaultComparator)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(finally) operator({) + ident(flags) operator(&=) operator(~)ident(TMPLOCK_ARR_F)operator(;) + operator(}) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(final) type(class) class(BlockComparator) directive(implements) type(Comparator) operator({) + directive(private) ident(Block) ident(block)operator(;) + + directive(public) ident(BlockComparator)operator(()ident(Block) ident(block)operator(\)) operator({) + local_variable(this)operator(.)ident(block) operator(=) ident(block)operator(;) + operator(}) + + directive(public) type(int) ident(compare)operator(()type(Object) ident(o1)operator(,) type(Object) ident(o2)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(obj1) operator(=) operator(()ident(IRubyObject)operator(\)) ident(o1)operator(;) + ident(IRubyObject) ident(obj2) operator(=) operator(()ident(IRubyObject)operator(\)) ident(o2)operator(;) + ident(IRubyObject) ident(ret) operator(=) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(obj1)operator(,) ident(obj2)operator(\))operator(,) keyword(null)operator(,) keyword(null)operator(,) keyword(true)operator(\))operator(;) + type(int) ident(n) operator(=) ident(RubyComparable)operator(.)ident(cmpint)operator(()ident(context)operator(,) ident(ret)operator(,) ident(obj1)operator(,) ident(obj2)operator(\))operator(;) + comment(//TODO: ary_sort_check should be done here) + keyword(return) ident(n)operator(;) + operator(}) + operator(}) + + directive(static) directive(final) type(class) class(DefaultComparator) directive(implements) type(Comparator) operator({) + directive(public) type(int) ident(compare)operator(()type(Object) ident(o1)operator(,) type(Object) ident(o2)operator(\)) operator({) + keyword(if) operator(()ident(o1) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(o2) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(compareFixnums)operator(()ident(o1)operator(,) ident(o2)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(o1) keyword(instanceof) ident(RubyString) operator(&&) ident(o2) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyString)operator(\)) ident(o1)operator(\))operator(.)ident(op_cmp)operator(()operator(()ident(RubyString)operator(\)) ident(o2)operator(\))operator(;) + operator(}) + comment(//TODO: ary_sort_check should be done here) + keyword(return) ident(compareOthers)operator(()operator(()ident(IRubyObject)operator(\))ident(o1)operator(,) operator(()ident(IRubyObject)operator(\))ident(o2)operator(\))operator(;) + operator(}) + + directive(private) type(int) ident(compareFixnums)operator(()type(Object) ident(o1)operator(,) type(Object) ident(o2)operator(\)) operator({) + type(long) ident(a) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(o1)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(b) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(o2)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(a) operator(>) ident(b)operator(\)) operator({) + keyword(return) integer(1)operator(;) + operator(}) + keyword(if) operator(()ident(a) operator(<) ident(b)operator(\)) operator({) + keyword(return) operator(-)integer(1)operator(;) + operator(}) + keyword(return) integer(0)operator(;) + operator(}) + + directive(private) type(int) ident(compareOthers)operator(()ident(IRubyObject) ident(o1)operator(,) ident(IRubyObject) ident(o2)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(o1)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(ret) operator(=) ident(o1)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(o2)operator(\))operator(;) + type(int) ident(n) operator(=) ident(RubyComparable)operator(.)ident(cmpint)operator(()ident(context)operator(,) ident(ret)operator(,) ident(o1)operator(,) ident(o2)operator(\))operator(;) + comment(//TODO: ary_sort_check should be done here) + keyword(return) ident(n)operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(void) ident(marshalTo)operator(()ident(RubyArray) ident(array)operator(,) ident(MarshalStream) ident(output)operator(\)) directive(throws) type(IOException) operator({) + ident(output)operator(.)ident(registerLinkTarget)operator(()ident(array)operator(\))operator(;) + ident(output)operator(.)ident(writeInt)operator(()ident(array)operator(.)ident(getList)operator(()operator(\))operator(.)ident(size)operator(()operator(\))operator(\))operator(;) + keyword(for) operator(()type(Iterator) ident(iter) operator(=) ident(array)operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(output)operator(.)ident(dumpObject)operator(()operator(()ident(IRubyObject)operator(\)) ident(iter)operator(.)ident(next)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyArray) ident(result) operator(=) ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + type(int) ident(size) operator(=) ident(input)operator(.)ident(unmarshalInt)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(size)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(input)operator(.)ident(unmarshalObject)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** + * @see org.jruby.util.Pack#pack + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pack)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyString) ident(pack)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(RubyString) ident(iFmt) operator(=) ident(RubyString)operator(.)ident(objAsString)operator(()ident(context)operator(,) ident(obj)operator(\))operator(;) + keyword(return) ident(Pack)operator(.)ident(pack)operator(()ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(,) ident(iFmt)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(Class) ident(getJavaClass)operator(()operator(\)) operator({) + keyword(return) type(List)operator(.)ident(class)operator(;) + operator(}) + + comment(// Satisfy java.util.List interface (for Java integration\)) + directive(public) type(int) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(realLength)operator(;) + operator(}) + + directive(public) type(boolean) ident(isEmpty)operator(()operator(\)) operator({) + keyword(return) ident(realLength) operator(==) integer(0)operator(;) + operator(}) + + directive(public) type(boolean) ident(contains)operator(()type(Object) ident(element)operator(\)) operator({) + keyword(return) ident(indexOf)operator(()ident(element)operator(\)) operator(!=) operator(-)integer(1)operator(;) + operator(}) + + directive(public) type(Object)type([]) ident(toArray)operator(()operator(\)) operator({) + type(Object)type([]) ident(array) operator(=) keyword(new) type(Object)operator([)ident(realLength)operator(])operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(array)operator([)ident(i) operator(-) ident(begin)operator(]) operator(=) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(values)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(array)operator(;) + operator(}) + + directive(public) type(Object)type([]) ident(toArray)operator(()directive(final) type(Object)type([]) ident(arg)operator(\)) operator({) + type(Object)type([]) ident(array) operator(=) ident(arg)operator(;) + keyword(if) operator(()ident(array)operator(.)ident(length) operator(<) ident(realLength)operator(\)) operator({) + type(Class) ident(type) operator(=) ident(array)operator(.)ident(getClass)operator(()operator(\))operator(.)ident(getComponentType)operator(()operator(\))operator(;) + ident(array) operator(=) operator(()type(Object)type([])operator(\)) type(Array)operator(.)ident(newInstance)operator(()ident(type)operator(,) ident(realLength)operator(\))operator(;) + operator(}) + type(int) ident(length) operator(=) ident(realLength) operator(-) ident(begin)operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(array)operator([)ident(i)operator(]) operator(=) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(values)operator([)ident(i) operator(+) ident(begin)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(array)operator(;) + operator(}) + + directive(public) type(boolean) ident(add)operator(()type(Object) ident(element)operator(\)) operator({) + ident(append)operator(()ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(element)operator(\))operator(\))operator(;) + keyword(return) keyword(true)operator(;) + operator(}) + + directive(public) type(boolean) ident(remove)operator(()type(Object) ident(element)operator(\)) operator({) + ident(IRubyObject) ident(deleted) operator(=) ident(delete)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(element)operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + keyword(return) ident(deleted)operator(.)ident(isNil)operator(()operator(\)) operator(?) keyword(false) operator(:) keyword(true)operator(;) comment(// TODO: is this correct ?) + operator(}) + + directive(public) type(boolean) ident(containsAll)operator(()type(Collection) ident(c)operator(\)) operator({) + keyword(for) operator(()type(Iterator) ident(iter) operator(=) ident(c)operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + keyword(if) operator(()ident(indexOf)operator(()ident(iter)operator(.)ident(next)operator(()operator(\))operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + operator(}) + + keyword(return) keyword(true)operator(;) + operator(}) + + directive(public) type(boolean) ident(addAll)operator(()type(Collection) ident(c)operator(\)) operator({) + keyword(for) operator(()type(Iterator) ident(iter) operator(=) ident(c)operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(add)operator(()ident(iter)operator(.)ident(next)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) operator(!)ident(c)operator(.)ident(isEmpty)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(addAll)operator(()type(int) ident(index)operator(,) type(Collection) ident(c)operator(\)) operator({) + type(Iterator) ident(iter) operator(=) ident(c)operator(.)ident(iterator)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(index)operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(add)operator(()ident(i)operator(,) ident(iter)operator(.)ident(next)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) operator(!)ident(c)operator(.)ident(isEmpty)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(removeAll)operator(()type(Collection) ident(c)operator(\)) operator({) + type(boolean) ident(listChanged) operator(=) keyword(false)operator(;) + keyword(for) operator(()type(Iterator) ident(iter) operator(=) ident(c)operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + keyword(if) operator(()ident(remove)operator(()ident(iter)operator(.)ident(next)operator(()operator(\))operator(\))operator(\)) operator({) + ident(listChanged) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + keyword(return) ident(listChanged)operator(;) + operator(}) + + directive(public) type(boolean) ident(retainAll)operator(()type(Collection) ident(c)operator(\)) operator({) + type(boolean) ident(listChanged) operator(=) keyword(false)operator(;) + + keyword(for) operator(()type(Iterator) ident(iter) operator(=) ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(Object) ident(element) operator(=) ident(iter)operator(.)ident(next)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(c)operator(.)ident(contains)operator(()ident(element)operator(\))operator(\)) operator({) + ident(remove)operator(()ident(element)operator(\))operator(;) + ident(listChanged) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + keyword(return) ident(listChanged)operator(;) + operator(}) + + directive(public) type(Object) ident(get)operator(()type(int) ident(index)operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()operator(()ident(IRubyObject)operator(\)) ident(elt)operator(()ident(index)operator(\))operator(,) type(Object)operator(.)ident(class)operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(set)operator(()type(int) ident(index)operator(,) type(Object) ident(element)operator(\)) operator({) + keyword(return) ident(store)operator(()ident(index)operator(,) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(element)operator(\))operator(\))operator(;) + operator(}) + + comment(// TODO: make more efficient by not creating IRubyArray[]) + directive(public) type(void) ident(add)operator(()type(int) ident(index)operator(,) type(Object) ident(element)operator(\)) operator({) + ident(insert)operator(()keyword(new) ident(IRubyObject)type([])operator({)ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(index)operator(\))operator(,) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(element)operator(\))operator(})operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(remove)operator(()type(int) ident(index)operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(delete_at)operator(()ident(index)operator(\))operator(,) type(Object)operator(.)ident(class)operator(\))operator(;) + operator(}) + + directive(public) type(int) ident(indexOf)operator(()type(Object) ident(element)operator(\)) operator({) + type(int) ident(begin) operator(=) local_variable(this)operator(.)ident(begin)operator(;) + + keyword(if) operator(()ident(element) operator(!=) keyword(null)operator(\)) operator({) + ident(IRubyObject) ident(convertedElement) operator(=) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(element)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin)operator(;) ident(i) operator(<) ident(begin) operator(+) ident(realLength)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(convertedElement)operator(.)ident(equals)operator(()ident(values)operator([)ident(i)operator(])operator(\))operator(\)) operator({) + keyword(return) ident(i)operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) operator(-)integer(1)operator(;) + operator(}) + + directive(public) type(int) ident(lastIndexOf)operator(()type(Object) ident(element)operator(\)) operator({) + type(int) ident(begin) operator(=) local_variable(this)operator(.)ident(begin)operator(;) + + keyword(if) operator(()ident(element) operator(!=) keyword(null)operator(\)) operator({) + ident(IRubyObject) ident(convertedElement) operator(=) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(element)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) ident(begin) operator(+) ident(realLength) operator(-) integer(1)operator(;) ident(i) operator(>=) ident(begin)operator(;) ident(i)operator(--)operator(\)) operator({) + keyword(if) operator(()ident(convertedElement)operator(.)ident(equals)operator(()ident(values)operator([)ident(i)operator(])operator(\))operator(\)) operator({) + keyword(return) ident(i)operator(;) + operator(}) + operator(}) + operator(}) + + keyword(return) operator(-)integer(1)operator(;) + operator(}) + + directive(public) type(class) class(RubyArrayConversionIterator) directive(implements) type(Iterator) operator({) + directive(protected) type(int) ident(index) operator(=) integer(0)operator(;) + directive(protected) type(int) ident(last) operator(=) operator(-)integer(1)operator(;) + + directive(public) type(boolean) ident(hasNext)operator(()operator(\)) operator({) + keyword(return) ident(index) operator(<) ident(realLength)operator(;) + operator(}) + + directive(public) type(Object) ident(next)operator(()operator(\)) operator({) + ident(IRubyObject) ident(element) operator(=) ident(elt)operator(()ident(index)operator(\))operator(;) + ident(last) operator(=) ident(index)operator(++)operator(;) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(element)operator(,) type(Object)operator(.)ident(class)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(remove)operator(()operator(\)) operator({) + keyword(if) operator(()ident(last) operator(==) operator(-)integer(1)operator(\)) keyword(throw) keyword(new) type(IllegalStateException)operator(()operator(\))operator(;) + + ident(delete_at)operator(()ident(last)operator(\))operator(;) + keyword(if) operator(()ident(last) operator(<) ident(index)operator(\)) ident(index)operator(--)operator(;) + + ident(last) operator(=) operator(-)integer(1)operator(;) + + operator(}) + operator(}) + + directive(public) type(Iterator) ident(iterator)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArrayConversionIterator)operator(()operator(\))operator(;) + operator(}) + + directive(final) type(class) class(RubyArrayConversionListIterator) directive(extends) ident(RubyArrayConversionIterator) directive(implements) type(ListIterator) operator({) + directive(public) ident(RubyArrayConversionListIterator)operator(()operator(\)) operator({) + operator(}) + + directive(public) ident(RubyArrayConversionListIterator)operator(()type(int) ident(index)operator(\)) operator({) + local_variable(this)operator(.)ident(index) operator(=) ident(index)operator(;) + operator(}) + + directive(public) type(boolean) ident(hasPrevious)operator(()operator(\)) operator({) + keyword(return) ident(index) operator(>=) integer(0)operator(;) + operator(}) + + directive(public) type(Object) ident(previous)operator(()operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()operator(()ident(IRubyObject)operator(\)) ident(elt)operator(()ident(last) operator(=) operator(--)ident(index)operator(\))operator(,) type(Object)operator(.)ident(class)operator(\))operator(;) + operator(}) + + directive(public) type(int) ident(nextIndex)operator(()operator(\)) operator({) + keyword(return) ident(index)operator(;) + operator(}) + + directive(public) type(int) ident(previousIndex)operator(()operator(\)) operator({) + keyword(return) ident(index) operator(-) integer(1)operator(;) + operator(}) + + directive(public) type(void) ident(set)operator(()type(Object) ident(obj)operator(\)) operator({) + keyword(if) operator(()ident(last) operator(==) operator(-)integer(1)operator(\)) keyword(throw) keyword(new) type(IllegalStateException)operator(()operator(\))operator(;) + + ident(store)operator(()ident(last)operator(,) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(obj)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(add)operator(()type(Object) ident(obj)operator(\)) operator({) + ident(insert)operator(()keyword(new) ident(IRubyObject)type([]) operator({) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(index)operator(++)operator(\))operator(,) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(obj)operator(\)) operator(})operator(\))operator(;) + ident(last) operator(=) operator(-)integer(1)operator(;) + operator(}) + operator(}) + + directive(public) type(ListIterator) ident(listIterator)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArrayConversionListIterator)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(ListIterator) ident(listIterator)operator(()type(int) ident(index)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyArrayConversionListIterator)operator(()ident(index)operator(\))operator(;) + operator(}) + + comment(// TODO: list.subList(from, to\).clear(\) is supposed to clear the sublist from the list.) + comment(// How can we support this operation?) + directive(public) type(List) ident(subList)operator(()type(int) ident(fromIndex)operator(,) type(int) ident(toIndex)operator(\)) operator({) + keyword(if) operator(()ident(fromIndex) operator(<) integer(0) operator(||) ident(toIndex) operator(>) ident(size)operator(()operator(\)) operator(||) ident(fromIndex) operator(>) ident(toIndex)operator(\)) operator({) + keyword(throw) keyword(new) type(IndexOutOfBoundsException)operator(()operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(subList) operator(=) ident(subseq)operator(()ident(fromIndex)operator(,) ident(toIndex) operator(-) ident(fromIndex) operator(+) integer(1)operator(\))operator(;) + + keyword(return) ident(subList)operator(.)ident(isNil)operator(()operator(\)) operator(?) keyword(null) operator(:) operator(()type(List)operator(\)) ident(subList)operator(;) + operator(}) + + directive(public) type(void) ident(clear)operator(()operator(\)) operator({) + ident(rb_clear)operator(()operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.math.BigDecimal)operator(;) +keyword(import) include(java.math.BigInteger)operator(;) +keyword(import) include(java.math.MathContext)operator(;) +keyword(import) include(java.math.RoundingMode)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.regex.Matcher)operator(;) +keyword(import) include(java.util.regex.Pattern)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyConstant)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallbackFactory)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(BigDecimal)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Numeric)delimiter(")>operator(\)) +directive(public) type(class) class(RubyBigDecimal) directive(extends) ident(RubyNumeric) operator({) + directive(private) directive(static) directive(final) ident(ObjectAllocator) ident(BIGDECIMAL_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(ROUND_DOWN) operator(=) type(BigDecimal)operator(.)ident(ROUND_DOWN)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(ROUND_CEILING) operator(=) type(BigDecimal)operator(.)ident(ROUND_CEILING)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(ROUND_UP) operator(=) type(BigDecimal)operator(.)ident(ROUND_UP)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(ROUND_HALF_DOWN) operator(=) type(BigDecimal)operator(.)ident(ROUND_HALF_DOWN)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(ROUND_HALF_EVEN) operator(=) type(BigDecimal)operator(.)ident(ROUND_HALF_EVEN)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(ROUND_HALF_UP) operator(=) type(BigDecimal)operator(.)ident(ROUND_HALF_UP)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(ROUND_FLOOR) operator(=) type(BigDecimal)operator(.)ident(ROUND_FLOOR)operator(;) + + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(SIGN_POSITIVE_INFINITE)operator(=)integer(3)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(EXCEPTION_OVERFLOW)operator(=)integer(1)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(SIGN_POSITIVE_ZERO)operator(=)integer(1)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(EXCEPTION_ALL)operator(=)integer(255)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(SIGN_NEGATIVE_FINITE)operator(=)operator(-)integer(2)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(EXCEPTION_UNDERFLOW)operator(=)integer(4)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(SIGN_NaN)operator(=)integer(0)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(BASE)operator(=)integer(10000)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(ROUND_MODE)operator(=)integer(256)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(SIGN_POSITIVE_FINITE)operator(=)integer(2)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(EXCEPTION_INFINITY)operator(=)integer(1)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(SIGN_NEGATIVE_INFINITE)operator(=)operator(-)integer(3)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(EXCEPTION_ZERODIVIDE)operator(=)integer(1)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(SIGN_NEGATIVE_ZERO)operator(=)operator(-)integer(1)operator(;) + annotation(@JRubyConstant) + directive(public) directive(final) directive(static) type(int) ident(EXCEPTION_NaN)operator(=)integer(2)operator(;) + + comment(// Static constants) + directive(private) directive(static) directive(final) type(BigDecimal) ident(TWO) operator(=) keyword(new) type(BigDecimal)operator(()integer(2)operator(\))operator(;) + directive(private) directive(static) directive(final) type(double) ident(SQRT_10) operator(=) float(3.162277660168379332)operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createBigDecimal)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(result) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(BigDecimal)delimiter(")>operator(,)ident(runtime)operator(.)ident(getNumeric)operator(()operator(\))operator(,) ident(BIGDECIMAL_ALLOCATOR)operator(\))operator(;) + + ident(CallbackFactory) ident(callbackFactory) operator(=) ident(runtime)operator(.)ident(callbackFactory)operator(()ident(RubyBigDecimal)operator(.)ident(class)operator(\))operator(;) + + ident(runtime)operator(.)ident(getKernel)operator(()operator(\))operator(.)ident(defineAnnotatedMethods)operator(()ident(BigDecimalKernelMethods)operator(.)ident(class)operator(\))operator(;) + + ident(result)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(vpPrecLimit)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(vpExceptionMode)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(vpRoundingMode)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ROUND_HALF_UP)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyBigDecimal)operator(.)ident(class)operator(\))operator(;) + ident(result)operator(.)ident(defineAnnotatedConstants)operator(()ident(RubyBigDecimal)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) type(boolean) ident(isNaN) operator(=) keyword(false)operator(;) + directive(private) type(int) ident(infinitySign) operator(=) integer(0)operator(;) + directive(private) type(int) ident(zeroSign) operator(=) integer(0)operator(;) + directive(private) type(BigDecimal) ident(value)operator(;) + + directive(public) type(BigDecimal) ident(getValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + directive(public) ident(RubyBigDecimal)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyBigDecimal)operator(()ident(Ruby) ident(runtime)operator(,) type(BigDecimal) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(BigDecimal)delimiter(")>operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + operator(}) + + directive(public) directive(static) type(class) class(BigDecimalKernelMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(BigDecimal)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newBigDecimal)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(RubyBigDecimal)operator(.)ident(newBigDecimal)operator(()ident(recv)operator(,) ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(RubyBigDecimal) ident(newBigDecimal)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) ident(newInstance)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(BigDecimal)delimiter(")>operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ver)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(ver)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(1.0.1)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(_dump)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(dump)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(RubyString) ident(precision) operator(=) ident(RubyString)operator(.)ident(newUnicodeString)operator(()ident(args)operator([)integer(0)operator(])operator(.)ident(getRuntime)operator(()operator(\))operator(,) string<delimiter(")content(0:)delimiter(")>operator(\))operator(;) + ident(RubyString) ident(str) operator(=) local_variable(this)operator(.)ident(asString)operator(()operator(\))operator(;) + keyword(return) ident(precision)operator(.)ident(append)operator(()ident(str)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(_load)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyBigDecimal) ident(load)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(from)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyBigDecimal) ident(rubyBigDecimal) operator(=) operator(()ident(RubyBigDecimal)operator(\)) operator(()operator(()operator(()ident(RubyClass)operator(\))ident(recv)operator(\))operator(.)ident(allocate)operator(()operator(\))operator(\))operator(;) + type(String) ident(precisionAndValue) operator(=) ident(from)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(asJavaString)operator(()operator(\))operator(;) + type(String) ident(value) operator(=) ident(precisionAndValue)operator(.)ident(substring)operator(()ident(precisionAndValue)operator(.)ident(indexOf)operator(()string<delimiter(")content(:)delimiter(")>operator(\))operator(+)integer(1)operator(\))operator(;) + ident(rubyBigDecimal)operator(.)ident(value) operator(=) keyword(new) type(BigDecimal)operator(()ident(value)operator(\))operator(;) + keyword(return) ident(rubyBigDecimal)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(double_fig)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(double_fig)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(20)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(limit)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(limit)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyModule) ident(c) operator(=) operator(()ident(RubyModule)operator(\))ident(recv)operator(;) + ident(IRubyObject) ident(nCur) operator(=) ident(c)operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(vpPrecLimit)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(arg) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + keyword(if) operator(()operator(!)ident(arg)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(arg) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()ident(arg)operator(,) ident(runtime)operator(.)ident(getFixnum)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()integer(0) operator(>) operator(()operator(()ident(RubyFixnum)operator(\))ident(arg)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(argument must be positive)delimiter(")>operator(\))operator(;) + operator(}) + ident(c)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(vpPrecLimit)delimiter(")>operator(,) ident(arg)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(nCur)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(mode)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(mode)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + comment(// FIXME: I doubt any of the constants referenced in this method) + comment(// are ever redefined -- should compare to the known values, rather) + comment(// than do an expensive constant lookup.) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyClass) ident(clazz) operator(=) ident(runtime)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(BigDecimal)delimiter(")>operator(\))operator(;) + ident(RubyModule) ident(c) operator(=) operator(()ident(RubyModule)operator(\))ident(recv)operator(;) + + ident(args) operator(=) ident(Arity)operator(.)ident(scanArgs)operator(()ident(runtime)operator(,) ident(args)operator(,) integer(1)operator(,) integer(1)operator(\))operator(;) + + ident(IRubyObject) ident(mode) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(IRubyObject) ident(value) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + + keyword(if) operator(()operator(!)operator(()ident(mode) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type )delimiter(")> operator(+) ident(mode)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( (expected Fixnum\))delimiter(")>operator(\))operator(;) + operator(}) + + type(long) ident(longMode) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(mode)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(EXCEPTION_ALL) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(EXCEPTION_ALL)delimiter(")>operator(\))operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(()ident(longMode) operator(&) ident(EXCEPTION_ALL)operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(c)operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(vpExceptionMode)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)operator(()ident(value)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator(&&) operator(!)operator(()ident(value) keyword(instanceof) ident(RubyBoolean)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(second argument must be true or false)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyFixnum) ident(currentExceptionMode) operator(=) operator(()ident(RubyFixnum)operator(\))ident(c)operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(vpExceptionMode)delimiter(")>operator(\))operator(;) + ident(RubyFixnum) ident(newExceptionMode) operator(=) keyword(new) ident(RubyFixnum)operator(()ident(runtime)operator(,) ident(currentExceptionMode)operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + + ident(RubyFixnum) ident(EXCEPTION_INFINITY) operator(=) operator(()ident(RubyFixnum)operator(\))ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(EXCEPTION_INFINITY)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(()ident(longMode) operator(&) ident(EXCEPTION_INFINITY)operator(.)ident(getLongValue)operator(()operator(\))operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(newExceptionMode) operator(=) operator(()ident(value)operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator(?) operator(()ident(RubyFixnum)operator(\))ident(currentExceptionMode)operator(.)ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(EXCEPTION_INFINITY)operator(\)) + operator(:) operator(()ident(RubyFixnum)operator(\))ident(currentExceptionMode)operator(.)ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) keyword(new) ident(RubyFixnum)operator(()ident(runtime)operator(,) operator(~)operator(()ident(EXCEPTION_INFINITY)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + ident(RubyFixnum) ident(EXCEPTION_NaN) operator(=) operator(()ident(RubyFixnum)operator(\))ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(EXCEPTION_NaN)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(()ident(longMode) operator(&) ident(EXCEPTION_NaN)operator(.)ident(getLongValue)operator(()operator(\))operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(newExceptionMode) operator(=) operator(()ident(value)operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator(?) operator(()ident(RubyFixnum)operator(\))ident(currentExceptionMode)operator(.)ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(EXCEPTION_NaN)operator(\)) + operator(:) operator(()ident(RubyFixnum)operator(\))ident(currentExceptionMode)operator(.)ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) keyword(new) ident(RubyFixnum)operator(()ident(runtime)operator(,) operator(~)operator(()ident(EXCEPTION_NaN)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + ident(c)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(vpExceptionMode)delimiter(")>operator(,) ident(newExceptionMode)operator(\))operator(;) + keyword(return) ident(newExceptionMode)operator(;) + operator(}) + + type(long) ident(ROUND_MODE) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ROUND_MODE)delimiter(")>operator(\))operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(longMode) operator(==) ident(ROUND_MODE)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(c)operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(vpRoundingMode)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)operator(()ident(value) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type )delimiter(")> operator(+) ident(mode)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( (expected Fixnum\))delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyFixnum) ident(roundingMode) operator(=) operator(()ident(RubyFixnum)operator(\))ident(value)operator(;) + keyword(if) operator(()ident(roundingMode) operator(==) ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ROUND_UP)delimiter(")>operator(\)) operator(||) + ident(roundingMode) operator(==) ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ROUND_DOWN)delimiter(")>operator(\)) operator(||) + ident(roundingMode) operator(==) ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ROUND_FLOOR)delimiter(")>operator(\)) operator(||) + ident(roundingMode) operator(==) ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ROUND_CEILING)delimiter(")>operator(\)) operator(||) + ident(roundingMode) operator(==) ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ROUND_HALF_UP)delimiter(")>operator(\)) operator(||) + ident(roundingMode) operator(==) ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ROUND_HALF_DOWN)delimiter(")>operator(\)) operator(||) + ident(roundingMode) operator(==) ident(clazz)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ROUND_HALF_EVEN)delimiter(")>operator(\))operator(\)) operator({) + ident(c)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(vpRoundingMode)delimiter(")>operator(,) ident(roundingMode)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(invalid rounding mode)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(c)operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(vpRoundingMode)delimiter(")>operator(\))operator(;) + operator(}) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(first argument for BigDecimal#mode invalid)delimiter(")>operator(\))operator(;) + operator(}) + + directive(private) type(RoundingMode) ident(getRoundingMode)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyFixnum) ident(roundingMode) operator(=) operator(()ident(RubyFixnum)operator(\))ident(runtime)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(BigDecimal)delimiter(")>operator(\)) + operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(vpRoundingMode)delimiter(")>operator(\))operator(;) + keyword(return) type(RoundingMode)operator(.)ident(valueOf)operator(()operator(()type(int)operator(\))ident(roundingMode)operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(RubyBigDecimal) ident(getVpValue)operator(()ident(IRubyObject) ident(v)operator(,) type(boolean) ident(must)operator(\)) operator({) + keyword(if)operator(()ident(v) keyword(instanceof) ident(RubyBigDecimal)operator(\)) operator({) + keyword(return) operator(()ident(RubyBigDecimal)operator(\))ident(v)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(v) keyword(instanceof) ident(RubyFixnum) operator(||) ident(v) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + type(String) ident(s) operator(=) ident(v)operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(return) ident(newInstance)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(BigDecimal)delimiter(")>operator(\))operator(,)keyword(new) ident(IRubyObject)type([])operator({)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(s)operator(\))operator(})operator(\))operator(;) + operator(}) + keyword(if)operator(()ident(must)operator(\)) operator({) + type(String) ident(err)operator(;) + keyword(if) operator(()ident(isImmediate)operator(()operator(\))operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(err) operator(=) ident(inspect)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(err) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(getBaseName)operator(()operator(\))operator(;) + operator(}) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(err) operator(+) string<delimiter(")content( can't be coerced into BigDecimal)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(private) directive(final) directive(static) type(Pattern) ident(INFINITY_PATTERN) operator(=) type(Pattern)operator(.)ident(compile)operator(()string<delimiter(")content(^([+-]\)?Infinity$)delimiter(")>operator(\))operator(;) + directive(private) directive(final) directive(static) type(Pattern) ident(NUMBER_PATTERN) + operator(=) type(Pattern)operator(.)ident(compile)operator(()string<delimiter(")content(^([+-]?)char(\\\\)content(d*)char(\\\\)content(.?)char(\\\\)content(d*([eE][+-]?\)?)char(\\\\)content(d*\).*)delimiter(")>operator(\))operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyBigDecimal) ident(newInstance)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(BigDecimal) ident(decimal)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(decimal) operator(=) keyword(new) type(BigDecimal)operator(()integer(0)operator(\))operator(;) + operator(}) keyword(else) operator({) + type(String) ident(strValue) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(strValue) operator(=) ident(strValue)operator(.)ident(trim)operator(()operator(\))operator(;) + keyword(if) operator(()string<delimiter(")content(NaN)delimiter(")>operator(.)ident(equals)operator(()ident(strValue)operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + type(Matcher) ident(m) operator(=) ident(INFINITY_PATTERN)operator(.)ident(matcher)operator(()ident(strValue)operator(\))operator(;) + keyword(if) operator(()ident(m)operator(.)ident(matches)operator(()operator(\))operator(\)) operator({) + type(int) ident(sign) operator(=) integer(1)operator(;) + type(String) ident(signGroup) operator(=) ident(m)operator(.)ident(group)operator(()integer(1)operator(\))operator(;) + keyword(if) operator(()string<delimiter(")content(-)delimiter(")>operator(.)ident(equals)operator(()ident(signGroup)operator(\))operator(\)) operator({) + ident(sign) operator(=) operator(-)integer(1)operator(;) + operator(}) + keyword(return) ident(newInfinity)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(sign)operator(\))operator(;) + operator(}) + + comment(// Clean-up string representation so that it could be understood) + comment(// by Java's BigDecimal. Not terribly efficient for now.) + comment(// 1. MRI allows d and D as exponent separators) + ident(strValue) operator(=) ident(strValue)operator(.)ident(replaceFirst)operator(()string<delimiter(")content([dD])delimiter(")>operator(,) string<delimiter(")content(E)delimiter(")>operator(\))operator(;) + comment(// 2. MRI allows underscores anywhere) + ident(strValue) operator(=) ident(strValue)operator(.)ident(replaceAll)operator(()string<delimiter(")content(_)delimiter(")>operator(,) string<delimiter(")delimiter(")>operator(\))operator(;) + comment(// 3. MRI ignores the trailing junk) + ident(strValue) operator(=) ident(NUMBER_PATTERN)operator(.)ident(matcher)operator(()ident(strValue)operator(\))operator(.)ident(replaceFirst)operator(()string<delimiter(")content($1)delimiter(")>operator(\))operator(;) + + keyword(try) operator({) + ident(decimal) operator(=) keyword(new) type(BigDecimal)operator(()ident(strValue)operator(\))operator(;) + operator(}) keyword(catch)operator(()type(NumberFormatException) ident(e)operator(\)) operator({) + ident(decimal) operator(=) keyword(new) type(BigDecimal)operator(()integer(0)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(decimal)operator(.)ident(signum)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + comment(// MRI behavior: -0 and +0 are two different things) + keyword(if) operator(()ident(strValue)operator(.)ident(matches)operator(()string<delimiter(")content(^)char(\\\\)content(s*-.*)delimiter(")>operator(\))operator(\)) operator({) + keyword(return) ident(newZero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(-)integer(1)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(newZero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) integer(1)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(decimal)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(RubyBigDecimal) ident(newZero)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(sign)operator(\)) operator({) + ident(RubyBigDecimal) ident(rbd) operator(=) keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) type(BigDecimal)operator(.)ident(ZERO)operator(\))operator(;) + keyword(if) operator(()ident(sign) operator(<) integer(0)operator(\)) operator({) + ident(rbd)operator(.)ident(zeroSign) operator(=) operator(-)integer(1)operator(;) + operator(}) keyword(else) operator({) + ident(rbd)operator(.)ident(zeroSign) operator(=) integer(1)operator(;) + operator(}) + keyword(return) ident(rbd)operator(;) + operator(}) + + directive(private) directive(static) ident(RubyBigDecimal) ident(newNaN)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyBigDecimal) ident(rbd) operator(=) keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) type(BigDecimal)operator(.)ident(ZERO)operator(\))operator(;) + ident(rbd)operator(.)ident(isNaN) operator(=) keyword(true)operator(;) + keyword(return) ident(rbd)operator(;) + operator(}) + + directive(private) directive(static) ident(RubyBigDecimal) ident(newInfinity)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(sign)operator(\)) operator({) + ident(RubyBigDecimal) ident(rbd) operator(=) keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) type(BigDecimal)operator(.)ident(ZERO)operator(\))operator(;) + keyword(if) operator(()ident(sign) operator(<) integer(0)operator(\)) operator({) + ident(rbd)operator(.)ident(infinitySign) operator(=) operator(-)integer(1)operator(;) + operator(}) keyword(else) operator({) + ident(rbd)operator(.)ident(infinitySign) operator(=) integer(1)operator(;) + operator(}) + keyword(return) ident(rbd)operator(;) + operator(}) + + directive(private) ident(RubyBigDecimal) ident(setResult)operator(()operator(\)) operator({) + keyword(return) ident(setResult)operator(()integer(0)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyBigDecimal) ident(setResult)operator(()type(int) ident(scale)operator(\)) operator({) + type(int) ident(prec) operator(=) ident(RubyFixnum)operator(.)ident(fix2int)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(BigDecimal)delimiter(")>operator(\))operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(vpPrecLimit)delimiter(")>operator(\))operator(\))operator(;) + type(int) ident(prec2) operator(=) type(Math)operator(.)ident(max)operator(()ident(scale)operator(,)ident(prec)operator(\))operator(;) + keyword(if)operator(()ident(prec2) operator(>) integer(0) operator(&&) local_variable(this)operator(.)ident(value)operator(.)ident(scale)operator(()operator(\)) operator(>) operator(()ident(prec2)operator(-)ident(getExponent)operator(()operator(\))operator(\))operator(\)) operator({) + local_variable(this)operator(.)ident(value) operator(=) local_variable(this)operator(.)ident(value)operator(.)ident(setScale)operator(()ident(prec2)operator(-)ident(getExponent)operator(()operator(\))operator(,)type(BigDecimal)operator(.)ident(ROUND_HALF_UP)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(.)ident(hashCode)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(%)delimiter(")>operator(,) string<delimiter(")content(modulo)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_mod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + comment(// TODO: full-precision remainder is 1000x slower than MRI!) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isInfinity)operator(()operator(\)) operator(||) ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(runtime)operator(\))operator(;) + operator(}) + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(arg)operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(arg)operator(,) keyword(true)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(val)operator(.)ident(isInfinity)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isNaN)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isZero)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + comment(// Java and MRI definitions of modulo are different.) + type(BigDecimal) ident(modulo) operator(=) ident(value)operator(.)ident(remainder)operator(()ident(val)operator(.)ident(value)operator(\))operator(;) + keyword(if) operator(()ident(modulo)operator(.)ident(signum)operator(()operator(\)) operator(*) ident(val)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(modulo) operator(=) ident(modulo)operator(.)ident(add)operator(()ident(val)operator(.)ident(value)operator(\))operator(;) + operator(}) + + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) ident(modulo)operator(\))operator(.)ident(setResult)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(remainder)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(remainder)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + comment(// TODO: full-precision remainder is 1000x slower than MRI!) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isInfinity)operator(()operator(\)) operator(||) ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(runtime)operator(\))operator(;) + operator(}) + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(arg)operator(,)keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(remainder)delimiter(")>operator(,) ident(arg)operator(,) keyword(true)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(val)operator(.)ident(isInfinity)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isNaN)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isZero)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + comment(// Java and MRI definitions of remainder are the same.) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) ident(value)operator(.)ident(remainder)operator(()ident(val)operator(.)ident(value)operator(\))operator(\))operator(.)ident(setResult)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(*)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_mul)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(mult2)operator(()ident(context)operator(,) ident(arg)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(mult)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(mult2)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(b)operator(,) ident(IRubyObject) ident(n)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(b)operator(,)keyword(false)operator(\))operator(;) + keyword(if)operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + comment(// TODO: what about n arg?) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(b)operator(\))operator(;) + operator(}) + + type(int) ident(digits) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(n)operator(\))operator(;) + + keyword(if) operator(()ident(isNaN)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(()ident(isInfinity)operator(()operator(\)) operator(&&) ident(val)operator(.)ident(isZero)operator(()operator(\))operator(\)) operator(||) operator(()ident(isZero)operator(()operator(\)) operator(&&) ident(val)operator(.)ident(isInfinity)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isZero)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isZero)operator(()operator(\))operator(\)) operator({) + type(int) ident(sign1) operator(=) ident(isZero)operator(()operator(\))operator(?) ident(zeroSign) operator(:) ident(value)operator(.)ident(signum)operator(()operator(\))operator(;) + type(int) ident(sign2) operator(=) ident(val)operator(.)ident(isZero)operator(()operator(\)) operator(?) ident(val)operator(.)ident(zeroSign) operator(:) ident(val)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\))operator(;) + keyword(return) ident(newZero)operator(()ident(runtime)operator(,) ident(sign1) operator(*) ident(sign2)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isInfinity)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isInfinity)operator(()operator(\))operator(\)) operator({) + type(int) ident(sign1) operator(=) ident(isInfinity)operator(()operator(\)) operator(?) ident(infinitySign) operator(:) ident(value)operator(.)ident(signum)operator(()operator(\))operator(;) + type(int) ident(sign2) operator(=) ident(val)operator(.)ident(isInfinity)operator(()operator(\)) operator(?) ident(val)operator(.)ident(infinitySign) operator(:) ident(val)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\))operator(;) + keyword(return) ident(newInfinity)operator(()ident(runtime)operator(,) ident(sign1) operator(*) ident(sign2)operator(\))operator(;) + operator(}) + + type(BigDecimal) ident(res) operator(=) ident(value)operator(.)ident(multiply)operator(()ident(val)operator(.)ident(value)operator(\))operator(;) + keyword(if) operator(()ident(res)operator(.)ident(precision)operator(()operator(\)) operator(>) ident(digits)operator(\)) operator({) + comment(// TODO: rounding mode should not be hard-coded. See #mode.) + ident(res) operator(=) ident(res)operator(.)ident(round)operator(()keyword(new) type(MathContext)operator(()ident(digits)operator(,) type(RoundingMode)operator(.)ident(HALF_UP)operator(\))operator(\))operator(;) + operator(}) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) ident(res)operator(\))operator(.)ident(setResult)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(**)delimiter(")>operator(,) string<delimiter(")content(power)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_pow)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(arg) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type )delimiter(")> operator(+) ident(arg)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( (expected Fixnum\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isNaN)operator(()operator(\)) operator(||) ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + type(int) ident(times) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(times) operator(<) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(isZero)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(signum)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(// Note: MRI has a very non-trivial way of calculating the precision,) + comment(// so we use very simple approximation here:) + type(int) ident(precision) operator(=) operator(()operator(-)ident(times) operator(+) integer(4)operator(\)) operator(*) operator(()ident(getAllDigits)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(+) integer(4)operator(\))operator(;) + + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(value)operator(.)ident(pow)operator(()ident(times)operator(,) keyword(new) type(MathContext)operator(()ident(precision)operator(,) type(RoundingMode)operator(.)ident(HALF_UP)operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(pow)operator(()ident(times)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame)operator(=)keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(op_plus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(b)operator(\)) operator({) + keyword(return) ident(addInternal)operator(()ident(context)operator(,) ident(b)operator(,) string<delimiter(")content(add)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(add)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(frame)operator(=)keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(add2)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(b)operator(,) ident(IRubyObject) ident(digits)operator(\)) operator({) + keyword(return) ident(addInternal)operator(()ident(context)operator(,) ident(b)operator(,) string<delimiter(")content(add)delimiter(")>operator(,) ident(digits)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(addInternal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(b)operator(,) type(String) ident(op)operator(,) ident(IRubyObject) ident(digits)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(prec) operator(=) ident(getPositiveInt)operator(()ident(context)operator(,) ident(digits)operator(\))operator(;) + + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(b)operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + comment(// TODO:) + comment(// MRI behavior: Call "+" or "add", depending on the call.) + comment(// But this leads to exceptions when Floats are added. See:) + comment(// http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/17374) + comment(// return callCoerced(context, op, b, true\); -- this is MRI behavior.) + comment(// We'll use ours for now, thus providing an ability to add Floats.) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(b)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(res) operator(=) ident(handleAddSpecialValues)operator(()ident(val)operator(\))operator(;) + keyword(if) operator(()ident(res) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(res)operator(;) + operator(}) + type(RoundingMode) ident(roundMode) operator(=) ident(getRoundingMode)operator(()ident(runtime)operator(\))operator(;) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) ident(value)operator(.)ident(add)operator(() + ident(val)operator(.)ident(value)operator(,) keyword(new) type(MathContext)operator(()ident(prec)operator(,) ident(roundMode)operator(\))operator(\))operator(\))operator(;) comment(// TODO: why this: .setResult(\);) + operator(}) + + directive(private) type(int) ident(getPositiveInt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(int) ident(value) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(value) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(argument must be positive)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()ident(arg)operator(,) ident(runtime)operator(.)ident(getFixnum)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(IRubyObject) ident(handleAddSpecialValues)operator(()ident(RubyBigDecimal) ident(val)operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isNaN)operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + comment(// TODO: don't calculate the same value 3 times) + keyword(if) operator(()ident(infinitySign) operator(*) ident(val)operator(.)ident(infinitySign) operator(>) integer(0)operator(\)) operator({) + keyword(return) ident(isInfinity)operator(()operator(\)) operator(?) local_variable(this) operator(:) ident(val)operator(;) + operator(}) + keyword(if) operator(()ident(infinitySign) operator(*) ident(val)operator(.)ident(infinitySign) operator(<) integer(0)operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(infinitySign) operator(*) ident(val)operator(.)ident(infinitySign) operator(==) integer(0)operator(\)) operator({) + type(int) ident(sign) operator(=) ident(infinitySign) operator(+) ident(val)operator(.)ident(infinitySign)operator(;) + keyword(if) operator(()ident(sign) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(sign)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+@)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_uplus)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_minus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(arg)operator(,) keyword(false)operator(\))operator(;) + keyword(if)operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(arg)operator(\))operator(;) + operator(}) + ident(RubyBigDecimal) ident(res) operator(=) ident(handleMinusSpecialValues)operator(()ident(val)operator(\))operator(;) + keyword(if) operator(()ident(res) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(res)operator(;) + operator(}) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,)ident(value)operator(.)ident(subtract)operator(()ident(val)operator(.)ident(value)operator(\))operator(\))operator(.)ident(setResult)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(sub2)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(b)operator(,) ident(IRubyObject) ident(n)operator(\)) operator({) + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(b)operator(,) keyword(false)operator(\))operator(;) + keyword(if)operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(b)operator(\))operator(;) + operator(}) + ident(RubyBigDecimal) ident(res) operator(=) ident(handleMinusSpecialValues)operator(()ident(val)operator(\))operator(;) + keyword(if) operator(()ident(res) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(res)operator(;) + operator(}) + + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,)ident(value)operator(.)ident(subtract)operator(()ident(val)operator(.)ident(value)operator(\))operator(\))operator(.)ident(setResult)operator(()operator(\))operator(;) + operator(}) + + directive(private) ident(RubyBigDecimal) ident(handleMinusSpecialValues)operator(()ident(RubyBigDecimal) ident(val)operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(// TODO: 3 times calculate the same value below) + keyword(if) operator(()ident(infinitySign) operator(*) ident(val)operator(.)ident(infinitySign) operator(>) integer(0)operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(infinitySign) operator(*) ident(val)operator(.)ident(infinitySign) operator(<) integer(0)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + keyword(if) operator(()ident(infinitySign) operator(*) ident(val)operator(.)ident(infinitySign) operator(==) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + keyword(if) operator(()ident(val)operator(.)ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(val)operator(.)ident(infinitySign) operator(*) operator(-)integer(1)operator(\))operator(;) + operator(}) + type(int) ident(sign) operator(=) ident(infinitySign) operator(+) ident(val)operator(.)ident(infinitySign)operator(;) + keyword(if) operator(()ident(sign) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(sign)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-@)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_uminus)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(runtime)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(runtime)operator(,) operator(-)ident(infinitySign)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isZero)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newZero)operator(()ident(runtime)operator(,) operator(-)ident(zeroSign)operator(\))operator(;) + operator(}) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(negate)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(/)delimiter(")>operator(,) string<delimiter(")content(quo)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(op_quo)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + comment(// regular division with some default precision) + comment(// TODO: proper algorithm to set the precision) + keyword(return) ident(op_div)operator(()ident(context)operator(,) ident(other)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(200)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(div)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_div)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + comment(// integer division) + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(other)operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(div)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isNaN)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isZero)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isInfinity)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) + local_variable(this)operator(.)ident(value)operator(.)ident(divideToIntegralValue)operator(()ident(val)operator(.)ident(value)operator(\))operator(\))operator(.)ident(setResult)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(div)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_div)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(,) ident(IRubyObject) ident(digits)operator(\)) operator({) + comment(// TODO: take BigDecimal.mode into account.) + + type(int) ident(scale) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(digits)operator(\))operator(;) + + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(other)operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isNaN)operator(()operator(\)) operator(||) operator(()ident(isZero)operator(()operator(\)) operator(&&) ident(val)operator(.)ident(isZero)operator(()operator(\))operator(\)) operator(||) ident(val)operator(.)ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(val)operator(.)ident(isZero)operator(()operator(\))operator(\)) operator({) + type(int) ident(sign1) operator(=) ident(isInfinity)operator(()operator(\)) operator(?) ident(infinitySign) operator(:) ident(value)operator(.)ident(signum)operator(()operator(\))operator(;) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(sign1) operator(*) ident(val)operator(.)ident(zeroSign)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isInfinity)operator(()operator(\)) operator(&&) operator(!)ident(val)operator(.)ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(infinitySign) operator(*) ident(val)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(isInfinity)operator(()operator(\)) operator(&&) ident(val)operator(.)ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newZero)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(signum)operator(()operator(\)) operator(*) ident(val)operator(.)ident(infinitySign)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isInfinity)operator(()operator(\)) operator(&&) ident(val)operator(.)ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(scale) operator(==) integer(0)operator(\)) operator({) + comment(// MRI behavior: "If digits is 0, the result is the same as the / operator.") + keyword(return) ident(op_quo)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) keyword(else) operator({) + comment(// TODO: better algorithm to set precision needed) + type(int) ident(prec) operator(=) type(Math)operator(.)ident(max)operator(()integer(200)operator(,) ident(scale)operator(\))operator(;) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(value)operator(.)ident(divide)operator(()ident(val)operator(.)ident(value)operator(,) keyword(new) type(MathContext)operator(()ident(prec)operator(,) type(RoundingMode)operator(.)ident(HALF_UP)operator(\))operator(\))operator(\))operator(.)ident(setResult)operator(()ident(scale)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(IRubyObject) ident(cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(r)operator(,) type(char) ident(op)operator(\)) operator({) + type(int) ident(e) operator(=) integer(0)operator(;) + ident(RubyBigDecimal) ident(rb) operator(=) ident(getVpValue)operator(()ident(r)operator(,)keyword(false)operator(\))operator(;) + keyword(if)operator(()ident(rb) operator(==) keyword(null)operator(\)) operator({) + ident(IRubyObject) ident(ee) operator(=) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,)ident(r)operator(\))operator(;) + keyword(if)operator(()ident(ee)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + ident(e) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(ee)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(isNaN)operator(()operator(\)) operator(|) ident(rb)operator(.)ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(infinitySign) operator(!=) integer(0) operator(||) ident(rb)operator(.)ident(infinitySign) operator(!=) integer(0)operator(\)) operator({) + ident(e) operator(=) ident(infinitySign) operator(-) ident(rb)operator(.)ident(infinitySign)operator(;) + operator(}) keyword(else) operator({) + ident(e) operator(=) ident(value)operator(.)ident(compareTo)operator(()ident(rb)operator(.)ident(value)operator(\))operator(;) + operator(}) + operator(}) + keyword(switch)operator(()ident(op)operator(\)) operator({) + keyword(case) string<delimiter(')content(*)delimiter(')>operator(:) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(e)operator(\))operator(;) + keyword(case) string<delimiter(')content(=)delimiter(')>operator(:) keyword(return) operator(()ident(e)operator(==)integer(0)operator(\))operator(?)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(:)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(case) string<delimiter(')content(!)delimiter(')>operator(:) keyword(return) operator(()ident(e)operator(!=)integer(0)operator(\))operator(?)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(:)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(case) string<delimiter(')content(G)delimiter(')>operator(:) keyword(return) operator(()ident(e)operator(>=)integer(0)operator(\))operator(?)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(:)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(case) string<delimiter(')content(>)delimiter(')>operator(:) keyword(return) operator(()ident(e)operator(>) integer(0)operator(\))operator(?)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(:)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(case) string<delimiter(')content(L)delimiter(')>operator(:) keyword(return) operator(()ident(e)operator(<=)integer(0)operator(\))operator(?)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(:)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(case) string<delimiter(')content(<)delimiter(')>operator(:) keyword(return) operator(()ident(e)operator(<) integer(0)operator(\))operator(?)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(:)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(cmp)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(')content(*)delimiter(')>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(eql?)delimiter(")>operator(,) string<delimiter(")content(==)delimiter(")>operator(,) string<delimiter(")content(===)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(eql_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(cmp)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(')content(=)delimiter(')>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_lt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(cmp)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(')content(<)delimiter(')>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_le)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(cmp)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(')content(L)delimiter(')>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_gt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(cmp)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(')content(>)delimiter(')>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_ge)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(cmp)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(')content(G)delimiter(')>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abs)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(abs)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isNaN)operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(runtime)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(runtime)operator(,) integer(1)operator(\))operator(;) + operator(}) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(abs)operator(()operator(\))operator(\))operator(.)ident(setResult)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ceil)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(ceil)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(infinitySign)operator(\))operator(;) + operator(}) + + type(int) ident(n) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(n) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(value)operator(.)ident(scale)operator(()operator(\)) operator(>) ident(n)operator(\)) operator({) comment(// rounding neccessary) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(value)operator(.)ident(setScale)operator(()ident(n)operator(,) type(RoundingMode)operator(.)ident(CEILING)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(coerce)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(coerce)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(obj)operator(;) + keyword(if)operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + ident(obj) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(other)operator(,)ident(to_f)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(obj) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(getVpValue)operator(()ident(other)operator(,) keyword(true)operator(\))operator(,)local_variable(this)operator(\))operator(;) + operator(}) + keyword(return) ident(obj)operator(;) + operator(}) + + directive(public) type(double) ident(getDoubleValue)operator(()operator(\)) operator({) keyword(return) ident(value)operator(.)ident(doubleValue)operator(()operator(\))operator(;) operator(}) + directive(public) type(long) ident(getLongValue)operator(()operator(\)) operator({) keyword(return) ident(value)operator(.)ident(longValue)operator(()operator(\))operator(;) operator(}) + + directive(public) ident(RubyNumeric) ident(multiplyWith)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyInteger) ident(value)operator(\)) operator({) + keyword(return) operator(()ident(RubyNumeric)operator(\))ident(op_mul)operator(()ident(context)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyNumeric) ident(multiplyWith)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyFloat) ident(value)operator(\)) operator({) + keyword(return) operator(()ident(RubyNumeric)operator(\))ident(op_mul)operator(()ident(context)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyNumeric) ident(multiplyWith)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyBignum) ident(value)operator(\)) operator({) + keyword(return) operator(()ident(RubyNumeric)operator(\))ident(op_mul)operator(()ident(context)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(divmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + comment(// TODO: full-precision divmod is 1000x slower than MRI!) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isInfinity)operator(()operator(\)) operator(||) ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(newNaN)operator(()ident(runtime)operator(\))operator(,) ident(newNaN)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + ident(RubyBigDecimal) ident(val) operator(=) ident(getVpValue)operator(()ident(other)operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(callCoerced)operator(()ident(context)operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(other)operator(,) keyword(true)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(val)operator(.)ident(isInfinity)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isNaN)operator(()operator(\)) operator(||) ident(val)operator(.)ident(isZero)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(newNaN)operator(()ident(runtime)operator(\))operator(,) ident(newNaN)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + + comment(// Java and MRI definitions of divmod are different. ) + type(BigDecimal)type([]) ident(divmod) operator(=) ident(value)operator(.)ident(divideAndRemainder)operator(()ident(val)operator(.)ident(value)operator(\))operator(;) + + type(BigDecimal) ident(div) operator(=) ident(divmod)operator([)integer(0)operator(])operator(;) + type(BigDecimal) ident(mod) operator(=) ident(divmod)operator([)integer(1)operator(])operator(;) + + keyword(if) operator(()ident(mod)operator(.)ident(signum)operator(()operator(\)) operator(*) ident(val)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(div) operator(=) ident(div)operator(.)ident(subtract)operator(()type(BigDecimal)operator(.)ident(ONE)operator(\))operator(;) + ident(mod) operator(=) ident(mod)operator(.)ident(add)operator(()ident(val)operator(.)ident(value)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) + keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) ident(div)operator(\))operator(,) + keyword(new) ident(RubyBigDecimal)operator(()ident(runtime)operator(,) ident(mod)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exponent)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(exponent)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getExponent)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(finite?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(finite_p)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()operator(!)ident(isInfinity)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(floor)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(floor)operator(()ident(IRubyObject)type([])ident(args)operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(infinitySign)operator(\))operator(;) + operator(}) + + type(int) ident(n) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(n) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(value)operator(.)ident(scale)operator(()operator(\)) operator(>) ident(n)operator(\)) operator({) comment(// rounding neccessary) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(value)operator(.)ident(setScale)operator(()ident(n)operator(,) type(RoundingMode)operator(.)ident(FLOOR)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(frac)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(frac)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(infinitySign)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(value)operator(.)ident(scale)operator(()operator(\)) operator(>) integer(0) operator(&&) ident(value)operator(.)ident(precision)operator(()operator(\)) operator(<) ident(value)operator(.)ident(scale)operator(()operator(\))operator(\)) operator({) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + operator(}) + + type(BigDecimal) ident(val) operator(=) ident(value)operator(.)ident(subtract)operator(()operator(()operator(()ident(RubyBigDecimal)operator(\))ident(fix)operator(()operator(\))operator(\))operator(.)ident(value)operator(\))operator(;) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(val)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(infinite?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(infinite_p)operator(()operator(\)) operator({) + keyword(if) operator(()ident(infinitySign) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(infinitySign)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(StringBuilder) ident(val) operator(=) keyword(new) type(StringBuilder)operator(()string<delimiter(")content(#<BigDecimal:)delimiter(")>operator(\))operator(.)ident(append)operator(()type(Integer)operator(.)ident(toHexString)operator(()type(System)operator(.)ident(identityHashCode)operator(()local_variable(this)operator(\))operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(,)delimiter(")>operator(\))operator(;) + ident(val)operator(.)ident(append)operator(()string<delimiter(")content(')delimiter(")>operator(\))operator(.)ident(append)operator(()local_variable(this)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_S)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(')delimiter(")>operator(\))operator(.)ident(append)operator(()string<delimiter(")content(,)delimiter(")>operator(\))operator(;) + + ident(val)operator(.)ident(append)operator(()ident(getSignificantDigits)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(()delimiter(")>operator(\))operator(;) + + type(int) ident(len) operator(=) ident(getAllDigits)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + type(int) ident(pow) operator(=) ident(len) operator(/) integer(4)operator(;) + ident(val)operator(.)ident(append)operator(()operator(()ident(pow) operator(+) integer(1)operator(\)) operator(*) integer(4)operator(\))operator(.)ident(append)operator(()string<delimiter(")content(\))delimiter(")>operator(\))operator(.)ident(append)operator(()string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(val)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nan?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(nan_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isNaN)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nonzero?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(nonzero_p)operator(()operator(\)) operator({) + keyword(return) ident(isZero)operator(()operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(precs)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(precs)operator(()operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(IRubyObject)type([]) ident(array) operator(=) keyword(new) ident(IRubyObject)operator([)integer(2)operator(])operator(;) + + ident(array)operator([)integer(0)operator(]) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()ident(getSignificantDigits)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + + type(int) ident(len) operator(=) ident(getAllDigits)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + type(int) ident(pow) operator(=) ident(len) operator(/) integer(4)operator(;) + ident(array)operator([)integer(1)operator(]) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()operator(()ident(pow) operator(+) integer(1)operator(\)) operator(*) integer(4)operator(\))operator(;) + + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(array)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(round)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(round)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(int) ident(scale) operator(=) ident(args)operator(.)ident(length) operator(>) integer(0) operator(?) ident(num2int)operator(()ident(args)operator([)integer(0)operator(])operator(\)) operator(:) integer(0)operator(;) + type(int) ident(mode) operator(=) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator(?) ident(javaRoundingModeFromRubyRoundingMode)operator(()ident(args)operator([)integer(1)operator(])operator(\)) operator(:) type(BigDecimal)operator(.)ident(ROUND_HALF_UP)operator(;) + comment(// JRUBY-914: Java 1.4 BigDecimal does not allow a negative scale, so we have to simulate it) + keyword(if) operator(()ident(scale) operator(<) integer(0)operator(\)) operator({) + comment(// shift the decimal point just to the right of the digit to be rounded to (divide by 10**(abs(scale\)\)\)) + comment(// -1 -> 10's digit, -2 -> 100's digit, etc.) + type(BigDecimal) ident(normalized) operator(=) ident(value)operator(.)ident(movePointRight)operator(()ident(scale)operator(\))operator(;) + comment(// ...round to that digit) + type(BigDecimal) ident(rounded) operator(=) ident(normalized)operator(.)ident(setScale)operator(()integer(0)operator(,)ident(mode)operator(\))operator(;) + comment(// ...and shift the result back to the left (multiply by 10**(abs(scale\)\)\)) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(rounded)operator(.)ident(movePointLeft)operator(()ident(scale)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(setScale)operator(()ident(scale)operator(,) ident(mode)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(//this relies on the Ruby rounding enumerations == Java ones, which they (currently\) all are) + directive(private) type(int) ident(javaRoundingModeFromRubyRoundingMode)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(num2int)operator(()ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sign)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(sign)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(SIGN_NaN)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(infinitySign) operator(<) integer(0)operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(SIGN_NEGATIVE_INFINITE)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(SIGN_POSITIVE_INFINITE)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(isZero)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(zeroSign) operator(<) integer(0)operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(SIGN_NEGATIVE_ZERO)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(SIGN_POSITIVE_ZERO)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(value)operator(.)ident(signum)operator(()operator(\)) operator(<) integer(0)operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(SIGN_NEGATIVE_FINITE)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(SIGN_POSITIVE_FINITE)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(split)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(split)operator(()operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(IRubyObject)type([]) ident(array) operator(=) keyword(new) ident(IRubyObject)operator([)integer(4)operator(])operator(;) + + comment(// sign) + directive(final) ident(RubyFixnum) ident(sign)operator(;) + keyword(if) operator(()ident(isNaN)operator(\)) operator({) + ident(sign) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + ident(sign) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()ident(infinitySign)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(isZero)operator(()operator(\))operator(\))operator({) + ident(sign) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()ident(zeroSign)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(sign) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()ident(value)operator(.)ident(signum)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(array)operator([)integer(0)operator(]) operator(=) ident(sign)operator(;) + + comment(// significant digits and exponent) + directive(final) ident(RubyString) ident(digits)operator(;) + directive(final) ident(RubyFixnum) ident(exp)operator(;) + keyword(if) operator(()ident(isNaN)operator(()operator(\))operator(\)) operator({) + ident(digits) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(NaN)delimiter(")>operator(\))operator(;) + ident(exp) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + ident(digits) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(Infinity)delimiter(")>operator(\))operator(;) + ident(exp) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(isZero)operator(()operator(\))operator(\))operator({) + ident(digits) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(0)delimiter(")>operator(\))operator(;) + ident(exp) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) operator({) + comment(// normalize the value) + ident(digits) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(getSignificantDigits)operator(()operator(\))operator(\))operator(;) + ident(exp) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()ident(getExponent)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(array)operator([)integer(1)operator(]) operator(=) ident(digits)operator(;) + ident(array)operator([)integer(3)operator(]) operator(=) ident(exp)operator(;) + + comment(// base) + ident(array)operator([)integer(2)operator(]) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()integer(10)operator(\))operator(;) + + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(array)operator(\))operator(;) + operator(}) + + comment(// it doesn't handle special cases) + directive(private) type(String) ident(getSignificantDigits)operator(()operator(\)) operator({) + comment(// TODO: no need to calculate every time.) + type(BigDecimal) ident(val) operator(=) ident(value)operator(.)ident(abs)operator(()operator(\))operator(.)ident(stripTrailingZeros)operator(()operator(\))operator(;) + keyword(return) ident(val)operator(.)ident(unscaledValue)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(String) ident(getAllDigits)operator(()operator(\)) operator({) + comment(// TODO: no need to calculate every time.) + type(BigDecimal) ident(val) operator(=) ident(value)operator(.)ident(abs)operator(()operator(\))operator(;) + keyword(return) ident(val)operator(.)ident(unscaledValue)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + comment(// it doesn't handle special cases) + directive(private) type(int) ident(getExponent)operator(()operator(\)) operator({) + comment(// TODO: no need to calculate every time.) + keyword(if) operator(()ident(isZero)operator(()operator(\))operator(\)) operator({) + keyword(return) integer(0)operator(;) + operator(}) + type(BigDecimal) ident(val) operator(=) ident(value)operator(.)ident(abs)operator(()operator(\))operator(.)ident(stripTrailingZeros)operator(()operator(\))operator(;) + keyword(return) ident(val)operator(.)ident(precision)operator(()operator(\)) operator(-) ident(val)operator(.)ident(scale)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sqrt)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(sqrt)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newFloatDomainError)operator(()string<delimiter(")content((VpSqrt\) SQRT(NaN value\))delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(()ident(isInfinity)operator(()operator(\)) operator(&&) ident(infinitySign) operator(<) integer(0)operator(\)) operator(||) ident(value)operator(.)ident(signum)operator(()operator(\)) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newFloatDomainError)operator(()string<delimiter(")content((VpSqrt\) SQRT(negative value\))delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isInfinity)operator(()operator(\)) operator(&&) ident(infinitySign) operator(>) integer(0)operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(runtime)operator(,) integer(1)operator(\))operator(;) + operator(}) + + comment(// NOTE: MRI's sqrt precision is limited by 100,) + comment(// but we allow values more than 100.) + type(int) ident(n) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(n) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(argument must be positive)delimiter(")>operator(\))operator(;) + operator(}) + + ident(n) operator(+=) integer(4)operator(;) comment(// just in case, add a bit of extra precision) + + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(bigSqrt)operator(()local_variable(this)operator(.)ident(value)operator(,) keyword(new) type(MathContext)operator(()ident(n)operator(,) type(RoundingMode)operator(.)ident(HALF_UP)operator(\))operator(\))operator(\))operator(.)ident(setResult)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_f)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_f)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Double)operator(.)ident(NaN)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(infinitySign) operator(<) integer(0) operator(?) type(Double)operator(.)ident(NEGATIVE_INFINITY) operator(:) type(Double)operator(.)ident(POSITIVE_INFINITY)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isZero)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(zeroSign) operator(<) integer(0) operator(?) operator(-)float(0.0) operator(:) float(0.0)operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(doubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_i)delimiter(")>operator(,) string<delimiter(")content(to_int)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(to_int)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(()operator(\)) operator(||) ident(infinitySign) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(try) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(int2fix)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(longValueExact)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ArithmeticException) ident(ae)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(toBigInteger)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(String) ident(removeTrailingZeroes)operator(()type(String) ident(in)operator(\)) operator({) + keyword(while)operator(()ident(in)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(&&) ident(in)operator(.)ident(charAt)operator(()ident(in)operator(.)ident(length)operator(()operator(\))operator(-)integer(1)operator(\))operator(==)string<delimiter(')content(0)delimiter(')>operator(\)) operator({) + ident(in) operator(=) ident(in)operator(.)ident(substring)operator(()integer(0)operator(,)ident(in)operator(.)ident(length)operator(()operator(\))operator(-)integer(1)operator(\))operator(;) + operator(}) + keyword(return) ident(in)operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(formatHasLeadingPlus)operator(()type(String) ident(format)operator(\)) operator({) + keyword(return) ident(format)operator(.)ident(startsWith)operator(()string<delimiter(")content(+)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(formatHasLeadingSpace)operator(()type(String) ident(format)operator(\)) operator({) + keyword(return) ident(format)operator(.)ident(startsWith)operator(()string<delimiter(")content( )delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(formatHasFloatingPointNotation)operator(()type(String) ident(format)operator(\)) operator({) + keyword(return) ident(format)operator(.)ident(endsWith)operator(()string<delimiter(")content(F)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(int) ident(formatFractionalDigitGroups)operator(()type(String) ident(format)operator(\)) operator({) + type(int) ident(groups) operator(=) integer(0)operator(;) + type(Pattern) ident(p) operator(=) type(Pattern)operator(.)ident(compile)operator(()string<delimiter(")content(()char(\\\\)content(+| \)?()char(\\\\)content(d+\)(E|F\)?)delimiter(")>operator(\))operator(;) + type(Matcher) ident(m) operator(=) ident(p)operator(.)ident(matcher)operator(()ident(format)operator(\))operator(;) + keyword(if) operator(()ident(m)operator(.)ident(matches)operator(()operator(\))operator(\)) operator({) + ident(groups) operator(=) type(Integer)operator(.)ident(parseInt)operator(()ident(m)operator(.)ident(group)operator(()integer(2)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(groups)operator(;) + operator(}) + + directive(private) type(boolean) ident(hasArg)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(args)operator(.)ident(length) operator(!=) integer(0) operator(&&) operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(String) ident(format)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(args)operator([)integer(0)operator(])operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(String) ident(firstArgument)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(hasArg)operator(()ident(args)operator(\))operator(\)) operator({) + keyword(return) ident(format)operator(()ident(args)operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(private) type(boolean) ident(posSpace)operator(()type(String) ident(arg)operator(\)) operator({) + keyword(if) operator(()keyword(null) operator(!=) ident(arg)operator(\)) operator({) + keyword(return) ident(formatHasLeadingSpace)operator(()ident(arg)operator(\))operator(;) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(private) type(boolean) ident(posSign)operator(()type(String) ident(arg)operator(\)) operator({) + keyword(if) operator(()keyword(null) operator(!=) ident(arg)operator(\)) operator({) + keyword(return) ident(formatHasLeadingPlus)operator(()ident(arg)operator(\)) operator(||) ident(posSpace)operator(()ident(arg)operator(\))operator(;) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(private) type(boolean) ident(asEngineering)operator(()type(String) ident(arg)operator(\)) operator({) + keyword(if) operator(()keyword(null) operator(!=) ident(arg)operator(\)) operator({) + keyword(return) operator(!)ident(formatHasFloatingPointNotation)operator(()ident(arg)operator(\))operator(;) + operator(}) + keyword(return) keyword(true)operator(;) + operator(}) + + directive(private) type(int) ident(groups)operator(()type(String) ident(arg)operator(\)) operator({) + keyword(if) operator(()keyword(null) operator(!=) ident(arg)operator(\)) operator({) + keyword(return) ident(formatFractionalDigitGroups)operator(()ident(arg)operator(\))operator(;) + operator(}) + keyword(return) integer(0)operator(;) + operator(}) + + directive(private) type(boolean) ident(isZero)operator(()operator(\)) operator({) + keyword(return) operator(!)ident(isNaN)operator(()operator(\)) operator(&&) operator(!)ident(isInfinity)operator(()operator(\)) operator(&&) operator(()ident(value)operator(.)ident(signum)operator(()operator(\)) operator(==) integer(0)operator(\))operator(;) + operator(}) + + directive(private) type(boolean) ident(isNaN)operator(()operator(\)) operator({) + keyword(return) ident(isNaN)operator(;) + operator(}) + + directive(private) type(boolean) ident(isInfinity)operator(()operator(\)) operator({) + keyword(return) ident(infinitySign) operator(!=) integer(0)operator(;) + operator(}) + + directive(private) type(String) ident(unscaledValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(abs)operator(()operator(\))operator(.)ident(unscaledValue)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(engineeringValue)operator(()type(String) ident(arg)operator(\)) operator({) + type(int) ident(exponent) operator(=) ident(getExponent)operator(()operator(\))operator(;) + type(int) ident(signum) operator(=) ident(value)operator(.)ident(signum)operator(()operator(\))operator(;) + type(StringBuilder) ident(build) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + ident(build)operator(.)ident(append)operator(()ident(signum) operator(==) operator(-)integer(1) operator(?) string<delimiter(")content(-)delimiter(")> operator(:) operator(()ident(signum) operator(==) integer(1) operator(?) operator(()ident(posSign)operator(()ident(arg)operator(\)) operator(?) operator(()ident(posSpace)operator(()ident(arg)operator(\)) operator(?) string<delimiter(")content( )delimiter(")> operator(:) string<delimiter(")content(+)delimiter(")>operator(\)) operator(:) string<delimiter(")delimiter(")>operator(\)) operator(:) string<delimiter(")delimiter(")>operator(\))operator(\))operator(;) + ident(build)operator(.)ident(append)operator(()string<delimiter(")content(0.)delimiter(")>operator(\))operator(;) + keyword(if) operator(()integer(0) operator(==) ident(groups)operator(()ident(arg)operator(\))operator(\)) operator({) + type(String) ident(s) operator(=) ident(removeTrailingZeroes)operator(()ident(unscaledValue)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()string<delimiter(")delimiter(")>operator(.)ident(equals)operator(()ident(s)operator(\))operator(\)) operator({) + ident(build)operator(.)ident(append)operator(()string<delimiter(")content(0)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(build)operator(.)ident(append)operator(()ident(s)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + type(int) ident(index) operator(=) integer(0)operator(;) + type(String) ident(sep) operator(=) string<delimiter(")delimiter(")>operator(;) + keyword(while) operator(()ident(index) operator(<) ident(unscaledValue)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + type(int) ident(next) operator(=) ident(index) operator(+) ident(groups)operator(()ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(next) operator(>) ident(unscaledValue)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + ident(next) operator(=) ident(unscaledValue)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + ident(build)operator(.)ident(append)operator(()ident(sep)operator(\))operator(.)ident(append)operator(()ident(unscaledValue)operator(()operator(\))operator(.)ident(substring)operator(()ident(index)operator(,) ident(next)operator(\))operator(\))operator(;) + ident(sep) operator(=) string<delimiter(")content( )delimiter(")>operator(;) + ident(index) operator(+=) ident(groups)operator(()ident(arg)operator(\))operator(;) + operator(}) + operator(}) + ident(build)operator(.)ident(append)operator(()string<delimiter(")content(E)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(exponent)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(build)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(floatingPointValue)operator(()type(String) ident(arg)operator(\)) operator({) + type(String) ident(values)type([]) operator(=) ident(value)operator(.)ident(abs)operator(()operator(\))operator(.)ident(stripTrailingZeros)operator(()operator(\))operator(.)ident(toPlainString)operator(()operator(\))operator(.)ident(split)operator(()string<delimiter(")char(\\\\)content(.)delimiter(")>operator(\))operator(;) + type(String) ident(whole) operator(=) string<delimiter(")content(0)delimiter(")>operator(;) + keyword(if) operator(()ident(values)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(whole) operator(=) ident(values)operator([)integer(0)operator(])operator(;) + operator(}) + type(String) ident(after) operator(=) string<delimiter(")content(0)delimiter(")>operator(;) + keyword(if) operator(()ident(values)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(after) operator(=) ident(values)operator([)integer(1)operator(])operator(;) + operator(}) + type(int) ident(signum) operator(=) ident(value)operator(.)ident(signum)operator(()operator(\))operator(;) + type(StringBuilder) ident(build) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + ident(build)operator(.)ident(append)operator(()ident(signum) operator(==) operator(-)integer(1) operator(?) string<delimiter(")content(-)delimiter(")> operator(:) operator(()ident(signum) operator(==) integer(1) operator(?) operator(()ident(posSign)operator(()ident(arg)operator(\)) operator(?) operator(()ident(posSpace)operator(()ident(arg)operator(\)) operator(?) string<delimiter(")content( )delimiter(")> operator(:) string<delimiter(")content(+)delimiter(")>operator(\)) operator(:) string<delimiter(")delimiter(")>operator(\)) operator(:) string<delimiter(")delimiter(")>operator(\))operator(\))operator(;) + keyword(if) operator(()ident(groups)operator(()ident(arg)operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(build)operator(.)ident(append)operator(()ident(whole)operator(\))operator(;) + keyword(if) operator(()keyword(null) operator(!=) ident(after)operator(\)) operator({) + ident(build)operator(.)ident(append)operator(()string<delimiter(")content(.)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(after)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + type(int) ident(index) operator(=) integer(0)operator(;) + type(String) ident(sep) operator(=) string<delimiter(")delimiter(")>operator(;) + keyword(while) operator(()ident(index) operator(<) ident(whole)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + type(int) ident(next) operator(=) ident(index) operator(+) ident(groups)operator(()ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(next) operator(>) ident(whole)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + ident(next) operator(=) ident(whole)operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + ident(build)operator(.)ident(append)operator(()ident(sep)operator(\))operator(.)ident(append)operator(()ident(whole)operator(.)ident(substring)operator(()ident(index)operator(,) ident(next)operator(\))operator(\))operator(;) + ident(sep) operator(=) string<delimiter(")content( )delimiter(")>operator(;) + ident(index) operator(+=) ident(groups)operator(()ident(arg)operator(\))operator(;) + operator(}) + keyword(if) operator(()keyword(null) operator(!=) ident(after)operator(\)) operator({) + ident(build)operator(.)ident(append)operator(()string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + ident(index) operator(=) integer(0)operator(;) + ident(sep) operator(=) string<delimiter(")delimiter(")>operator(;) + keyword(while) operator(()ident(index) operator(<) ident(after)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + type(int) ident(next) operator(=) ident(index) operator(+) ident(groups)operator(()ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(next) operator(>) ident(after)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + ident(next) operator(=) ident(after)operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + ident(build)operator(.)ident(append)operator(()ident(sep)operator(\))operator(.)ident(append)operator(()ident(after)operator(.)ident(substring)operator(()ident(index)operator(,) ident(next)operator(\))operator(\))operator(;) + ident(sep) operator(=) string<delimiter(")content( )delimiter(")>operator(;) + ident(index) operator(+=) ident(groups)operator(()ident(arg)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(build)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(String) ident(arg) operator(=) ident(firstArgument)operator(()ident(args)operator(\))operator(;) + keyword(if) operator(()ident(isNaN)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(NaN)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(infinitySign) operator(!=) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(infinitySign) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(-Infinity)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(Infinity)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(isZero)operator(()operator(\))operator(\)) operator({) + type(String) ident(zero) operator(=) string<delimiter(")content(0.0)delimiter(")>operator(;) + keyword(if) operator(()ident(zeroSign) operator(<) integer(0)operator(\)) operator({) + ident(zero) operator(=) string<delimiter(")content(-)delimiter(")> operator(+) ident(zero)operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(zero)operator(\))operator(;) + operator(}) + keyword(if)operator(()ident(asEngineering)operator(()ident(arg)operator(\))operator(\)) operator({) + keyword(return) ident(engineeringValue)operator(()ident(arg)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(floatingPointValue)operator(()ident(arg)operator(\))operator(;) + operator(}) + operator(}) + + comment(// Note: #fix has only no-arg form, but truncate allows optional parameter.) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(fix)operator(()operator(\)) operator({) + keyword(return) ident(truncate)operator(()ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(truncate)operator(()operator(\)) operator({) + keyword(return) ident(truncate)operator(()ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(truncate)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()ident(isNaN)operator(\)) operator({) + keyword(return) ident(newNaN)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isInfinity)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newInfinity)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(infinitySign)operator(\))operator(;) + operator(}) + + type(int) ident(n) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg)operator(\))operator(;) + + type(int) ident(precision) operator(=) ident(value)operator(.)ident(precision)operator(()operator(\)) operator(-) ident(value)operator(.)ident(scale)operator(()operator(\)) operator(+) ident(n)operator(;) + + keyword(if) operator(()ident(precision) operator(>) integer(0)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(value)operator(.)ident(round)operator(()keyword(new) type(MathContext)operator(()ident(precision)operator(,) type(RoundingMode)operator(.)ident(DOWN)operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + comment(// TODO: proper sign) + keyword(return) keyword(new) ident(RubyBigDecimal)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(BigDecimal)operator(.)ident(ZERO)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zero?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(zero_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isZero)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Returns the correctly rounded square root of a positive + * BigDecimal. This method performs the fast <i>Square Root by + * Coupled Newton Iteration</i> algorithm by Timm Ahrendt, from + * the book "Pi, unleashed" by Jörg Arndt in a neat loop. + * <p> + * The code is based on Frans Lelieveld's code , used here with + * permission. + * + * @param squarD The number to get the root from. + * @param rootMC Precision and rounding mode. + * @return the root of the argument number + * @throws ArithmeticException + * if the argument number is negative + * @throws IllegalArgumentException + * if rootMC has precision 0 + */) + directive(public) directive(static) type(BigDecimal) ident(bigSqrt)operator(()type(BigDecimal) ident(squarD)operator(,) type(MathContext) ident(rootMC)operator(\)) operator({) + comment(// General number and precision checking) + type(int) ident(sign) operator(=) ident(squarD)operator(.)ident(signum)operator(()operator(\))operator(;) + keyword(if) operator(()ident(sign) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(throw) keyword(new) type(ArithmeticException)operator(()string<delimiter(")content(Square root of a negative number: )delimiter(")> operator(+) ident(squarD)operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(sign) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(squarD)operator(.)ident(round)operator(()ident(rootMC)operator(\))operator(;) + operator(}) + + type(int) ident(prec) operator(=) ident(rootMC)operator(.)ident(getPrecision)operator(()operator(\))operator(;) comment(// the requested precision) + keyword(if) operator(()ident(prec) operator(==) integer(0)operator(\)) operator({) + keyword(throw) keyword(new) type(IllegalArgumentException)operator(()string<delimiter(")content(Most roots won't have infinite precision = 0)delimiter(")>operator(\))operator(;) + operator(}) + + comment(// Initial precision is that of double numbers 2^63/2 ~ 4E18) + type(int) ident(BITS) operator(=) integer(62)operator(;) comment(// 63-1 an even number of number bits) + type(int) ident(nInit) operator(=) integer(16)operator(;) comment(// precision seems 16 to 18 digits) + type(MathContext) ident(nMC) operator(=) keyword(new) type(MathContext)operator(()integer(18)operator(,) type(RoundingMode)operator(.)ident(HALF_DOWN)operator(\))operator(;) + + comment(// Iteration variables, for the square root x and the reciprocal v) + type(BigDecimal) ident(x) operator(=) keyword(null)operator(,) ident(e) operator(=) keyword(null)operator(;) comment(// initial x: x0 ~ sqrt(\)) + type(BigDecimal) ident(v) operator(=) keyword(null)operator(,) ident(g) operator(=) keyword(null)operator(;) comment(// initial v: v0 = 1/(2*x\)) + + comment(// Estimate the square root with the foremost 62 bits of squarD) + type(BigInteger) ident(bi) operator(=) ident(squarD)operator(.)ident(unscaledValue)operator(()operator(\))operator(;) comment(// bi and scale are a tandem) + type(int) ident(biLen) operator(=) ident(bi)operator(.)ident(bitLength)operator(()operator(\))operator(;) + type(int) ident(shift) operator(=) type(Math)operator(.)ident(max)operator(()integer(0)operator(,) ident(biLen) operator(-) ident(BITS) operator(+) operator(()ident(biLen)operator(%)integer(2) operator(==) integer(0) operator(?) integer(0) operator(:) integer(1)operator(\))operator(\))operator(;) comment(// even shift..) + ident(bi) operator(=) ident(bi)operator(.)ident(shiftRight)operator(()ident(shift)operator(\))operator(;) comment(// ..floors to 62 or 63 bit BigInteger) + + type(double) ident(root) operator(=) type(Math)operator(.)ident(sqrt)operator(()ident(bi)operator(.)ident(doubleValue)operator(()operator(\))operator(\))operator(;) + type(BigDecimal) ident(halfBack) operator(=) keyword(new) type(BigDecimal)operator(()type(BigInteger)operator(.)ident(ONE)operator(.)ident(shiftLeft)operator(()ident(shift)operator(/)integer(2)operator(\))operator(\))operator(;) + + type(int) ident(scale) operator(=) ident(squarD)operator(.)ident(scale)operator(()operator(\))operator(;) + keyword(if) operator(()ident(scale) operator(%) integer(2) operator(==) integer(1)operator(\)) operator({) + ident(root) operator(*=) ident(SQRT_10)operator(;) comment(// 5 -> 2, -5 -> -3 need half a scale more..) + operator(}) + ident(scale) operator(=) operator(()type(int)operator(\)) type(Math)operator(.)ident(floor)operator(()ident(scale)operator(/)integer(2)operator(.)operator(\))operator(;) comment(// ..where 100 -> 10 shifts the scale) + + comment(// Initial x - use double root - multiply by halfBack to unshift - set new scale) + ident(x) operator(=) keyword(new) type(BigDecimal)operator(()ident(root)operator(,) ident(nMC)operator(\))operator(;) + ident(x) operator(=) ident(x)operator(.)ident(multiply)operator(()ident(halfBack)operator(,) ident(nMC)operator(\))operator(;) comment(// x0 ~ sqrt(\)) + keyword(if) operator(()ident(scale) operator(!=) integer(0)operator(\)) operator({) + ident(x) operator(=) ident(x)operator(.)ident(movePointLeft)operator(()ident(scale)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(prec) operator(<) ident(nInit)operator(\)) operator({) comment(// for prec 15 root x0 must surely be OK) + keyword(return) ident(x)operator(.)ident(round)operator(()ident(rootMC)operator(\))operator(;) comment(// return small prec roots without iterations) + operator(}) + + comment(// Initial v - the reciprocal) + ident(v) operator(=) type(BigDecimal)operator(.)ident(ONE)operator(.)ident(divide)operator(()ident(TWO)operator(.)ident(multiply)operator(()ident(x)operator(\))operator(,) ident(nMC)operator(\))operator(;) comment(// v0 = 1/(2*x\)) + + comment(// Collect iteration precisions beforehand) + type(List)operator(<)type(Integer)operator(>) ident(nPrecs) operator(=) keyword(new) type(ArrayList)operator(<)type(Integer)operator(>)operator(()operator(\))operator(;) + + ident(assert) ident(nInit) operator(>) integer(3) operator(:) string<delimiter(")content(Never ending loop!)delimiter(")>operator(;) comment(// assume nInit = 16 <= prec) + + comment(// Let m be the exact digits precision in an earlier! loop) + keyword(for) operator(()type(int) ident(m) operator(=) ident(prec) operator(+) integer(1)operator(;) ident(m) operator(>) ident(nInit)operator(;) ident(m) operator(=) ident(m)operator(/)integer(2) operator(+) operator(()ident(m) operator(>) integer(100) operator(?) integer(1) operator(:) integer(2)operator(\))operator(\)) operator({) + ident(nPrecs)operator(.)ident(add)operator(()ident(m)operator(\))operator(;) + operator(}) + + comment(// The loop of "Square Root by Coupled Newton Iteration") + keyword(for) operator(()type(int) ident(i) operator(=) ident(nPrecs)operator(.)ident(size)operator(()operator(\)) operator(-) integer(1)operator(;) ident(i) operator(>) operator(-)integer(1)operator(;) ident(i)operator(--)operator(\)) operator({) + comment(// Increase precision - next iteration supplies n exact digits) + ident(nMC) operator(=) keyword(new) type(MathContext)operator(()ident(nPrecs)operator(.)ident(get)operator(()ident(i)operator(\))operator(,) operator(()ident(i)operator(%)integer(2) operator(==) integer(1)operator(\)) operator(?) type(RoundingMode)operator(.)ident(HALF_UP) operator(:) + type(RoundingMode)operator(.)ident(HALF_DOWN)operator(\))operator(;) + + comment(// Next x // e = d - x^2) + ident(e) operator(=) ident(squarD)operator(.)ident(subtract)operator(()ident(x)operator(.)ident(multiply)operator(()ident(x)operator(,) ident(nMC)operator(\))operator(,) ident(nMC)operator(\))operator(;) + keyword(if) operator(()ident(i) operator(!=) integer(0)operator(\)) operator({) + ident(x) operator(=) ident(x)operator(.)ident(add)operator(()ident(e)operator(.)ident(multiply)operator(()ident(v)operator(,) ident(nMC)operator(\))operator(\))operator(;) comment(// x += e*v ~ sqrt(\)) + operator(}) keyword(else) operator({) + ident(x) operator(=) ident(x)operator(.)ident(add)operator(()ident(e)operator(.)ident(multiply)operator(()ident(v)operator(,) ident(rootMC)operator(\))operator(,) ident(rootMC)operator(\))operator(;) comment(// root x is ready!) + keyword(break)operator(;) + operator(}) + + comment(// Next v // g = 1 - 2*x*v) + ident(g) operator(=) type(BigDecimal)operator(.)ident(ONE)operator(.)ident(subtract)operator(()ident(TWO)operator(.)ident(multiply)operator(()ident(x)operator(\))operator(.)ident(multiply)operator(()ident(v)operator(,) ident(nMC)operator(\))operator(\))operator(;) + + ident(v) operator(=) ident(v)operator(.)ident(add)operator(()ident(g)operator(.)ident(multiply)operator(()ident(v)operator(,) ident(nMC)operator(\))operator(\))operator(;) comment(// v += g*v ~ 1/2/sqrt(\)) + operator(}) + + keyword(return) ident(x)operator(;) comment(// return sqrt(squarD\) with precision of rootMC) + operator(}) +operator(})comment(// RubyBigdecimal) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.math.BigDecimal)operator(;) +keyword(import) include(java.math.BigInteger)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) + +comment(/** + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Bignum)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Integer)delimiter(")>operator(\)) +directive(public) type(class) class(RubyBignum) directive(extends) ident(RubyInteger) operator({) + directive(public) directive(static) ident(RubyClass) ident(createBignumClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(bignum) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Bignum)delimiter(")>operator(,) ident(runtime)operator(.)ident(getInteger)operator(()operator(\))operator(,) + ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setBignum)operator(()ident(bignum)operator(\))operator(;) + ident(bignum)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(BIGNUM)operator(;) + + ident(bignum)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyBignum)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(bignum)operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(int) ident(BIT_SIZE) operator(=) integer(64)operator(;) + directive(private) directive(static) directive(final) type(long) ident(MAX) operator(=) operator(()integer(1L) operator(<)operator(<) operator(()ident(BIT_SIZE) operator(-) integer(1)operator(\))operator(\)) operator(-) integer(1)operator(;) + directive(private) directive(static) directive(final) type(BigInteger) ident(LONG_MAX) operator(=) type(BigInteger)operator(.)ident(valueOf)operator(()ident(MAX)operator(\))operator(;) + directive(private) directive(static) directive(final) type(BigInteger) ident(LONG_MIN) operator(=) type(BigInteger)operator(.)ident(valueOf)operator(()operator(-)ident(MAX) operator(-) integer(1)operator(\))operator(;) + + directive(private) directive(final) type(BigInteger) ident(value)operator(;) + + directive(public) ident(RubyBignum)operator(()ident(Ruby) ident(runtime)operator(,) type(BigInteger) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getBignum)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + operator(}) + + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(BIGNUM)operator(;) + operator(}) + + directive(public) type(Class)operator(<)operator(?)operator(>) ident(getJavaClass)operator(()operator(\)) operator({) + keyword(return) type(BigInteger)operator(.)ident(class)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyBignum) ident(newBignum)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(value)operator(\)) operator({) + keyword(return) ident(newBignum)operator(()ident(runtime)operator(,) type(BigInteger)operator(.)ident(valueOf)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyBignum) ident(newBignum)operator(()ident(Ruby) ident(runtime)operator(,) type(double) ident(value)operator(\)) operator({) + keyword(return) ident(newBignum)operator(()ident(runtime)operator(,) keyword(new) type(BigDecimal)operator(()ident(value)operator(\))operator(.)ident(toBigInteger)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyBignum) ident(newBignum)operator(()ident(Ruby) ident(runtime)operator(,) type(BigInteger) ident(value)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyBignum)operator(()ident(runtime)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyBignum) ident(newBignum)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(value)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyBignum)operator(()ident(runtime)operator(,) keyword(new) type(BigInteger)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(double) ident(getDoubleValue)operator(()operator(\)) operator({) + keyword(return) ident(big2dbl)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) type(long) ident(getLongValue)operator(()operator(\)) operator({) + keyword(return) ident(big2long)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** Getter for property value. + * @return Value of property value. + */) + directive(public) type(BigInteger) ident(getValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + comment(/* ================ + * Utility Methods + * ================ + */) + + comment(/* If the value will fit in a Fixnum, return one of those. */) + comment(/** rb_big_norm + * + */) + directive(public) directive(static) ident(RubyInteger) ident(bignorm)operator(()ident(Ruby) ident(runtime)operator(,) type(BigInteger) ident(bi)operator(\)) operator({) + keyword(if) operator(()ident(bi)operator(.)ident(compareTo)operator(()ident(LONG_MIN)operator(\)) operator(<) integer(0) operator(||) ident(bi)operator(.)ident(compareTo)operator(()ident(LONG_MAX)operator(\)) operator(>) integer(0)operator(\)) operator({) + keyword(return) ident(newBignum)operator(()ident(runtime)operator(,) ident(bi)operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(bi)operator(.)ident(longValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big2long + * + */) + directive(public) directive(static) type(long) ident(big2long)operator(()ident(RubyBignum) ident(value)operator(\)) operator({) + type(BigInteger) ident(big) operator(=) ident(value)operator(.)ident(getValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(big)operator(.)ident(compareTo)operator(()ident(LONG_MIN)operator(\)) operator(<) integer(0) operator(||) ident(big)operator(.)ident(compareTo)operator(()ident(LONG_MAX)operator(\)) operator(>) integer(0)operator(\)) operator({) + keyword(throw) ident(value)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(bignum too big to convert into `long')delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(big)operator(.)ident(longValue)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_big2dbl + * + */) + directive(public) directive(static) type(double) ident(big2dbl)operator(()ident(RubyBignum) ident(value)operator(\)) operator({) + type(BigInteger) ident(big) operator(=) ident(value)operator(.)ident(getValue)operator(()operator(\))operator(;) + type(double) ident(dbl) operator(=) ident(convertToDouble)operator(()ident(big)operator(\))operator(;) + keyword(if) operator(()ident(dbl) operator(==) type(Double)operator(.)ident(NEGATIVE_INFINITY) operator(||) ident(dbl) operator(==) type(Double)operator(.)ident(POSITIVE_INFINITY)operator(\)) operator({) + ident(value)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(BIGNUM_FROM_FLOAT_RANGE)operator(,) string<delimiter(")content(Bignum out of Float range)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(dbl)operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(checkShiftDown)operator(()ident(RubyBignum) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\)) operator(==) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(value)operator(.)ident(compareTo)operator(()ident(LONG_MIN)operator(\)) operator(<) integer(0) operator(||) ident(value)operator(.)ident(compareTo)operator(()ident(LONG_MAX)operator(\)) operator(>) integer(0)operator(\)) operator({) + keyword(return) ident(other)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\)) operator(>=) integer(0) operator(?) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * BigInteger#doubleValue is _really_ slow currently. + * This is faster, and mostly correct (?\) + */) + directive(static) type(double) ident(convertToDouble)operator(()type(BigInteger) ident(bigint)operator(\)) operator({) + type(byte)type([]) ident(arr) operator(=) ident(bigint)operator(.)ident(toByteArray)operator(()operator(\))operator(;) + type(double) ident(res) operator(=) integer(0)operator(;) + type(double) ident(acc) operator(=) integer(1)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(arr)operator(.)ident(length) operator(-) integer(1)operator(;) ident(i) operator(>) integer(0) operator(;) ident(i)operator(--)operator(\)) + operator({) + ident(res) operator(+=) operator(()type(double)operator(\)) operator(()ident(arr)operator([)ident(i)operator(]) operator(&) hex(0xff)operator(\)) operator(*) ident(acc)operator(;) + ident(acc) operator(*=) integer(256)operator(;) + operator(}) + ident(res) operator(+=) operator(()type(double)operator(\)) ident(arr)operator([)integer(0)operator(]) operator(*) ident(acc)operator(;) comment(// final byte sign is significant) + keyword(return) ident(res)operator(;) + operator(}) + + comment(/** rb_int2big + * + */) + directive(public) directive(static) type(BigInteger) ident(fix2big)operator(()ident(RubyFixnum) ident(arg)operator(\)) operator({) + keyword(return) type(BigInteger)operator(.)ident(valueOf)operator(()ident(arg)operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/* ================ + * Instance Methods + * ================ + */) + + comment(/** rb_big_to_s + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(int) ident(base) operator(=) ident(args)operator(.)ident(length) operator(==) integer(0) operator(?) integer(10) operator(:) ident(num2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(base) operator(<) integer(2) operator(||) ident(base) operator(>) integer(36)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(illegal radix )delimiter(")> operator(+) ident(base)operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(getValue)operator(()operator(\))operator(.)ident(toString)operator(()ident(base)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_coerce + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(coerce)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(coerce)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(newBignum)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(newBignum)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(getValue)operator(()operator(\))operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Can't coerce )delimiter(")> operator(+) ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( to Bignum)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** rb_big_uminus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-@)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_uminus)operator(()operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(negate)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_plus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_plus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(addFixnum)operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(addBignum)operator(()operator(()ident(RubyBignum)operator(\))ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(addFloat)operator(()operator(()ident(RubyFloat)operator(\))ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(addOther)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(addFixnum)operator(()ident(RubyFixnum) ident(other)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(add)operator(()ident(fix2big)operator(()ident(other)operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(addBignum)operator(()ident(RubyBignum) ident(other)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(add)operator(()ident(other)operator(.)ident(value)operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(addFloat)operator(()ident(RubyFloat) ident(other)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(big2dbl)operator(()local_variable(this)operator(\)) operator(+) ident(other)operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(addOther)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_big_minus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_minus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(subtractFixnum)operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(subtractBignum)operator(()operator(()ident(RubyBignum)operator(\))ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(subtractFloat)operator(()operator(()ident(RubyFloat)operator(\))ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(subtractOther)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(subtractFixnum)operator(()ident(RubyFixnum) ident(other)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(subtract)operator(()ident(fix2big)operator(()operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(subtractBignum)operator(()ident(RubyBignum) ident(other)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(subtract)operator(()operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(subtractFloat)operator(()ident(RubyFloat) ident(other)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(big2dbl)operator(()local_variable(this)operator(\)) operator(-) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(subtractOther)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_big_mul + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(*)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_mul)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(multiply)operator(()ident(fix2big)operator(()operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(multiply)operator(()operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(big2dbl)operator(()local_variable(this)operator(\)) operator(*) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** + * rb_big_divide. Shared part for both "/" and "div" operations. + */) + directive(private) ident(IRubyObject) ident(op_divide)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(,) type(String) ident(op)operator(\)) operator({) + ident(assert) operator(()string<delimiter(")content(/)delimiter(")>operator(.)ident(equals)operator(()ident(op)operator(\)) operator(||) string<delimiter(")content(div)delimiter(")>operator(.)ident(equals)operator(()ident(op)operator(\))operator(\))operator(;) + + directive(final) type(BigInteger) ident(otherValue)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(otherValue) operator(=) ident(fix2big)operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(otherValue) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + type(double) ident(div) operator(=) ident(big2dbl)operator(()local_variable(this)operator(\)) operator(/) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(if) operator(()string<delimiter(")content(/)delimiter(")>operator(.)ident(equals)operator(()ident(op)operator(\))operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) + ident(big2dbl)operator(()local_variable(this)operator(\)) operator(/) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(dbl2num)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(div)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) ident(op)operator(,) ident(other)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(otherValue)operator(.)ident(equals)operator(()type(BigInteger)operator(.)ident(ZERO)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + + type(BigInteger)type([]) ident(results) operator(=) ident(value)operator(.)ident(divideAndRemainder)operator(()ident(otherValue)operator(\))operator(;) + + keyword(if) operator(()operator(()ident(value)operator(.)ident(signum)operator(()operator(\)) operator(*) ident(otherValue)operator(.)ident(signum)operator(()operator(\))operator(\)) operator(==) operator(-)integer(1) operator(&&) ident(results)operator([)integer(1)operator(])operator(.)ident(signum)operator(()operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(results)operator([)integer(0)operator(])operator(.)ident(subtract)operator(()type(BigInteger)operator(.)ident(ONE)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(results)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + comment(/** rb_big_div + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(/)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_div)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(op_divide)operator(()ident(context)operator(,) ident(other)operator(,) string<delimiter(")content(/)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** rb_big_idiv + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(div)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_idiv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(op_divide)operator(()ident(context)operator(,) ident(other)operator(,) string<delimiter(")content(div)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** rb_big_divmod + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(divmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + directive(final) type(BigInteger) ident(otherValue)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(otherValue) operator(=) ident(fix2big)operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(otherValue) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(otherValue)operator(.)ident(equals)operator(()type(BigInteger)operator(.)ident(ZERO)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + + type(BigInteger)type([]) ident(results) operator(=) ident(value)operator(.)ident(divideAndRemainder)operator(()ident(otherValue)operator(\))operator(;) + + keyword(if) operator(()operator(()ident(value)operator(.)ident(signum)operator(()operator(\)) operator(*) ident(otherValue)operator(.)ident(signum)operator(()operator(\))operator(\)) operator(==) operator(-)integer(1) operator(&&) ident(results)operator([)integer(1)operator(])operator(.)ident(signum)operator(()operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(results)operator([)integer(0)operator(]) operator(=) ident(results)operator([)integer(0)operator(])operator(.)ident(subtract)operator(()type(BigInteger)operator(.)ident(ONE)operator(\))operator(;) + ident(results)operator([)integer(1)operator(]) operator(=) ident(otherValue)operator(.)ident(add)operator(()ident(results)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(bignorm)operator(()ident(runtime)operator(,) ident(results)operator([)integer(0)operator(])operator(\))operator(,) ident(bignorm)operator(()ident(runtime)operator(,) ident(results)operator([)integer(1)operator(])operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_modulo + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(%)delimiter(")>operator(,) string<delimiter(")content(modulo)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_mod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + directive(final) type(BigInteger) ident(otherValue)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(otherValue) operator(=) ident(fix2big)operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(otherValue) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(otherValue)operator(.)ident(equals)operator(()type(BigInteger)operator(.)ident(ZERO)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + type(BigInteger) ident(result) operator(=) ident(value)operator(.)ident(mod)operator(()ident(otherValue)operator(.)ident(abs)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(otherValue)operator(.)ident(signum)operator(()operator(\)) operator(==) operator(-)integer(1) operator(&&) ident(result)operator(.)ident(signum)operator(()operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(result) operator(=) ident(otherValue)operator(.)ident(add)operator(()ident(result)operator(\))operator(;) + operator(}) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(result)operator(\))operator(;) + + operator(}) + + comment(/** rb_big_remainder + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(remainder)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(remainder)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + directive(final) type(BigInteger) ident(otherValue)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(otherValue) operator(=) ident(fix2big)operator(()operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(otherValue) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(remainder)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(otherValue)operator(.)ident(equals)operator(()type(BigInteger)operator(.)ident(ZERO)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(remainder)operator(()ident(otherValue)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_quo + + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(quo)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(quo)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyNumeric)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(big2dbl)operator(()local_variable(this)operator(\)) operator(/) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(quo)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_big_pow + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(**)delimiter(")>operator(,) string<delimiter(")content(power)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_pow)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + type(double) ident(d)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(RubyFixnum) ident(fix) operator(=) operator(()ident(RubyFixnum)operator(\)) ident(other)operator(;) + type(long) ident(fixValue) operator(=) ident(fix)operator(.)ident(getLongValue)operator(()operator(\))operator(;) + comment(// MRI issuses warning here on (RBIGNUM(x\)->len * SIZEOF_BDIGITS * yy > 1024*1024\)) + keyword(if) operator(()operator(()operator(()ident(value)operator(.)ident(bitLength)operator(()operator(\)) operator(+) integer(7)operator(\)) operator(/) integer(8)operator(\)) operator(*) integer(4) operator(*) type(Math)operator(.)ident(abs)operator(()ident(fixValue)operator(\)) operator(>) integer(1024) operator(*) integer(1024)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(MAY_BE_TOO_BIG)operator(,) string<delimiter(")content(in a**b, b may be too big)delimiter(")>operator(,) ident(fixValue)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(fixValue) operator(>=) integer(0)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(pow)operator(()operator(()type(int)operator(\)) ident(fixValue)operator(\))operator(\))operator(;) comment(// num2int is also implemented) + operator(}) keyword(else) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(pow)operator(()ident(big2dbl)operator(()local_variable(this)operator(\))operator(,) operator(()type(double)operator(\))ident(fixValue)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(d) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(MAY_BE_TOO_BIG)operator(,) string<delimiter(")content(in a**b, b may be too big)delimiter(")>operator(,) ident(d)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + ident(d) operator(=) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + + operator(}) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(pow)operator(()ident(big2dbl)operator(()local_variable(this)operator(\))operator(,) ident(d)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_pow + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(**)delimiter(")>operator(,) string<delimiter(")content(power)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(op_pow_19)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(other) operator(==) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(;) + type(double) ident(d)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(RubyFixnum) ident(fix) operator(=) operator(()ident(RubyFixnum)operator(\)) ident(other)operator(;) + type(long) ident(fixValue) operator(=) ident(fix)operator(.)ident(getLongValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(fixValue) operator(<) integer(0)operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalRaw)operator(()ident(runtime)operator(,) local_variable(this)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + comment(// MRI issuses warning here on (RBIGNUM(x\)->len * SIZEOF_BDIGITS * yy > 1024*1024\)) + keyword(if) operator(()operator(()operator(()ident(value)operator(.)ident(bitLength)operator(()operator(\)) operator(+) integer(7)operator(\)) operator(/) integer(8)operator(\)) operator(*) integer(4) operator(*) type(Math)operator(.)ident(abs)operator(()ident(fixValue)operator(\)) operator(>) integer(1024) operator(*) integer(1024)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(MAY_BE_TOO_BIG)operator(,) string<delimiter(")content(in a**b, b may be too big)delimiter(")>operator(,) ident(fixValue)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(fixValue) operator(>=) integer(0)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(runtime)operator(,) ident(value)operator(.)ident(pow)operator(()operator(()type(int)operator(\)) ident(fixValue)operator(\))operator(\))operator(;) comment(// num2int is also implemented) + operator(}) keyword(else) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(runtime)operator(,) type(Math)operator(.)ident(pow)operator(()ident(big2dbl)operator(()local_variable(this)operator(\))operator(,) operator(()type(double)operator(\))ident(fixValue)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(if) operator(()ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalRaw)operator(()ident(runtime)operator(,) local_variable(this)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + ident(d) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(MAY_BE_TOO_BIG)operator(,) string<delimiter(")content(in a**b, b may be too big)delimiter(")>operator(,) ident(d)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + ident(d) operator(=) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + + operator(}) + keyword(return) ident(RubyNumeric)operator(.)ident(dbl2num)operator(()ident(runtime)operator(,) type(Math)operator(.)ident(pow)operator(()ident(big2dbl)operator(()local_variable(this)operator(\))operator(,) ident(d)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_and + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(&)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_and)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(other) operator(=) ident(other)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(and)operator(()operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(and)operator(()ident(fix2big)operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(&)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_big_or + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(|)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_or)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(other) operator(=) ident(other)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(or)operator(()operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) comment(// no bignorm here needed) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(or)operator(()ident(fix2big)operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(|)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_big_xor + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(^)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_xor)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(other) operator(=) ident(other)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(xor)operator(()operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(xor)operator(()type(BigInteger)operator(.)ident(valueOf)operator(()operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(^)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_big_neg + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(~)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_neg)operator(()operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(not)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_lshift + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_lshift)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + type(long) ident(shift)operator(;) + type(boolean) ident(neg) operator(=) keyword(false)operator(;) + + keyword(for) operator(()operator(;)operator(;)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(shift) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shift) operator(<) integer(0)operator(\)) operator({) + ident(neg) operator(=) keyword(true)operator(;) + ident(shift) operator(=) operator(-)ident(shift)operator(;) + operator(}) + keyword(break)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(RubyBignum) ident(otherBignum) operator(=) operator(()ident(RubyBignum)operator(\))ident(other)operator(;) + keyword(if) operator(()ident(otherBignum)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(otherBignum)operator(.)ident(checkShiftDown)operator(()local_variable(this)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(tmp)operator(;) + ident(neg) operator(=) keyword(true)operator(;) + operator(}) + ident(shift) operator(=) ident(big2long)operator(()ident(otherBignum)operator(\))operator(;) + keyword(break)operator(;) + operator(}) + ident(other) operator(=) ident(other)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(neg) operator(?) ident(value)operator(.)ident(shiftRight)operator(()operator(()type(int)operator(\))ident(shift)operator(\)) operator(:) ident(value)operator(.)ident(shiftLeft)operator(()operator(()type(int)operator(\))ident(shift)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_rshift + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_rshift)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + type(long) ident(shift)operator(;) + type(boolean) ident(neg) operator(=) keyword(false)operator(;) + + keyword(for) operator(()operator(;)operator(;)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(shift) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shift) operator(<) integer(0)operator(\)) operator({) + ident(neg) operator(=) keyword(true)operator(;) + ident(shift) operator(=) operator(-)ident(shift)operator(;) + operator(}) + keyword(break)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(RubyBignum) ident(otherBignum) operator(=) operator(()ident(RubyBignum)operator(\))ident(other)operator(;) + keyword(if) operator(()ident(otherBignum)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\)) operator(>=) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(otherBignum)operator(.)ident(checkShiftDown)operator(()local_variable(this)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(tmp)operator(;) + operator(}) keyword(else) operator({) + ident(neg) operator(=) keyword(true)operator(;) + operator(}) + ident(shift) operator(=) ident(big2long)operator(()ident(otherBignum)operator(\))operator(;) + keyword(break)operator(;) + operator(}) + ident(other) operator(=) ident(other)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(neg) operator(?) ident(value)operator(.)ident(shiftLeft)operator(()operator(()type(int)operator(\))ident(shift)operator(\)) operator(:) ident(value)operator(.)ident(shiftRight)operator(()operator(()type(int)operator(\))ident(shift)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_aref + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyFixnum) ident(op_aref)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(if) operator(()operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(.)ident(signum)operator(()operator(\)) operator(>=) integer(0) operator(||) ident(value)operator(.)ident(signum)operator(()operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + type(long) ident(position) operator(=) ident(num2long)operator(()ident(other)operator(\))operator(;) + keyword(if) operator(()ident(position) operator(<) integer(0) operator(||) ident(position) operator(>) type(Integer)operator(.)ident(MAX_VALUE)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(value)operator(.)ident(testBit)operator(()operator(()type(int)operator(\))ident(position)operator(\)) operator(?) ident(RubyFixnum)operator(.)ident(one)operator(()ident(getRuntime)operator(()operator(\))operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_cmp + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + directive(final) type(BigInteger) ident(otherValue)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(otherValue) operator(=) ident(fix2big)operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(otherValue) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(dbl_cmp)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(big2dbl)operator(()local_variable(this)operator(\))operator(,) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(coerceCmp)operator(()ident(context)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(// wow, the only time we can use the java protocol ;\) ) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(compareTo)operator(()ident(otherValue)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_eq + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + directive(final) type(BigInteger) ident(otherValue)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(otherValue) operator(=) ident(fix2big)operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + ident(otherValue) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + type(double) ident(a) operator(=) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(a)operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(a) operator(==) ident(big2dbl)operator(()local_variable(this)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(other)operator(.)ident(op_eqq)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(compareTo)operator(()ident(otherValue)operator(\)) operator(==) integer(0)operator(\))operator(;) + operator(}) + + comment(/** rb_big_eql + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(eql?)delimiter(")>operator(,) string<delimiter(")content(===)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(eql_p)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(compareTo)operator(()operator(()operator(()ident(RubyBignum)operator(\))ident(other)operator(\))operator(.)ident(value)operator(\)) operator(==) integer(0) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_big_hash + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(.)ident(hashCode)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_to_f + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_f)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_f)operator(()operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_abs + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abs)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(abs)operator(()operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(abs)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_big_size + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(size)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()operator(()ident(value)operator(.)ident(bitLength)operator(()operator(\)) operator(+) integer(7)operator(\)) operator(/) integer(8)operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(marshalTo)operator(()ident(RubyBignum) ident(bignum)operator(,) ident(MarshalStream) ident(output)operator(\)) directive(throws) type(IOException) operator({) + ident(output)operator(.)ident(registerLinkTarget)operator(()ident(bignum)operator(\))operator(;) + + ident(output)operator(.)ident(write)operator(()ident(bignum)operator(.)ident(value)operator(.)ident(signum)operator(()operator(\)) operator(>=) integer(0) operator(?) string<delimiter(')content(+)delimiter(')> operator(:) string<delimiter(')content(-)delimiter(')>operator(\))operator(;) + + type(BigInteger) ident(absValue) operator(=) ident(bignum)operator(.)ident(value)operator(.)ident(abs)operator(()operator(\))operator(;) + + type(byte)type([]) ident(digits) operator(=) ident(absValue)operator(.)ident(toByteArray)operator(()operator(\))operator(;) + + type(boolean) ident(oddLengthNonzeroStart) operator(=) operator(()ident(digits)operator(.)ident(length) operator(%) integer(2) operator(!=) integer(0) operator(&&) ident(digits)operator([)integer(0)operator(]) operator(!=) integer(0)operator(\))operator(;) + type(int) ident(shortLength) operator(=) ident(digits)operator(.)ident(length) operator(/) integer(2)operator(;) + keyword(if) operator(()ident(oddLengthNonzeroStart)operator(\)) operator({) + ident(shortLength)operator(++)operator(;) + operator(}) + ident(output)operator(.)ident(writeInt)operator(()ident(shortLength)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(1)operator(;) ident(i) operator(<=) ident(shortLength) operator(*) integer(2) operator(&&) ident(i) operator(<=) ident(digits)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(output)operator(.)ident(write)operator(()ident(digits)operator([)ident(digits)operator(.)ident(length) operator(-) ident(i)operator(])operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(oddLengthNonzeroStart)operator(\)) operator({) + comment(// Pad with a 0) + ident(output)operator(.)ident(write)operator(()integer(0)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(RubyNumeric) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) type(IOException) operator({) + type(boolean) ident(positive) operator(=) ident(input)operator(.)ident(readUnsignedByte)operator(()operator(\)) operator(==) string<delimiter(')content(+)delimiter(')>operator(;) + type(int) ident(shortLength) operator(=) ident(input)operator(.)ident(unmarshalInt)operator(()operator(\))operator(;) + + comment(// BigInteger required a sign byte in incoming array) + type(byte)type([]) ident(digits) operator(=) keyword(new) type(byte)operator([)ident(shortLength) operator(*) integer(2) operator(+) integer(1)operator(])operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) ident(digits)operator(.)ident(length) operator(-) integer(1)operator(;) ident(i) operator(>=) integer(1)operator(;) ident(i)operator(--)operator(\)) operator({) + ident(digits)operator([)ident(i)operator(]) operator(=) ident(input)operator(.)ident(readSignedByte)operator(()operator(\))operator(;) + operator(}) + + type(BigInteger) ident(value) operator(=) keyword(new) type(BigInteger)operator(()ident(digits)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(positive)operator(\)) operator({) + ident(value) operator(=) ident(value)operator(.)ident(negate)operator(()operator(\))operator(;) + operator(}) + + ident(RubyNumeric) ident(result) operator(=) ident(bignorm)operator(()ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Charles O Nutter <headius@headius.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.runtime.Binding)operator(;) +keyword(import) include(org.jruby.runtime.Frame)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Binding)delimiter(")>operator(\)) +directive(public) type(class) class(RubyBinding) directive(extends) ident(RubyObject) operator({) + directive(private) type(Binding) ident(binding)operator(;) + + directive(public) ident(RubyBinding)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) type(Binding) ident(binding)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + + local_variable(this)operator(.)ident(binding) operator(=) ident(binding)operator(;) + operator(}) + + directive(private) ident(RubyBinding)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(BINDING_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(RubyBinding) ident(instance) operator(=) keyword(new) ident(RubyBinding)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + + keyword(return) ident(instance)operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createBindingClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(bindingClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Binding)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(BINDING_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setBinding)operator(()ident(bindingClass)operator(\))operator(;) + + ident(bindingClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyBinding)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(bindingClass)operator(;) + operator(}) + + directive(public) type(Binding) ident(getBinding)operator(()operator(\)) operator({) + keyword(return) ident(binding)operator(;) + operator(}) + + comment(// Proc class) + + directive(public) directive(static) ident(RubyBinding) ident(newBinding)operator(()ident(Ruby) ident(runtime)operator(,) type(Binding) ident(binding)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyBinding)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getBinding)operator(()operator(\))operator(,) ident(binding)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyBinding) ident(newBinding)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + + comment(// FIXME: We should be cloning, not reusing: frame, scope, dynvars, and potentially iter/block info) + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + type(Binding) ident(binding) operator(=) keyword(new) type(Binding)operator(()ident(frame)operator(,) ident(context)operator(.)ident(getBindingRubyClass)operator(()operator(\))operator(,) ident(context)operator(.)ident(getCurrentScope)operator(()operator(\))operator(\))operator(;) + + keyword(return) keyword(new) ident(RubyBinding)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getBinding)operator(()operator(\))operator(,) ident(binding)operator(\))operator(;) + operator(}) + + comment(/** + * Create a binding appropriate for a bare "eval", by using the previous (caller's\) frame and current + * scope. + */) + directive(public) directive(static) ident(RubyBinding) ident(newBindingForEval)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + comment(// This requires some explaining. We use Frame values when executing blocks to fill in ) + comment(// various values in ThreadContext and EvalState.eval like rubyClass, cref, and self.) + comment(// Largely, for an eval that is using the logical binding at a place where the eval is ) + comment(// called we mostly want to use the current frames value for this. Most importantly, ) + comment(// we need that self (JRUBY-858\) at this point. We also need to make sure that returns) + comment(// jump to the right place (which happens to be the previous frame\). Lastly, we do not) + comment(// want the current frames klazz since that will be the klazz represented of self. We) + comment(// want the class right before the eval (well we could use cref class for this too I think\).) + comment(// Once we end up having Frames created earlier I think the logic of stuff like this will) + comment(// be better since we won't be worried about setting Frame to setup other variables/stacks) + comment(// but just making sure Frame itself is correct...) + + type(Frame) ident(previousFrame) operator(=) ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(;) + type(Frame) ident(currentFrame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + ident(currentFrame)operator(.)ident(setKlazz)operator(()ident(previousFrame)operator(.)ident(getKlazz)operator(()operator(\))operator(\))operator(;) + + comment(// Set jump target to whatever the previousTarget thinks is good.) +comment(// currentFrame.setJumpTarget(previousFrame.getJumpTarget(\) != null ? previousFrame.getJumpTarget(\) : previousFrame\);) + + type(Binding) ident(binding) operator(=) keyword(new) type(Binding)operator(()ident(previousFrame)operator(,) ident(context)operator(.)ident(getBindingRubyClass)operator(()operator(\))operator(,) ident(context)operator(.)ident(getCurrentScope)operator(()operator(\))operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(return) keyword(new) ident(RubyBinding)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getBinding)operator(()operator(\))operator(,) ident(binding)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + comment(// FIXME: We should be cloning, not reusing: frame, scope, dynvars, and potentially iter/block info) + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + ident(binding) operator(=) keyword(new) type(Binding)operator(()ident(frame)operator(,) ident(context)operator(.)ident(getBindingRubyClass)operator(()operator(\))operator(,) ident(context)operator(.)ident(getCurrentScope)operator(()operator(\))operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyBinding) ident(otherBinding) operator(=) operator(()ident(RubyBinding)operator(\))ident(other)operator(;) + + ident(binding) operator(=) ident(otherBinding)operator(.)ident(binding)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) + +comment(/** + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)operator({)string<delimiter(")content(TrueClass)delimiter(")>operator(,) string<delimiter(")content(FalseClass)delimiter(")>operator(})operator(\)) +directive(public) type(class) class(RubyBoolean) directive(extends) ident(RubyObject) operator({) + + directive(public) ident(RubyBoolean)operator(()ident(Ruby) ident(runtime)operator(,) type(boolean) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) operator(()ident(value) operator(?) ident(runtime)operator(.)ident(getTrueClass)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getFalseClass)operator(()operator(\))operator(\))operator(,) comment(// Don't initialize with class) + keyword(false)operator(\))operator(;) comment(// Don't put in object space) + + keyword(if) operator(()operator(!)ident(value)operator(\)) ident(flags) operator(=) ident(FALSE_F)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(FALSE_F)operator(\)) operator(==) integer(0) operator(?) ident(ClassIndex)operator(.)ident(TRUE) operator(:) ident(ClassIndex)operator(.)ident(FALSE)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isImmediate)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyClass) ident(getSingletonClass)operator(()operator(\)) operator({) + keyword(return) ident(metaClass)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(Class)operator(<)operator(?)operator(>) ident(getJavaClass)operator(()operator(\)) operator({) + keyword(return) type(boolean)operator(.)ident(class)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(createFalseClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(falseClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(FalseClass)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setFalseClass)operator(()ident(falseClass)operator(\))operator(;) + ident(falseClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(FALSE)operator(;) + + ident(falseClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(False)operator(.)ident(class)operator(\))operator(;) + + ident(falseClass)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(undefineMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + + keyword(return) ident(falseClass)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(createTrueClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(trueClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(TrueClass)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setTrueClass)operator(()ident(trueClass)operator(\))operator(;) + ident(trueClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(TRUE)operator(;) + + ident(trueClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(True)operator(.)ident(class)operator(\))operator(;) + + ident(trueClass)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(undefineMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + + keyword(return) ident(trueClass)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyBoolean) ident(newBoolean)operator(()ident(Ruby) ident(runtime)operator(,) type(boolean) ident(value)operator(\)) operator({) + keyword(return) ident(value) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(class) class(False) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(&)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(false_and)operator(()ident(IRubyObject) ident(f)operator(,) ident(IRubyObject) ident(oth)operator(\)) operator({) + keyword(return) ident(f)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(|)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(false_or)operator(()ident(IRubyObject) ident(f)operator(,) ident(IRubyObject) ident(oth)operator(\)) operator({) + keyword(return) ident(oth)operator(.)ident(isTrue)operator(()operator(\)) operator(?) ident(f)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(f)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(^)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(false_xor)operator(()ident(IRubyObject) ident(f)operator(,) ident(IRubyObject) ident(oth)operator(\)) operator({) + keyword(return) ident(oth)operator(.)ident(isTrue)operator(()operator(\)) operator(?) ident(f)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(f)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(false_to_s)operator(()ident(IRubyObject) ident(f)operator(\)) operator({) + keyword(return) ident(f)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(false)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(class) class(True) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(&)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(true_and)operator(()ident(IRubyObject) ident(t)operator(,) ident(IRubyObject) ident(oth)operator(\)) operator({) + keyword(return) ident(oth)operator(.)ident(isTrue)operator(()operator(\)) operator(?) ident(t) operator(:) ident(t)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(|)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(true_or)operator(()ident(IRubyObject) ident(t)operator(,) ident(IRubyObject) ident(oth)operator(\)) operator({) + keyword(return) ident(t)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(^)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(true_xor)operator(()ident(IRubyObject) ident(t)operator(,) ident(IRubyObject) ident(oth)operator(\)) operator({) + keyword(return) ident(oth)operator(.)ident(isTrue)operator(()operator(\)) operator(?) ident(t)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\)) operator(:) ident(t)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(true_to_s)operator(()ident(IRubyObject) ident(t)operator(\)) operator({) + keyword(return) ident(t)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(true)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Override) + directive(public) ident(RubyFixnum) ident(id)operator(()operator(\)) operator({) + keyword(if) operator(()operator(()ident(flags) operator(&) ident(FALSE_F)operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) integer(2)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(taint)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(freeze)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) type(void) ident(marshalTo)operator(()ident(MarshalStream) ident(output)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(output)operator(.)ident(write)operator(()ident(isTrue)operator(()operator(\)) operator(?) string<delimiter(')content(T)delimiter(')> operator(:) string<delimiter(')content(F)delimiter(')>operator(\))operator(;) + operator(}) +operator(}) + +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.Collection)operator(;) +keyword(import) include(java.util.Collections)operator(;) +keyword(import) include(java.util.Set)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) + +keyword(import) include(org.jruby.internal.runtime.methods.DynamicMethod)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.JavaMethod)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallSite)operator(;) +keyword(import) include(org.jruby.runtime.CallSite.InlineCachingCallSite)operator(;) +keyword(import) include(org.jruby.runtime.CallType)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ObjectMarshal)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.collections.WeakHashSet)operator(;) + +comment(/** + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Class)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Module)delimiter(")>operator(\)) +directive(public) type(class) class(RubyClass) directive(extends) ident(RubyModule) operator({) + directive(public) directive(static) directive(final) type(int) ident(CS_IDX_INITIALIZE) operator(=) integer(0)operator(;) + directive(public) directive(static) directive(final) type(String)type([]) ident(CS_NAMES) operator(=) operator({) + string<delimiter(")content(initialize)delimiter(")> + operator(})operator(;) + directive(private) directive(final) ident(CallSite)type([]) ident(baseCallSites) operator(=) keyword(new) ident(CallSite)operator([)ident(CS_NAMES)operator(.)ident(length)operator(])operator(;) + operator({) + keyword(for)operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(CS_NAMES)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(baseCallSites)operator([)ident(i)operator(]) operator(=) keyword(new) ident(InlineCachingCallSite)operator(()ident(CS_NAMES)operator([)ident(i)operator(])operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(CallSite)type([]) ident(extraCallSites)operator(;) + + directive(public) directive(static) type(void) ident(createClassClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(classClass)operator(\)) operator({) + ident(classClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(CLASS)operator(;) + ident(classClass)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyClass)operator(;) + operator(}) + operator(})operator(;) + + ident(classClass)operator(.)ident(undefineMethod)operator(()string<delimiter(")content(module_function)delimiter(")>operator(\))operator(;) + ident(classClass)operator(.)ident(undefineMethod)operator(()string<delimiter(")content(append_features)delimiter(")>operator(\))operator(;) + ident(classClass)operator(.)ident(undefineMethod)operator(()string<delimiter(")content(extend_object)delimiter(")>operator(\))operator(;) + + ident(classClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyClass)operator(.)ident(class)operator(\))operator(;) + + ident(classClass)operator(.)ident(addMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(,) keyword(new) ident(SpecificArityNew)operator(()ident(classClass)operator(,) type(Visibility)operator(.)ident(PUBLIC)operator(\))operator(\))operator(;) + + comment(// This is a non-standard method; have we decided to start extending Ruby?) + comment(//classClass.defineFastMethod("subclasses", callbackFactory.getFastOptMethod("subclasses"\)\);) + + comment(// FIXME: for some reason this dispatcher causes a VerifyError...) + comment(//classClass.dispatcher = callbackFactory.createDispatcher(classClass\);) + operator(}) + + directive(public) directive(static) directive(final) ident(ObjectAllocator) ident(CLASS_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(RubyClass) ident(clazz) operator(=) keyword(new) ident(RubyClass)operator(()ident(runtime)operator(\))operator(;) + ident(clazz)operator(.)ident(allocator) operator(=) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(;) comment(// Class.allocate object is not allocatable before it is initialized) + keyword(return) ident(clazz)operator(;) + operator(}) + operator(})operator(;) + + directive(public) ident(ObjectAllocator) ident(getAllocator)operator(()operator(\)) operator({) + keyword(return) ident(allocator)operator(;) + operator(}) + + directive(public) type(void) ident(setAllocator)operator(()ident(ObjectAllocator) ident(allocator)operator(\)) operator({) + local_variable(this)operator(.)ident(allocator) operator(=) ident(allocator)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(allocate)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(allocate)operator(()operator(\)) operator({) + keyword(if) operator(()ident(superClass) operator(==) keyword(null)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't instantiate uninitialized class)delimiter(")>operator(\))operator(;) + ident(IRubyObject) ident(obj) operator(=) ident(allocator)operator(.)ident(allocate)operator(()ident(runtime)operator(,) local_variable(this)operator(\))operator(;) + keyword(if) operator(()ident(obj)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\)) operator(!=) ident(getRealClass)operator(()operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong instance allocation)delimiter(")>operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + + directive(public) ident(CallSite)type([]) ident(getBaseCallSites)operator(()operator(\)) operator({) + keyword(return) ident(baseCallSites)operator(;) + operator(}) + + directive(public) ident(CallSite)type([]) ident(getExtraCallSites)operator(()operator(\)) operator({) + keyword(return) ident(extraCallSites)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(CLASS)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isModule)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isClass)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isSingleton)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** boot_defclass + * Create an initial Object meta class before Module and Kernel dependencies have + * squirreled themselves together. + * + * @param runtime we need it + * @return a half-baked meta class for object + */) + directive(public) directive(static) ident(RubyClass) ident(createBootstrapClass)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(RubyClass) ident(superClass)operator(,) ident(ObjectAllocator) ident(allocator)operator(\)) operator({) + ident(RubyClass) ident(obj)operator(;) + + keyword(if) operator(()ident(superClass) operator(==) keyword(null) operator(\)) operator({) comment(// boot the Object class ) + ident(obj) operator(=) keyword(new) ident(RubyClass)operator(()ident(runtime)operator(\))operator(;) + ident(obj)operator(.)ident(marshal) operator(=) ident(DEFAULT_OBJECT_MARSHAL)operator(;) + operator(}) keyword(else) operator({) comment(// boot the Module and Class classes) + ident(obj) operator(=) keyword(new) ident(RubyClass)operator(()ident(runtime)operator(,) ident(superClass)operator(\))operator(;) + operator(}) + ident(obj)operator(.)ident(setAllocator)operator(()ident(allocator)operator(\))operator(;) + ident(obj)operator(.)ident(setBaseName)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + + directive(private) directive(final) ident(Ruby) ident(runtime)operator(;) + directive(private) ident(ObjectAllocator) ident(allocator)operator(;) comment(// the default allocator) + directive(protected) ident(ObjectMarshal) ident(marshal)operator(;) + directive(private) type(Set)operator(<)ident(RubyClass)operator(>) ident(subclasses)operator(;) + + comment(/** separate path for MetaClass and IncludedModuleWrapper construction + * (rb_class_boot version for MetaClasses\) + * no marshal, allocator initialization and addSubclass(this\) here! + */) + directive(protected) ident(RubyClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClass)operator(,) type(boolean) ident(objectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getClassClass)operator(()operator(\))operator(,) ident(objectSpace)operator(\))operator(;) + local_variable(this)operator(.)ident(runtime) operator(=) ident(runtime)operator(;) + local_variable(this)operator(.)ident(superClass) operator(=) ident(superClass)operator(;) comment(// this is the only case it might be null here (in MetaClass construction\)) + operator(}) + + comment(/** used by CLASS_ALLOCATOR (any Class' class will be a Class!\) + * also used to bootstrap Object class + */) + directive(protected) ident(RubyClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getClassClass)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(runtime) operator(=) ident(runtime)operator(;) + ident(index) operator(=) ident(ClassIndex)operator(.)ident(CLASS)operator(;) + operator(}) + + comment(/** rb_class_boot (for plain Classes\) + * also used to bootstrap Module and Class classes + */) + directive(protected) ident(RubyClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClazz)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(\))operator(;) + ident(superClass) operator(=) ident(superClazz)operator(;) + ident(marshal) operator(=) ident(superClazz)operator(.)ident(marshal)operator(;) comment(// use parent's marshal) + ident(superClazz)operator(.)ident(addSubclass)operator(()local_variable(this)operator(\))operator(;) + + ident(infectBy)operator(()ident(superClass)operator(\))operator(;) + operator(}) + + comment(/** + * A constructor which allows passing in an array of supplementary call sites. + */) + directive(protected) ident(RubyClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClazz)operator(,) ident(CallSite)type([]) ident(extraCallSites)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(\))operator(;) + local_variable(this)operator(.)ident(superClass) operator(=) ident(superClazz)operator(;) + local_variable(this)operator(.)ident(marshal) operator(=) ident(superClazz)operator(.)ident(marshal)operator(;) comment(// use parent's marshal) + ident(superClazz)operator(.)ident(addSubclass)operator(()local_variable(this)operator(\))operator(;) + + local_variable(this)operator(.)ident(extraCallSites) operator(=) ident(extraCallSites)operator(;) + + ident(infectBy)operator(()ident(superClass)operator(\))operator(;) + operator(}) + + comment(/** + * Construct a new class with the given name scoped under Object (global\) + * and with Object as its immediate superclass. + * Corresponds to rb_class_new in MRI. + */) + directive(public) directive(static) ident(RubyClass) ident(newClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClass)operator(\)) operator({) + keyword(if) operator(()ident(superClass) operator(==) ident(runtime)operator(.)ident(getClassClass)operator(()operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't make subclass of Class)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(superClass)operator(.)ident(isSingleton)operator(()operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't make subclass of virtual class)delimiter(")>operator(\))operator(;) + keyword(return) keyword(new) ident(RubyClass)operator(()ident(runtime)operator(,) ident(superClass)operator(\))operator(;) + operator(}) + + comment(/** + * A variation on newClass that allow passing in an array of supplementary + * call sites to improve dynamic invocation. + */) + directive(public) directive(static) ident(RubyClass) ident(newClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClass)operator(,) ident(CallSite)type([]) ident(extraCallSites)operator(\)) operator({) + keyword(if) operator(()ident(superClass) operator(==) ident(runtime)operator(.)ident(getClassClass)operator(()operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't make subclass of Class)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(superClass)operator(.)ident(isSingleton)operator(()operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't make subclass of virtual class)delimiter(")>operator(\))operator(;) + keyword(return) keyword(new) ident(RubyClass)operator(()ident(runtime)operator(,) ident(superClass)operator(,) ident(extraCallSites)operator(\))operator(;) + operator(}) + + comment(/** + * Construct a new class with the given name, allocator, parent class, + * and containing class. If setParent is true, the class's parent will be + * explicitly set to the provided parent (rather than the new class just + * being assigned to a constant in that parent\). + * Corresponds to rb_class_new/rb_define_class_id/rb_name_class/rb_set_class_path + * in MRI. + */) + directive(public) directive(static) ident(RubyClass) ident(newClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClass)operator(,) type(String) ident(name)operator(,) ident(ObjectAllocator) ident(allocator)operator(,) ident(RubyModule) ident(parent)operator(,) type(boolean) ident(setParent)operator(\)) operator({) + ident(RubyClass) ident(clazz) operator(=) ident(newClass)operator(()ident(runtime)operator(,) ident(superClass)operator(\))operator(;) + ident(clazz)operator(.)ident(setBaseName)operator(()ident(name)operator(\))operator(;) + ident(clazz)operator(.)ident(setAllocator)operator(()ident(allocator)operator(\))operator(;) + ident(clazz)operator(.)ident(makeMetaClass)operator(()ident(superClass)operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(setParent)operator(\)) ident(clazz)operator(.)ident(setParent)operator(()ident(parent)operator(\))operator(;) + ident(parent)operator(.)ident(setConstant)operator(()ident(name)operator(,) ident(clazz)operator(\))operator(;) + ident(clazz)operator(.)ident(inherit)operator(()ident(superClass)operator(\))operator(;) + keyword(return) ident(clazz)operator(;) + operator(}) + + comment(/** + * A variation on newClass that allows passing in an array of supplementary + * call sites to improve dynamic invocation performance. + */) + directive(public) directive(static) ident(RubyClass) ident(newClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(superClass)operator(,) type(String) ident(name)operator(,) ident(ObjectAllocator) ident(allocator)operator(,) ident(RubyModule) ident(parent)operator(,) type(boolean) ident(setParent)operator(,) ident(CallSite)type([]) ident(extraCallSites)operator(\)) operator({) + ident(RubyClass) ident(clazz) operator(=) ident(newClass)operator(()ident(runtime)operator(,) ident(superClass)operator(,) ident(extraCallSites)operator(\))operator(;) + ident(clazz)operator(.)ident(setBaseName)operator(()ident(name)operator(\))operator(;) + ident(clazz)operator(.)ident(setAllocator)operator(()ident(allocator)operator(\))operator(;) + ident(clazz)operator(.)ident(makeMetaClass)operator(()ident(superClass)operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(setParent)operator(\)) ident(clazz)operator(.)ident(setParent)operator(()ident(parent)operator(\))operator(;) + ident(parent)operator(.)ident(setConstant)operator(()ident(name)operator(,) ident(clazz)operator(\))operator(;) + ident(clazz)operator(.)ident(inherit)operator(()ident(superClass)operator(\))operator(;) + keyword(return) ident(clazz)operator(;) + operator(}) + + comment(/** rb_make_metaclass + * + */) + annotation(@Override) + directive(public) ident(RubyClass) ident(makeMetaClass)operator(()ident(RubyClass) ident(superClass)operator(\)) operator({) + keyword(if) operator(()ident(isSingleton)operator(()operator(\))operator(\)) operator({) comment(// could be pulled down to RubyClass in future) + ident(MetaClass) ident(klass) operator(=) keyword(new) ident(MetaClass)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(superClass)operator(\))operator(;) comment(// rb_class_boot) + ident(setMetaClass)operator(()ident(klass)operator(\))operator(;) + + ident(klass)operator(.)ident(setAttached)operator(()local_variable(this)operator(\))operator(;) + ident(klass)operator(.)ident(setMetaClass)operator(()ident(klass)operator(\))operator(;) + ident(klass)operator(.)ident(setSuperClass)operator(()ident(getSuperClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(klass)operator(;) + operator(}) keyword(else) operator({) + keyword(return) local_variable(super)operator(.)ident(makeMetaClass)operator(()ident(superClass)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Deprecated) + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(int) ident(methodIndex)operator(,) type(String) ident(name)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(CallType) ident(callType)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(invoke)operator(()ident(context)operator(,) ident(self)operator(,) ident(name)operator(,) ident(args)operator(,) ident(callType)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(notVisibleAndNotMethodMissing)operator(()ident(DynamicMethod) ident(method)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(caller)operator(,) ident(CallType) ident(callType)operator(\)) operator({) + keyword(return) operator(!)ident(method)operator(.)ident(isCallableFrom)operator(()ident(caller)operator(,) ident(callType)operator(\)) operator(&&) operator(!)ident(name)operator(.)ident(equals)operator(()string<delimiter(")content(method_missing)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(CallType) ident(callType)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject)type([]) ident(args)operator(,) ident(CallType) ident(callType)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(assert) ident(args) operator(!=) keyword(null)operator(;) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(args)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(assert) ident(args) operator(!=) keyword(null)operator(;) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(args)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg)operator(,) ident(CallType) ident(callType)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(CallType) ident(callType)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(CallType) ident(callType)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(CallType) ident(callType)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject)type([]) ident(args)operator(,) ident(CallType) ident(callType)operator(\)) operator({) + ident(assert) ident(args) operator(!=) keyword(null)operator(;) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(args)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(args)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(assert) ident(args) operator(!=) keyword(null)operator(;) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(args)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(args)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg)operator(,) ident(CallType) ident(callType)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(CallType) ident(callType)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(CallType) ident(callType)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(caller) operator(=) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(caller)operator(,) ident(callType)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finvoke)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) type(String) ident(name)operator(,) + ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(shouldCallMethodMissing)operator(()ident(method)operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(\))operator(;) + operator(}) + + directive(private) type(boolean) ident(shouldCallMethodMissing)operator(()ident(DynamicMethod) ident(method)operator(\)) operator({) + keyword(return) ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(;) + operator(}) + directive(private) type(boolean) ident(shouldCallMethodMissing)operator(()ident(DynamicMethod) ident(method)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(caller)operator(,) ident(CallType) ident(callType)operator(\)) operator({) + keyword(return) ident(method)operator(.)ident(isUndefined)operator(()operator(\)) operator(||) ident(notVisibleAndNotMethodMissing)operator(()ident(method)operator(,) ident(name)operator(,) ident(caller)operator(,) ident(callType)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(invokeInherited)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(subclass)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(searchMethod)operator(()string<delimiter(")content(inherited)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) ident(self)operator(,) ident(method)operator(,) string<delimiter(")content(inherited)delimiter(")>operator(,) ident(subclass)operator(,) ident(context)operator(.)ident(getFrameSelf)operator(()operator(\))operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(self)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) string<delimiter(")content(inherited)delimiter(")>operator(,) ident(subclass)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + comment(/** rb_class_new_instance + * + */) + directive(public) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject) ident(obj) operator(=) ident(allocate)operator(()operator(\))operator(;) + ident(baseCallSites)operator([)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(obj)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + + comment(// TODO: replace this with a smarter generated invoker that can handle 0-N args) + directive(public) directive(static) type(class) class(SpecificArityNew) directive(extends) ident(JavaMethod) operator({) + directive(public) ident(SpecificArityNew)operator(()ident(RubyModule) ident(implClass)operator(,) type(Visibility) ident(visibility)operator(\)) operator({) + local_variable(super)operator(()ident(implClass)operator(,) ident(visibility)operator(\))operator(;) + operator(}) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(cls) operator(=) operator(()ident(RubyClass)operator(\))ident(self)operator(;) + ident(IRubyObject) ident(obj) operator(=) ident(cls)operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(cls)operator(.)ident(baseCallSites)operator([)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(obj)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(cls) operator(=) operator(()ident(RubyClass)operator(\))ident(self)operator(;) + ident(IRubyObject) ident(obj) operator(=) ident(cls)operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(cls)operator(.)ident(baseCallSites)operator([)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(obj)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(cls) operator(=) operator(()ident(RubyClass)operator(\))ident(self)operator(;) + ident(IRubyObject) ident(obj) operator(=) ident(cls)operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(cls)operator(.)ident(baseCallSites)operator([)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(obj)operator(,) ident(arg0)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(cls) operator(=) operator(()ident(RubyClass)operator(\))ident(self)operator(;) + ident(IRubyObject) ident(obj) operator(=) ident(cls)operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(cls)operator(.)ident(baseCallSites)operator([)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(obj)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(cls) operator(=) operator(()ident(RubyClass)operator(\))ident(self)operator(;) + ident(IRubyObject) ident(obj) operator(=) ident(cls)operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(cls)operator(.)ident(baseCallSites)operator([)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(obj)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + operator(}) + + comment(/** rb_class_initialize + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(superClass) operator(!=) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(already initialized class)delimiter(")>operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(superObject)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(superObject) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(superObject) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(checkInheritable)operator(()ident(superObject)operator(\))operator(;) + operator(}) + + ident(RubyClass) ident(superClazz) operator(=) operator(()ident(RubyClass)operator(\)) ident(superObject)operator(;) + + ident(superClass) operator(=) ident(superClazz)operator(;) + ident(allocator) operator(=) ident(superClazz)operator(.)ident(allocator)operator(;) + ident(makeMetaClass)operator(()ident(superClazz)operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + + ident(marshal) operator(=) ident(superClazz)operator(.)ident(marshal)operator(;) + + ident(superClazz)operator(.)ident(addSubclass)operator(()local_variable(this)operator(\))operator(;) + + local_variable(super)operator(.)ident(initialize)operator(()ident(block)operator(\))operator(;) + + ident(inherit)operator(()ident(superClazz)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_class_init_copy + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(original)operator(\))operator({) + keyword(if) operator(()ident(superClass) operator(!=) keyword(null)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(already initialized class)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(original) keyword(instanceof) ident(MetaClass)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't copy singleton class)delimiter(")>operator(\))operator(;) + + local_variable(super)operator(.)ident(initialize_copy)operator(()ident(original)operator(\))operator(;) + ident(allocator) operator(=) operator(()operator(()ident(RubyClass)operator(\))ident(original)operator(\))operator(.)ident(allocator)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(// TODO: Someday, enable.) + comment(// @JRubyMethod(name = "subclasses", optional = 1\)) + directive(public) ident(IRubyObject) ident(subclasses)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(boolean) ident(recursive) operator(=) keyword(false)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyBoolean)operator(\)) operator({) + ident(recursive) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Boolean)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(subclasses)operator(()ident(recursive)operator(\))operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + operator(}) + + directive(public) type(Collection) ident(subclasses)operator(()type(boolean) ident(includeDescendants)operator(\)) operator({) + keyword(if) operator(()ident(subclasses) operator(!=) keyword(null)operator(\)) operator({) + type(Collection)operator(<)ident(RubyClass)operator(>) ident(mine) operator(=) keyword(new) type(ArrayList)operator(<)ident(RubyClass)operator(>)operator(()ident(subclasses)operator(\))operator(;) + keyword(if) operator(()ident(includeDescendants)operator(\)) operator({) + keyword(for) operator(()ident(RubyClass) ident(i)operator(:) ident(subclasses)operator(\)) operator({) + ident(mine)operator(.)ident(addAll)operator(()ident(i)operator(.)ident(subclasses)operator(()ident(includeDescendants)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(mine)operator(;) + operator(}) keyword(else) operator({) + keyword(return) type(Collections)operator(.)ident(EMPTY_LIST)operator(;) + operator(}) + operator(}) + + directive(public) directive(synchronized) type(void) ident(addSubclass)operator(()ident(RubyClass) ident(subclass)operator(\)) operator({) + keyword(if) operator(()ident(subclasses) operator(==) keyword(null)operator(\)) ident(subclasses) operator(=) keyword(new) ident(WeakHashSet)operator(<)ident(RubyClass)operator(>)operator(()operator(\))operator(;) + ident(subclasses)operator(.)ident(add)operator(()ident(subclass)operator(\))operator(;) + operator(}) + + directive(public) ident(Ruby) ident(getClassRuntime)operator(()operator(\)) operator({) + keyword(return) ident(runtime)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(getRealClass)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inherited)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(inherited)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_class_inherited (reversed semantics!\) + * + */) + directive(public) type(void) ident(inherit)operator(()ident(RubyClass) ident(superClazz)operator(\)) operator({) + keyword(if) operator(()ident(superClazz) operator(==) keyword(null)operator(\)) ident(superClazz) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + + ident(superClazz)operator(.)ident(invokeInherited)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(superClazz)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** Return the real super class of this class. + * + * rb_class_superclass + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(superclass)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(superclass)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyClass) ident(superClazz) operator(=) ident(superClass)operator(;) + + keyword(if) operator(()ident(superClazz) operator(==) keyword(null)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(uninitialized class)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(isSingleton)operator(()operator(\))operator(\)) ident(superClazz) operator(=) ident(metaClass)operator(;) + keyword(while) operator(()ident(superClazz) operator(!=) keyword(null) operator(&&) ident(superClazz)operator(.)ident(isIncluded)operator(()operator(\))operator(\)) ident(superClazz) operator(=) ident(superClazz)operator(.)ident(superClass)operator(;) + + keyword(return) ident(superClazz) operator(!=) keyword(null) operator(?) ident(superClazz) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_check_inheritable + * + */) + directive(public) directive(static) type(void) ident(checkInheritable)operator(()ident(IRubyObject) ident(superClass)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(superClass) keyword(instanceof) ident(RubyClass)operator(\))operator(\)) operator({) + keyword(throw) ident(superClass)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(superclass must be a Class ()delimiter(")> operator(+) ident(superClass)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( given\))delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(()operator(()ident(RubyClass)operator(\))ident(superClass)operator(\))operator(.)ident(isSingleton)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(superClass)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't make subclass of virtual class)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(final) ident(ObjectMarshal) ident(getMarshal)operator(()operator(\)) operator({) + keyword(return) ident(marshal)operator(;) + operator(}) + + directive(public) directive(final) type(void) ident(setMarshal)operator(()ident(ObjectMarshal) ident(marshal)operator(\)) operator({) + local_variable(this)operator(.)ident(marshal) operator(=) ident(marshal)operator(;) + operator(}) + + directive(public) directive(final) type(void) ident(marshal)operator(()type(Object) ident(obj)operator(,) ident(MarshalStream) ident(marshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(getMarshal)operator(()operator(\))operator(.)ident(marshalTo)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(obj)operator(,) local_variable(this)operator(,) ident(marshalStream)operator(\))operator(;) + operator(}) + + directive(public) directive(final) type(Object) ident(unmarshal)operator(()ident(UnmarshalStream) ident(unmarshalStream)operator(\)) directive(throws) type(IOException) operator({) + keyword(return) ident(getMarshal)operator(()operator(\))operator(.)ident(unmarshalFrom)operator(()ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(,) ident(unmarshalStream)operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(marshalTo)operator(()ident(RubyClass) ident(clazz)operator(,) ident(MarshalStream) ident(output)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(output)operator(.)ident(registerLinkTarget)operator(()ident(clazz)operator(\))operator(;) + ident(output)operator(.)ident(writeString)operator(()ident(MarshalStream)operator(.)ident(getPathFromClass)operator(()ident(clazz)operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + type(String) ident(name) operator(=) ident(RubyString)operator(.)ident(byteListToString)operator(()ident(input)operator(.)ident(unmarshalString)operator(()operator(\))operator(\))operator(;) + ident(RubyClass) ident(result) operator(=) ident(UnmarshalStream)operator(.)ident(getClassFromPath)operator(()ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(name)operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + directive(protected) directive(static) directive(final) ident(ObjectMarshal) ident(DEFAULT_OBJECT_MARSHAL) operator(=) keyword(new) ident(ObjectMarshal)operator(()operator(\)) operator({) + directive(public) type(void) ident(marshalTo)operator(()ident(Ruby) ident(runtime)operator(,) type(Object) ident(obj)operator(,) ident(RubyClass) ident(type)operator(,) + ident(MarshalStream) ident(marshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(IRubyObject) ident(object) operator(=) operator(()ident(IRubyObject)operator(\))ident(obj)operator(;) + + ident(marshalStream)operator(.)ident(registerLinkTarget)operator(()ident(object)operator(\))operator(;) + ident(marshalStream)operator(.)ident(dumpVariables)operator(()ident(object)operator(.)ident(getVariableList)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(unmarshalFrom)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(,) + ident(UnmarshalStream) ident(unmarshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(IRubyObject) ident(result) operator(=) ident(type)operator(.)ident(allocate)operator(()operator(\))operator(;) + + ident(unmarshalStream)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + + ident(unmarshalStream)operator(.)ident(defaultVariablesUnmarshal)operator(()ident(result)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + operator(})operator(;) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.File)operator(;) +keyword(import) include(java.net.MalformedURLException)operator(;) +keyword(import) include(java.net.URL)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) + +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +directive(public) type(class) class(RubyClassPathVariable) directive(extends) ident(RubyObject) operator({) + directive(public) directive(static) type(void) ident(createClassPathVariable)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClassPathVariable) ident(self) operator(=) keyword(new) ident(RubyClassPathVariable)operator(()ident(runtime)operator(\))operator(;) + ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(.)ident(extend_object)operator(()ident(self)operator(\))operator(;) + ident(runtime)operator(.)ident(defineReadonlyVariable)operator(()string<delimiter(")content($CLASSPATH)delimiter(")>operator(,) ident(self)operator(\))operator(;) + + ident(self)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyClassPathVariable)operator(.)ident(class)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyClassPathVariable)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(append)delimiter(")>operator(,) string<delimiter(")content(<<)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(append)operator(()ident(IRubyObject) ident(obj)operator(\)) directive(throws) type(Exception) operator({) + type(String) ident(ss) operator(=) ident(obj)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + type(URL) ident(url) operator(=) ident(getURL)operator(()ident(ss)operator(\))operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(getJRubyClassLoader)operator(()operator(\))operator(.)ident(addURL)operator(()ident(url)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(private) type(URL) ident(getURL)operator(()type(String) ident(target)operator(\)) directive(throws) type(MalformedURLException) operator({) + keyword(if)operator(()ident(target)operator(.)ident(indexOf)operator(()string<delimiter(")content(://)delimiter(")>operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(return) keyword(new) type(File)operator(()ident(target)operator(\))operator(.)ident(toURI)operator(()operator(\))operator(.)ident(toURL)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) keyword(new) type(URL)operator(()ident(target)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(size)delimiter(")>operator(,) string<delimiter(")content(length)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getJRubyClassLoader)operator(()operator(\))operator(.)ident(getURLs)operator(()operator(\))operator(.)ident(length)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each)operator(()ident(Block) ident(block)operator(\)) operator({) + type(URL)type([]) ident(urls) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getJRubyClassLoader)operator(()operator(\))operator(.)ident(getURLs)operator(()operator(\))operator(;) + ident(ThreadContext) ident(ctx) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(for)operator(()type(int) ident(i)operator(=)integer(0)operator(,)ident(j)operator(=)ident(urls)operator(.)ident(length)operator(;)ident(i)operator(<)ident(j)operator(;)ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(urls)operator([)ident(i)operator(])operator(.)ident(toString)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(return) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(to_a)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + keyword(return) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(to_a)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(;) + operator(}) +operator(})comment(// RubyClassPathVariable) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2006 Thomas E Enebo <enebo@acm.org> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** Implementation of the Comparable module. + * + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Comparable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyComparable) operator({) + directive(public) directive(static) ident(RubyModule) ident(createComparable)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(comparableModule) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Comparable)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setComparable)operator(()ident(comparableModule)operator(\))operator(;) + + ident(comparableModule)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyComparable)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(comparableModule)operator(;) + operator(}) + + comment(/* ================ + * Utility Methods + * ================ + */) + + comment(/** rb_cmpint + * + */) + directive(public) directive(static) type(int) ident(cmpint)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(val)operator(,) ident(IRubyObject) ident(a)operator(,) ident(IRubyObject) ident(b)operator(\)) operator({) + keyword(if) operator(()ident(val)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(cmperr)operator(()ident(a)operator(,) ident(b)operator(\))operator(;) + keyword(if) operator(()ident(val) keyword(instanceof) ident(RubyFixnum)operator(\)) keyword(return) ident(RubyNumeric)operator(.)ident(fix2int)operator(()operator(()ident(RubyFixnum)operator(\)) ident(val)operator(\))operator(;) + keyword(if) operator(()ident(val) keyword(instanceof) ident(RubyBignum)operator(\)) keyword(return) operator(()operator(()ident(RubyBignum)operator(\)) ident(val)operator(\))operator(.)ident(getValue)operator(()operator(\))operator(.)ident(signum)operator(()operator(\)) operator(==) operator(-)integer(1) operator(?) integer(1) operator(:) operator(-)integer(1)operator(;) + + ident(RubyFixnum) ident(zero) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(val)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_GT)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(zero)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) keyword(return) integer(1)operator(;) + keyword(if) operator(()ident(val)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_LT)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(zero)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) keyword(return) operator(-)integer(1)operator(;) + + keyword(return) integer(0)operator(;) + operator(}) + + comment(/** rb_cmperr + * + */) + directive(public) directive(static) ident(IRubyObject) ident(cmperr)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(target)operator(;) + keyword(if) operator(()ident(other)operator(.)ident(isImmediate)operator(()operator(\)) operator(||) operator(!)operator(()ident(other)operator(.)ident(isNil)operator(()operator(\)) operator(||) ident(other)operator(.)ident(isTrue)operator(()operator(\)) operator(||) ident(other) operator(==) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(\))operator(\)) operator({) + ident(target) operator(=) ident(other)operator(.)ident(inspect)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(target) operator(=) ident(other)operator(.)ident(getType)operator(()operator(\))operator(;) + operator(}) + + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(comparison of )delimiter(")> operator(+) ident(recv)operator(.)ident(getType)operator(()operator(\)) operator(+) string<delimiter(")content( with )delimiter(")> operator(+) ident(target) operator(+) string<delimiter(")content( failed)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/* ================ + * Module Methods + * ================ + */) + + comment(/** cmp_equal (cmp_eq inlined here\) + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(recv) operator(==) ident(other)operator(\)) keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(IRubyObject) ident(result) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(runtime)operator(,) ident(cmpint)operator(()ident(context)operator(,) ident(result)operator(,) ident(recv)operator(,) ident(other)operator(\)) operator(==) integer(0)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(e)operator(\)) operator({) + keyword(if) operator(()ident(e)operator(.)ident(getException)operator(()operator(\))operator(.)ident(kind_of_p)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getStandardError)operator(()operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(e)operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** cmp_gt + * + */) + comment(// <=> may return nil in many circumstances, e.g. 3 <=> NaN ) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(op_gt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(cmperr)operator(()ident(recv)operator(,) ident(other)operator(\))operator(;) + + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(cmpint)operator(()ident(context)operator(,) ident(result)operator(,) ident(recv)operator(,) ident(other)operator(\)) operator(>) integer(0)operator(\))operator(;) + operator(}) + + comment(/** cmp_ge + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(op_ge)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(cmperr)operator(()ident(recv)operator(,) ident(other)operator(\))operator(;) + + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(cmpint)operator(()ident(context)operator(,) ident(result)operator(,) ident(recv)operator(,) ident(other)operator(\)) operator(>=) integer(0)operator(\))operator(;) + operator(}) + + comment(/** cmp_lt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(op_lt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(cmperr)operator(()ident(recv)operator(,) ident(other)operator(\))operator(;) + + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(cmpint)operator(()ident(context)operator(,) ident(result)operator(,) ident(recv)operator(,) ident(other)operator(\)) operator(<) integer(0)operator(\))operator(;) + operator(}) + + comment(/** cmp_le + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(op_le)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(cmperr)operator(()ident(recv)operator(,) ident(other)operator(\))operator(;) + + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(cmpint)operator(()ident(context)operator(,) ident(result)operator(,) ident(recv)operator(,) ident(other)operator(\)) operator(<=) integer(0)operator(\))operator(;) + operator(}) + + comment(/** cmp_between + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(between?)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(between_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(first)operator(,) ident(IRubyObject) ident(second)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(op_lt)operator(()ident(context)operator(,) ident(recv)operator(,) ident(first)operator(\))operator(.)ident(isFalse)operator(()operator(\)) operator(&&) ident(op_gt)operator(()ident(context)operator(,) ident(recv)operator(,) ident(second)operator(\))operator(.)ident(isFalse)operator(()operator(\))operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(static) include(org.jruby.util.Numeric.f_abs)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_abs2)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_add)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_arg)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_conjugate)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_denominator)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_div)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_divmod)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_equal_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_exact_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_expt)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_gt_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_inspect)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_lcm)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_mul)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_negate)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_negative_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_numerator)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_one_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_polar)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_quo)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_scalar_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_sub)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_f)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_i)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_r)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_s)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_xor)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_zero_p)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.Frame)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.Numeric)operator(;) + +comment(/** + * 1.9 complex.c as of revision: 18876 + */) + +annotation(@JRubyClass)operator(()ident(name) operator(=) string<delimiter(")content(Complex)delimiter(")>operator(,) ident(parent) operator(=) string<delimiter(")content(Numeric)delimiter(")>operator(\)) +directive(public) type(class) class(RubyComplex) directive(extends) ident(RubyNumeric) operator({) + + directive(public) directive(static) ident(RubyClass) ident(createComplexClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(complexc) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Complex)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNumeric)operator(()operator(\))operator(,) ident(COMPLEX_ALLOCATOR)operator(\))operator(;) comment(// because one can Complex.send(:allocate\)) + ident(runtime)operator(.)ident(setComplex)operator(()ident(complexc)operator(\))operator(;) + + ident(complexc)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(COMPLEX)operator(;) + ident(complexc)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyComplex)operator(;) + operator(}) + operator(})operator(;) + + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(complexc)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(private_class_method)delimiter(")>operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(allocate)delimiter(")>operator(\))operator(\))operator(;) + + ident(complexc)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyComplex)operator(.)ident(class)operator(\))operator(;) + + type(String)type([])ident(undefined) operator(=) operator({)string<delimiter(")content(<)delimiter(")>operator(,) string<delimiter(")content(<=)delimiter(")>operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) string<delimiter(")content(>)delimiter(")>operator(,) string<delimiter(")content(>=)delimiter(")>operator(,) string<delimiter(")content(between?)delimiter(")>operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) + string<delimiter(")content(floor)delimiter(")>operator(,) string<delimiter(")content(ceil)delimiter(")>operator(,) string<delimiter(")content(modulo)delimiter(")>operator(,) string<delimiter(")content(round)delimiter(")>operator(,) string<delimiter(")content(step)delimiter(")>operator(,) string<delimiter(")content(truncate)delimiter(")>operator(})operator(;) + + keyword(for) operator(()type(String) ident(undef) operator(:) ident(undefined)operator(\)) operator({) + ident(complexc)operator(.)ident(undefineMethod)operator(()ident(undef)operator(\))operator(;) + operator(}) + + ident(complexc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(I)delimiter(")>operator(,) ident(RubyComplex)operator(.)ident(newComplexConvert)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(\))operator(;) + + keyword(return) ident(complexc)operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(COMPLEX_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(runtime)operator(,) ident(klass)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + operator(})operator(;) + + comment(/** internal + * + */) + directive(private) ident(RubyComplex)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(real)operator(,) ident(IRubyObject) ident(image)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) operator(()ident(RubyClass)operator(\))ident(clazz)operator(\))operator(;) + local_variable(this)operator(.)ident(real) operator(=) ident(real)operator(;) + local_variable(this)operator(.)ident(image) operator(=) ident(image)operator(;) + operator(}) + + comment(/** rb_complex_raw + * + */) + directive(static) ident(RubyComplex) ident(newComplexRaw)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(x)operator(,) ident(RubyObject) ident(y)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getComplex)operator(()operator(\))operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** rb_complex_raw1 + * + */) + directive(static) ident(RubyComplex) ident(newComplexRaw)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getComplex)operator(()operator(\))operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_complex_new1 + * + */) + directive(public) directive(static) ident(IRubyObject) ident(newComplexCanonicalize)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) ident(newComplexCanonicalize)operator(()ident(context)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_complex_new + * + */) + directive(public) directive(static) ident(IRubyObject) ident(newComplexCanonicalize)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** rb_complex_polar + * + */) + directive(static) ident(IRubyObject) ident(newComplexPolar)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + keyword(return) ident(polar)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** f_complex_new1 + * + */) + directive(static) ident(IRubyObject) ident(newComplex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** f_complex_new2 + * + */) + directive(static) ident(IRubyObject) ident(newComplex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + ident(assert) operator(!)operator(()ident(x) keyword(instanceof) ident(RubyComplex)operator(\))operator(;) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** f_complex_new_bang2 + * + */) + directive(static) ident(RubyComplex) ident(newComplexBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + ident(assert) ident(x) keyword(instanceof) ident(RubyComplex) operator(&&) ident(y) keyword(instanceof) ident(RubyComplex)operator(;) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** f_complex_new_bang1 + * + */) + directive(public) directive(static) ident(RubyComplex) ident(newComplexBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + ident(assert) ident(x) keyword(instanceof) ident(RubyComplex)operator(;) + keyword(return) ident(newComplexBang)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(real)operator(;) + directive(private) ident(IRubyObject) ident(image)operator(;) + + ident(IRubyObject) ident(getImage)operator(()operator(\)) operator({) + keyword(return) ident(image)operator(;) + operator(}) + + ident(IRubyObject) ident(getReal)operator(()operator(\)) operator({) + keyword(return) ident(real)operator(;) + operator(}) + + comment(/** m_cos + * + */) + directive(private) directive(static) ident(IRubyObject) ident(m_cos)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(if) operator(()ident(f_scalar_p)operator(()ident(context)operator(,) ident(x)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) keyword(return) ident(RubyMath)operator(.)ident(cos)operator(()ident(x)operator(,) ident(x)operator(\))operator(;) + ident(RubyComplex) ident(complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(x)operator(;) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(RubyMath)operator(.)ident(cos)operator(()ident(x)operator(,) ident(complex)operator(.)ident(real)operator(\))operator(,) ident(RubyMath)operator(.)ident(cosh)operator(()ident(x)operator(,) ident(complex)operator(.)ident(image)operator(\))operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(f_negate)operator(()ident(context)operator(,) ident(RubyMath)operator(.)ident(sin)operator(()ident(x)operator(,) ident(complex)operator(.)ident(real)operator(\))operator(\))operator(,) ident(RubyMath)operator(.)ident(sinh)operator(()ident(x)operator(,) ident(complex)operator(.)ident(image)operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** m_sin + * + */) + directive(private) directive(static) ident(IRubyObject) ident(m_sin)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(if) operator(()ident(f_scalar_p)operator(()ident(context)operator(,) ident(x)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) keyword(return) ident(RubyMath)operator(.)ident(sin)operator(()ident(x)operator(,) ident(x)operator(\))operator(;) + ident(RubyComplex) ident(complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(x)operator(;) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(RubyMath)operator(.)ident(sin)operator(()ident(x)operator(,) ident(complex)operator(.)ident(real)operator(\))operator(,) ident(RubyMath)operator(.)ident(cosh)operator(()ident(x)operator(,) ident(complex)operator(.)ident(image)operator(\))operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(RubyMath)operator(.)ident(cos)operator(()ident(x)operator(,) ident(complex)operator(.)ident(real)operator(\))operator(,) ident(RubyMath)operator(.)ident(sinh)operator(()ident(x)operator(,) ident(complex)operator(.)ident(image)operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** m_sqrt + * + */) + directive(private) directive(static) ident(IRubyObject) ident(m_sqrt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(if) operator(()ident(f_scalar_p)operator(()ident(context)operator(,) ident(x)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()operator(!)ident(f_negative_p)operator(()ident(context)operator(,) ident(x)operator(\))operator(\)) keyword(return) ident(RubyMath)operator(.)ident(sqrt)operator(()ident(x)operator(,) ident(x)operator(\))operator(;) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) + ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) + ident(RubyMath)operator(.)ident(sqrt)operator(()ident(x)operator(,) ident(f_negate)operator(()ident(context)operator(,) ident(x)operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(RubyComplex) ident(complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(x)operator(;) + keyword(if) operator(()ident(f_negative_p)operator(()ident(context)operator(,) ident(complex)operator(.)ident(image)operator(\))operator(\)) operator({) + keyword(return) ident(f_conjugate)operator(()ident(context)operator(,) ident(m_sqrt)operator(()ident(context)operator(,) ident(f_conjugate)operator(()ident(context)operator(,) ident(x)operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(a) operator(=) ident(f_abs)operator(()ident(context)operator(,) ident(x)operator(\))operator(;) + ident(IRubyObject) ident(two) operator(=) ident(RubyFixnum)operator(.)ident(two)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) + ident(RubyMath)operator(.)ident(sqrt)operator(()ident(x)operator(,) ident(f_div)operator(()ident(context)operator(,) ident(f_add)operator(()ident(context)operator(,) ident(a)operator(,) ident(complex)operator(.)ident(real)operator(\))operator(,) ident(two)operator(\))operator(\))operator(,) + ident(RubyMath)operator(.)ident(sqrt)operator(()ident(x)operator(,) ident(f_div)operator(()ident(context)operator(,) ident(f_sub)operator(()ident(context)operator(,) ident(a)operator(,) ident(complex)operator(.)ident(real)operator(\))operator(,) ident(two)operator(\))operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** nucomp_s_new_bang + * + */) + annotation(@Deprecated) + directive(public) directive(static) ident(IRubyObject) ident(newInstanceBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([])ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) keyword(return) ident(newInstanceBang)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(newInstanceBang)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new!)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstanceBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(real)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(real) keyword(instanceof) ident(RubyNumeric)operator(\))operator(\)) ident(real) operator(=) ident(f_to_i)operator(()ident(context)operator(,) ident(real)operator(\))operator(;) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(recv)operator(,) ident(real)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new!)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstanceBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(real)operator(,) ident(IRubyObject) ident(image)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(real) keyword(instanceof) ident(RubyNumeric)operator(\))operator(\)) ident(real) operator(=) ident(f_to_i)operator(()ident(context)operator(,) ident(real)operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(image) keyword(instanceof) ident(RubyNumeric)operator(\))operator(\)) ident(image) operator(=) ident(f_to_i)operator(()ident(context)operator(,) ident(image)operator(\))operator(;) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(recv)operator(,) ident(real)operator(,) ident(image)operator(\))operator(;) + operator(}) + + comment(/** nucomp_real_check (might go to bimorphic\) + * + */) + directive(private) directive(static) type(void) ident(realCheck)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(num)operator(\)) operator({) + keyword(switch) operator(()ident(num)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(RATIONAL)operator(:) + keyword(break)operator(;) + keyword(default)operator(:) + keyword(if) operator(()operator(!)operator(()ident(num) keyword(instanceof) ident(RubyNumeric) operator(\)) operator(||) operator(!)ident(f_scalar_p)operator(()ident(context)operator(,) ident(num)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(not a real)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** nucomp_s_canonicalize_internal + * + */) + directive(private) directive(static) directive(final) type(boolean) ident(CL_CANNON) operator(=) keyword(true)operator(;) + directive(private) directive(static) ident(IRubyObject) ident(canonicalizeInternal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(real)operator(,) ident(IRubyObject) ident(image)operator(\)) operator({) + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(image)operator(\)) operator(&&) + operator(()operator(()ident(RubyModule)operator(\))ident(clazz)operator(\))operator(.)ident(fastHasConstant)operator(()string<delimiter(")content(Unify)delimiter(")>operator(\)) operator(&&) + operator(()operator(!)ident(CL_CANNON) operator(||) + operator(()operator(!)operator(()ident(real) keyword(instanceof) ident(RubyFloat)operator(\)) operator(&&) + operator(!)operator(()ident(image) keyword(instanceof) ident(RubyFloat)operator(\))operator(\))operator(\))operator(\)) operator({) + keyword(return) ident(real)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(f_scalar_p)operator(()ident(context)operator(,) ident(real)operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(&&) + ident(f_scalar_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(clazz)operator(,) ident(real)operator(,) ident(image)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(f_scalar_p)operator(()ident(context)operator(,) ident(real)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(RubyComplex) ident(complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(image)operator(;) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(clazz)operator(,) + ident(f_sub)operator(()ident(context)operator(,) ident(real)operator(,) ident(complex)operator(.)ident(image)operator(\))operator(,) + ident(f_add)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) ident(complex)operator(.)ident(real)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(f_scalar_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(RubyComplex) ident(complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(real)operator(;) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(clazz)operator(,) + ident(complex)operator(.)ident(real)operator(,) + ident(f_add)operator(()ident(context)operator(,) ident(complex)operator(.)ident(image)operator(,) ident(image)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(RubyComplex) ident(complex1) operator(=) operator(()ident(RubyComplex)operator(\))ident(real)operator(;) + ident(RubyComplex) ident(complex2) operator(=) operator(()ident(RubyComplex)operator(\))ident(image)operator(;) + keyword(return) keyword(new) ident(RubyComplex)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(clazz)operator(,) + ident(f_sub)operator(()ident(context)operator(,) ident(complex1)operator(.)ident(real)operator(,) ident(complex2)operator(.)ident(image)operator(\))operator(,) + ident(f_add)operator(()ident(context)operator(,) ident(complex1)operator(.)ident(image)operator(,) ident(complex2)operator(.)ident(real)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** nucomp_s_new + * + */) + annotation(@Deprecated) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([])ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) keyword(return) ident(newInstance)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(newInstance)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(new)delimiter(")>operator(,) string<delimiter(")content(rect)delimiter(")>operator(,) string<delimiter(")content(rectangular)delimiter(")>operator(})operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(real)operator(\)) operator({) + ident(realCheck)operator(()ident(context)operator(,) ident(real)operator(\))operator(;) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(recv)operator(,) ident(real)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(new)delimiter(")>operator(,) string<delimiter(")content(rect)delimiter(")>operator(,) string<delimiter(")content(rectangular)delimiter(")>operator(})operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(real)operator(,) ident(IRubyObject) ident(image)operator(\)) operator({) + ident(realCheck)operator(()ident(context)operator(,) ident(real)operator(\))operator(;) + ident(realCheck)operator(()ident(context)operator(,) ident(image)operator(\))operator(;) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(recv)operator(,) ident(real)operator(,) ident(image)operator(\))operator(;) + operator(}) + + comment(/** f_complex_polar + * + */) + directive(private) directive(static) ident(IRubyObject) ident(f_complex_polar)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + ident(assert) operator(!)operator(()ident(x) keyword(instanceof) ident(RubyComplex)operator(\)) operator(&&) operator(!)operator(()ident(y) keyword(instanceof) ident(RubyComplex)operator(\))operator(;) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(clazz)operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(x)operator(,) ident(m_cos)operator(()ident(context)operator(,) ident(y)operator(\))operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(x)operator(,) ident(m_sin)operator(()ident(context)operator(,) ident(y)operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** nucomp_s_polar + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(polar)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(polar)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(abs)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(f_complex_polar)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(abs)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + comment(/** rb_Complex1 + * + */) + directive(public) directive(static) ident(IRubyObject) ident(newComplexConvert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) ident(newComplexConvert)operator(()ident(context)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_Complex/rb_Complex2 + * + */) + directive(public) directive(static) ident(IRubyObject) ident(newComplexConvert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + keyword(return) ident(convert)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject)type([])ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) keyword(return) ident(convert)operator(()ident(context)operator(,) ident(clazz)operator(\))operator(;) + keyword(case) integer(1)operator(:) keyword(return) ident(convert)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(convert)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** nucomp_s_convert + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(convert)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(IRubyObject) ident(nil) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(convertCommon)operator(()ident(context)operator(,) ident(recv)operator(,) ident(nil)operator(,) ident(nil)operator(\))operator(;) + operator(}) + + comment(/** nucomp_s_convert + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(convert)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(a1)operator(\)) operator({) + keyword(return) ident(convertCommon)operator(()ident(context)operator(,) ident(recv)operator(,) ident(a1)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** nucomp_s_convert + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(convert)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(a1)operator(,) ident(IRubyObject) ident(a2)operator(\)) operator({) + keyword(return) ident(convertCommon)operator(()ident(context)operator(,) ident(recv)operator(,) ident(a1)operator(,) ident(a2)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(convertCommon)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(a1)operator(,) ident(IRubyObject) ident(a2)operator(\)) operator({) + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + ident(IRubyObject) ident(backref) operator(=) ident(frame)operator(.)ident(getBackRef)operator(()operator(\))operator(;) + keyword(if) operator(()ident(backref) operator(!=) keyword(null) operator(&&) ident(backref) keyword(instanceof) ident(RubyMatchData)operator(\)) operator(()operator(()ident(RubyMatchData)operator(\))ident(backref)operator(\))operator(.)ident(use)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(a1) keyword(instanceof) ident(RubyString)operator(\)) ident(a1) operator(=) ident(str_to_c_strict)operator(()ident(context)operator(,) ident(a1)operator(\))operator(;) + keyword(if) operator(()ident(a2) keyword(instanceof) ident(RubyString)operator(\)) ident(a2) operator(=) ident(str_to_c_strict)operator(()ident(context)operator(,) ident(a2)operator(\))operator(;) + + ident(frame)operator(.)ident(setBackRef)operator(()ident(backref)operator(\))operator(;) + + keyword(if) operator(()ident(a1) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(a1Complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(a1)operator(;) + keyword(if) operator(()operator(!)operator(()ident(a1Complex)operator(.)ident(image) keyword(instanceof) ident(RubyFloat)operator(\)) operator(&&) ident(f_zero_p)operator(()ident(context)operator(,) ident(a1Complex)operator(.)ident(image)operator(\))operator(\)) operator({) + ident(a1) operator(=) ident(a1Complex)operator(.)ident(real)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(a2) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(a2Complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(a2)operator(;) + keyword(if) operator(()operator(!)operator(()ident(a2Complex)operator(.)ident(image) keyword(instanceof) ident(RubyFloat)operator(\)) operator(&&) ident(f_zero_p)operator(()ident(context)operator(,) ident(a2Complex)operator(.)ident(image)operator(\))operator(\)) operator({) + ident(a2) operator(=) ident(a2Complex)operator(.)ident(real)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(a1) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + keyword(if) operator(()ident(a2)operator(.)ident(isNil)operator(()operator(\)) operator(||) ident(f_zero_p)operator(()ident(context)operator(,) ident(a2)operator(\))operator(\)) keyword(return) ident(a1)operator(;) + operator(}) + keyword(return) ident(a2)operator(.)ident(isNil)operator(()operator(\)) operator(?) ident(newInstance)operator(()ident(context)operator(,) ident(recv)operator(,) ident(a1)operator(\)) operator(:) ident(newInstance)operator(()ident(context)operator(,) ident(recv)operator(,) ident(a1)operator(,) ident(a2)operator(\))operator(;) + operator(}) + + comment(/** nucomp_real + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(real)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(real)operator(()operator(\)) operator({) + keyword(return) ident(real)operator(;) + operator(}) + + comment(/** nucomp_image + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(image)delimiter(")>operator(,) string<delimiter(")content(imag)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(image)operator(()operator(\)) operator({) + keyword(return) ident(image)operator(;) + operator(}) + + comment(/** nucomp_add + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_add)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(otherComplex) operator(=) operator(()ident(RubyComplex)operator(\))ident(other)operator(;) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) + ident(f_add)operator(()ident(context)operator(,) ident(real)operator(,) ident(otherComplex)operator(.)ident(real)operator(\))operator(,) + ident(f_add)operator(()ident(context)operator(,) ident(image)operator(,) ident(otherComplex)operator(.)ident(image)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyNumeric) operator(&&) ident(f_scalar_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(f_add)operator(()ident(context)operator(,) ident(real)operator(,) ident(other)operator(\))operator(,) ident(image)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nucomp_sub + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_sub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(otherComplex) operator(=) operator(()ident(RubyComplex)operator(\))ident(other)operator(;) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) + ident(f_sub)operator(()ident(context)operator(,) ident(real)operator(,) ident(otherComplex)operator(.)ident(real)operator(\))operator(,) + ident(f_sub)operator(()ident(context)operator(,) ident(image)operator(,) ident(otherComplex)operator(.)ident(image)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyNumeric) operator(&&) ident(f_scalar_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(f_sub)operator(()ident(context)operator(,) ident(real)operator(,) ident(other)operator(\))operator(,) ident(image)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nucomp_mul + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(*)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_mul)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(otherComplex) operator(=) operator(()ident(RubyComplex)operator(\))ident(other)operator(;) + ident(IRubyObject) ident(realp) operator(=) ident(f_sub)operator(()ident(context)operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(real)operator(,) ident(otherComplex)operator(.)ident(real)operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(image)operator(,) ident(otherComplex)operator(.)ident(image)operator(\))operator(\))operator(;) + ident(IRubyObject) ident(imagep) operator(=) ident(f_add)operator(()ident(context)operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(real)operator(,) ident(otherComplex)operator(.)ident(image)operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(image)operator(,) ident(otherComplex)operator(.)ident(real)operator(\))operator(\))operator(;) + + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(realp)operator(,) ident(imagep)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyNumeric) operator(&&) ident(f_scalar_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(real)operator(,) ident(other)operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(image)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nucomp_div + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(/)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_div)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(otherComplex) operator(=) operator(()ident(RubyComplex)operator(\))ident(other)operator(;) + keyword(if) operator(()ident(real) keyword(instanceof) ident(RubyFloat) operator(||) ident(image) keyword(instanceof) ident(RubyFloat) operator(||) + ident(otherComplex)operator(.)ident(real) keyword(instanceof) ident(RubyFloat) operator(||) ident(otherComplex)operator(.)ident(image) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + ident(IRubyObject) ident(magn) operator(=) ident(RubyMath)operator(.)ident(hypot)operator(()local_variable(this)operator(,) ident(otherComplex)operator(.)ident(real)operator(,) ident(otherComplex)operator(.)ident(image)operator(\))operator(;) + ident(IRubyObject) ident(tmp) operator(=) ident(newComplexBang)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) + ident(f_quo)operator(()ident(context)operator(,) ident(otherComplex)operator(.)ident(real)operator(,) ident(magn)operator(\))operator(,) + ident(f_quo)operator(()ident(context)operator(,) ident(otherComplex)operator(.)ident(image)operator(,) ident(magn)operator(\))operator(\))operator(;) + keyword(return) ident(f_quo)operator(()ident(context)operator(,) ident(f_mul)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(f_conjugate)operator(()ident(context)operator(,) ident(tmp)operator(\))operator(\))operator(,) ident(magn)operator(\))operator(;) + operator(}) + keyword(return) ident(f_quo)operator(()ident(context)operator(,) ident(f_mul)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(f_conjugate)operator(()ident(context)operator(,) ident(other)operator(\))operator(\))operator(,) ident(f_abs2)operator(()ident(context)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyNumeric) operator(&&) ident(f_scalar_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) + ident(f_quo)operator(()ident(context)operator(,) ident(real)operator(,) ident(other)operator(\))operator(,) + ident(f_quo)operator(()ident(context)operator(,) ident(image)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nucomp_fdiv / nucomp_quo + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(fdiv)delimiter(")>operator(,) string<delimiter(")content(quo)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(fdiv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(complex) operator(=) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) + ident(f_to_f)operator(()ident(context)operator(,) ident(real)operator(\))operator(,) + ident(f_to_f)operator(()ident(context)operator(,) ident(image)operator(\))operator(\))operator(;) + + keyword(return) ident(f_div)operator(()ident(context)operator(,) ident(complex)operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nucomp_expt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(**)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_expt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(\)) operator({) + keyword(return) ident(newComplexBang)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyRational) operator(&&) ident(f_one_p)operator(()ident(context)operator(,) ident(f_denominator)operator(()ident(context)operator(,) ident(other)operator(\))operator(\))operator(\)) operator({) + ident(other) operator(=) ident(f_numerator)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyArray) ident(a) operator(=) ident(f_polar)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(convertToArray)operator(()operator(\))operator(;) + ident(IRubyObject) ident(r) operator(=) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + ident(IRubyObject) ident(theta) operator(=) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(;) + ident(RubyComplex) ident(otherComplex) operator(=) operator(()ident(RubyComplex)operator(\))ident(other)operator(;) + ident(IRubyObject) ident(nr) operator(=) ident(RubyMath)operator(.)ident(exp)operator(()local_variable(this)operator(,) ident(f_sub)operator(()ident(context)operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(otherComplex)operator(.)ident(real)operator(,) ident(RubyMath)operator(.)ident(log)operator(()local_variable(this)operator(,) ident(r)operator(\))operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(otherComplex)operator(.)ident(image)operator(,) ident(theta)operator(\))operator(\))operator(\))operator(;) + ident(IRubyObject) ident(ntheta) operator(=) ident(f_add)operator(()ident(context)operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(theta)operator(,) ident(otherComplex)operator(.)ident(real)operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(otherComplex)operator(.)ident(image)operator(,) ident(RubyMath)operator(.)ident(log)operator(()local_variable(this)operator(,) ident(r)operator(\))operator(\))operator(\))operator(;) + keyword(return) ident(polar)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(nr)operator(,) ident(ntheta)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyInteger)operator(\)) operator({) + ident(IRubyObject) ident(one) operator(=) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(f_gt_p)operator(()ident(context)operator(,) ident(other)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(x) operator(=) local_variable(this)operator(;) + ident(IRubyObject) ident(z) operator(=) ident(x)operator(;) + ident(IRubyObject) ident(n) operator(=) ident(f_sub)operator(()ident(context)operator(,) ident(other)operator(,) ident(one)operator(\))operator(;) + + ident(IRubyObject) ident(two) operator(=) ident(RubyFixnum)operator(.)ident(two)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + keyword(while) operator(()operator(!)ident(f_zero_p)operator(()ident(context)operator(,) ident(n)operator(\))operator(\)) operator({) + + ident(RubyArray) ident(a) operator(=) ident(f_divmod)operator(()ident(context)operator(,) ident(n)operator(,) ident(two)operator(\))operator(.)ident(convertToArray)operator(()operator(\))operator(;) + + keyword(while) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(\))operator(\)) operator({) + ident(RubyComplex) ident(xComplex) operator(=) operator(()ident(RubyComplex)operator(\))ident(x)operator(;) + ident(x) operator(=) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) + ident(f_sub)operator(()ident(context)operator(,) ident(f_mul)operator(()ident(context)operator(,) ident(xComplex)operator(.)ident(real)operator(,) ident(xComplex)operator(.)ident(real)operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(xComplex)operator(.)ident(image)operator(,) ident(xComplex)operator(.)ident(image)operator(\))operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(f_mul)operator(()ident(context)operator(,) ident(two)operator(,) ident(xComplex)operator(.)ident(real)operator(\))operator(,) ident(xComplex)operator(.)ident(image)operator(\))operator(\))operator(;) + + ident(n) operator(=) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + ident(a) operator(=) ident(f_divmod)operator(()ident(context)operator(,) ident(n)operator(,) ident(two)operator(\))operator(.)ident(convertToArray)operator(()operator(\))operator(;) + operator(}) + ident(z) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(z)operator(,) ident(x)operator(\))operator(;) + ident(n) operator(=) ident(f_sub)operator(()ident(context)operator(,) ident(n)operator(,) ident(one)operator(\))operator(;) + operator(}) + keyword(return) ident(z)operator(;) + operator(}) + keyword(return) ident(f_expt)operator(()ident(context)operator(,) ident(f_div)operator(()ident(context)operator(,) ident(f_to_r)operator(()ident(context)operator(,) ident(one)operator(\))operator(,) local_variable(this)operator(\))operator(,) ident(f_negate)operator(()ident(context)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyNumeric) operator(&&) ident(f_scalar_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(RubyArray) ident(a) operator(=) ident(f_polar)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(convertToArray)operator(()operator(\))operator(;) + ident(IRubyObject) ident(r) operator(=) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + ident(IRubyObject) ident(theta) operator(=) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(;) + keyword(return) ident(f_complex_polar)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(f_expt)operator(()ident(context)operator(,) ident(r)operator(,) ident(other)operator(\))operator(,) ident(f_mul)operator(()ident(context)operator(,) ident(theta)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nucomp_equal_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(otherComplex) operator(=) operator(()ident(RubyComplex)operator(\))ident(other)operator(;) + keyword(if) operator(()ident(f_equal_p)operator(()ident(context)operator(,) ident(real)operator(,) ident(otherComplex)operator(.)ident(real)operator(\)) operator(&&) ident(f_equal_p)operator(()ident(context)operator(,) ident(image)operator(,) ident(otherComplex)operator(.)ident(image)operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyNumeric) operator(&&) ident(f_scalar_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(f_equal_p)operator(()ident(context)operator(,) ident(real)operator(,) ident(other)operator(\)) operator(&&) ident(f_zero_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(f_equal_p)operator(()ident(context)operator(,) ident(other)operator(,) local_variable(this)operator(\)) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** nucomp_coerce + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(coerce)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(coerce)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyNumeric) operator(&&) ident(f_scalar_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(newComplexBang)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(other)operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( can't be coerced into )delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** nucomp_abs + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(abs)delimiter(")>operator(,) string<delimiter(")content(magnitude)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(abs)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyMath)operator(.)ident(hypot)operator(()local_variable(this)operator(,) ident(real)operator(,) ident(image)operator(\))operator(;) + operator(}) + + comment(/** nucomp_abs2 + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abs2)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(abs2)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(f_add)operator(()ident(context)operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(real)operator(,) ident(real)operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) ident(image)operator(,) ident(image)operator(\))operator(\))operator(;) + operator(}) + + comment(/** nucomp_arg + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(arg)delimiter(")>operator(,) string<delimiter(")content(angle)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(arg)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyMath)operator(.)ident(atan2)operator(()local_variable(this)operator(,) ident(image)operator(,) ident(real)operator(\))operator(;) + operator(}) + + comment(/** nucomp_polar + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(polar)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(polar)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(f_abs)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(f_arg)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(\))operator(;) + operator(}) + + comment(/** nucomp_conjugate + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(conjugate)delimiter(")>operator(,) string<delimiter(")content(conj)delimiter(")>operator(,) string<delimiter(")content(~)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(conjugate)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(real)operator(,) ident(f_negate)operator(()ident(context)operator(,) ident(image)operator(\))operator(\))operator(;) + operator(}) + + comment(/** nucomp_real_p + * + */) + comment(//@JRubyMethod(name = "real?"\)) + directive(public) ident(IRubyObject) ident(real_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** nucomp_complex_p + * + */) + comment(// @JRubyMethod(name = "complex?"\)) + directive(public) ident(IRubyObject) ident(complex_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** nucomp_exact_p + * + */) + comment(// @JRubyMethod(name = "exact?"\)) + directive(public) ident(IRubyObject) ident(exact_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) operator(()ident(f_exact_p)operator(()ident(context)operator(,) ident(real)operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(&&) ident(f_exact_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** nucomp_exact_p + * + */) + comment(// @JRubyMethod(name = "inexact?"\)) + directive(public) ident(IRubyObject) ident(inexact_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(exact_p)operator(()ident(context)operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** nucomp_denominator + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(denominator)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(demoninator)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(f_lcm)operator(()ident(context)operator(,) ident(f_denominator)operator(()ident(context)operator(,) ident(real)operator(\))operator(,) ident(f_denominator)operator(()ident(context)operator(,) ident(image)operator(\))operator(\))operator(;) + operator(}) + + comment(/** nucomp_numerator + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(numerator)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(numerator)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(IRubyObject) ident(cd) operator(=) ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(denominator)delimiter(")>operator(\))operator(;) + keyword(return) ident(newComplex)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) + ident(f_numerator)operator(()ident(context)operator(,) ident(real)operator(\))operator(,) + ident(f_div)operator(()ident(context)operator(,) ident(cd)operator(,) ident(f_denominator)operator(()ident(context)operator(,) ident(real)operator(\))operator(\))operator(\))operator(,) + ident(f_mul)operator(()ident(context)operator(,) + ident(f_numerator)operator(()ident(context)operator(,) ident(image)operator(\))operator(,) + ident(f_div)operator(()ident(context)operator(,) ident(cd)operator(,) ident(f_denominator)operator(()ident(context)operator(,) ident(image)operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** nucomp_hash + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(hash)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(f_xor)operator(()ident(context)operator(,) ident(real)operator(,) ident(image)operator(\))operator(;) + operator(}) + + comment(/** f_signbit + * + */) + directive(private) directive(static) type(boolean) ident(signbit)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(if) operator(()ident(x) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) type(Double)operator(.)ident(doubleToLongBits)operator(()operator(()operator(()ident(RubyFloat)operator(\))ident(x)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\)) operator(<) integer(0)operator(;) + operator(}) + keyword(return) ident(f_negative_p)operator(()ident(context)operator(,) ident(x)operator(\))operator(;) + operator(}) + + comment(/** f_tpositive_p + * + */) + directive(private) directive(static) type(boolean) ident(tpositive_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) operator(!)ident(signbit)operator(()ident(context)operator(,) ident(x)operator(\))operator(;) + operator(}) + + comment(/** nucomp_to_s + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(boolean) ident(impos) operator(=) ident(tpositive_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(;) + + ident(RubyString) ident(str) operator(=) ident(f_to_s)operator(()ident(context)operator(,) ident(real)operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()ident(impos) operator(?) operator(()type(byte)operator(\))string<delimiter(')content(+)delimiter(')> operator(:) operator(()type(byte)operator(\))string<delimiter(')content(-)delimiter(')>operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()ident(f_to_s)operator(()ident(context)operator(,) ident(f_abs)operator(()ident(context)operator(,) ident(image)operator(\))operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(i)delimiter(')>operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** nucomp_inspect + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(boolean) ident(impos) operator(=) ident(tpositive_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(;) + ident(RubyString) ident(str) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(()delimiter(')>operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()ident(f_inspect)operator(()ident(context)operator(,) ident(real)operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()ident(impos) operator(?) operator(()type(byte)operator(\))string<delimiter(')content(+)delimiter(')> operator(:) operator(()type(byte)operator(\))string<delimiter(')content(-)delimiter(')>operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()ident(f_inspect)operator(()ident(context)operator(,) ident(f_abs)operator(()ident(context)operator(,) ident(image)operator(\))operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(i)delimiter(')>operator(\))operator(;) + ident(str)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(\))delimiter(')>operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** nucomp_marshal_dump + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(marshal_dump)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(marshal_dump)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(real)operator(,) ident(image)operator(\))operator(;) + operator(}) + + comment(/** nucomp_marshal_load + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(marshal_load)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(marshal_load)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(RubyArray) ident(a) operator(=) ident(arg)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + ident(real) operator(=) ident(a)operator(.)ident(size)operator(()operator(\)) operator(>) integer(0) operator(?) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(image) operator(=) ident(a)operator(.)ident(size)operator(()operator(\)) operator(>) integer(1) operator(?) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** nucomp_scalar_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(scalar?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(scalar_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** nucomp_to_i + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_i)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_i)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(image) keyword(instanceof) ident(RubyFloat) operator(||) operator(!)ident(f_zero_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(f_to_s)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(convertToString)operator(()operator(\)) operator(+) string<delimiter(")content( into Integer)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(f_to_i)operator(()ident(context)operator(,) ident(real)operator(\))operator(;) + operator(}) + + comment(/** nucomp_to_f + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_f)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_f)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(image) keyword(instanceof) ident(RubyFloat) operator(||) operator(!)ident(f_zero_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(f_to_s)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(convertToString)operator(()operator(\)) operator(+) string<delimiter(")content( into Float)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(f_to_f)operator(()ident(context)operator(,) ident(real)operator(\))operator(;) + operator(}) + + comment(/** nucomp_to_f + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_r)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_r)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(image) keyword(instanceof) ident(RubyFloat) operator(||) operator(!)ident(f_zero_p)operator(()ident(context)operator(,) ident(image)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(f_to_s)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(convertToString)operator(()operator(\)) operator(+) string<delimiter(")content( into Rational)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(f_to_r)operator(()ident(context)operator(,) ident(real)operator(\))operator(;) + operator(}) + + directive(static) ident(RubyArray) ident(str_to_c_internal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(RubyString) ident(s) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(strip)delimiter(")>operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(ByteList) ident(bytes) operator(=) ident(s)operator(.)ident(getByteList)operator(()operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(bytes)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(,) ident(recv)operator(\))operator(;) + + ident(IRubyObject) ident(sr)operator(,) ident(si)operator(,) ident(re)operator(;) + ident(sr) operator(=) ident(si) operator(=) ident(re) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + type(boolean) ident(po) operator(=) keyword(false)operator(;) + ident(IRubyObject) ident(m) operator(=) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(Numeric)operator(.)ident(ComplexPatterns)operator(.)ident(comp_pat0)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(match)delimiter(")>operator(,) ident(s)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(m)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(sr) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(si) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(two)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(re) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(post_match)delimiter(")>operator(\))operator(;) + ident(po) operator(=) keyword(true)operator(;) + operator(}) + + keyword(if) operator(()ident(m)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(m) operator(=) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(Numeric)operator(.)ident(ComplexPatterns)operator(.)ident(comp_pat1)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(match)delimiter(")>operator(,) ident(s)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(m)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(sr) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(si) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(si)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(si) operator(=) ident(runtime)operator(.)ident(newString)operator(()operator(\))operator(;) + ident(IRubyObject) ident(t) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(two)operator(()ident(runtime)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(t)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(t) operator(=) ident(runtime)operator(.)ident(newString)operator(()keyword(new) ident(ByteList)operator(()keyword(new) type(byte)type([])operator({)string<delimiter(')content(1)delimiter(')>operator(})operator(\))operator(\))operator(;) + ident(si)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(cat)operator(()ident(t)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(re) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(post_match)delimiter(")>operator(\))operator(;) + ident(po) operator(=) keyword(false)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(m)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(m) operator(=) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(Numeric)operator(.)ident(ComplexPatterns)operator(.)ident(comp_pat2)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(match)delimiter(")>operator(,) ident(s)operator(\))operator(;) + keyword(if) operator(()ident(m)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(,) ident(recv)operator(\))operator(;) + ident(sr) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(two)operator(()ident(runtime)operator(\))operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(si) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(si) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(three)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(IRubyObject) ident(t) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(four)operator(()ident(runtime)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(t)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(t) operator(=) ident(runtime)operator(.)ident(newString)operator(()keyword(new) ident(ByteList)operator(()keyword(new) type(byte)type([])operator({)string<delimiter(')content(1)delimiter(')>operator(})operator(\))operator(\))operator(;) + ident(si)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(cat)operator(()ident(t)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(re) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(post_match)delimiter(")>operator(\))operator(;) + ident(po) operator(=) keyword(false)operator(;) + operator(}) + + ident(IRubyObject) ident(r) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + ident(IRubyObject) ident(i) operator(=) ident(r)operator(;) + + keyword(if) operator(()operator(!)ident(sr)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(sr)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(include?)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()keyword(new) ident(ByteList)operator(()keyword(new) type(byte)type([])operator({)string<delimiter(')content(/)delimiter(')>operator(})operator(\))operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(r) operator(=) ident(f_to_r)operator(()ident(context)operator(,) ident(sr)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(f_gt_p)operator(()ident(context)operator(,) ident(sr)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(count)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(.eE)delimiter(")>operator(\))operator(\))operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(r) operator(=) ident(f_to_f)operator(()ident(context)operator(,) ident(sr)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(r) operator(=) ident(f_to_i)operator(()ident(context)operator(,) ident(sr)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()operator(!)ident(si)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(si)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(include?)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()keyword(new) ident(ByteList)operator(()keyword(new) type(byte)type([])operator({)string<delimiter(')content(/)delimiter(')>operator(})operator(\))operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(i) operator(=) ident(f_to_r)operator(()ident(context)operator(,) ident(si)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(f_gt_p)operator(()ident(context)operator(,) ident(si)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(count)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(.eE)delimiter(")>operator(\))operator(\))operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(i) operator(=) ident(f_to_f)operator(()ident(context)operator(,) ident(si)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(i) operator(=) ident(f_to_i)operator(()ident(context)operator(,) ident(si)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(po) operator(?) ident(newComplexPolar)operator(()ident(context)operator(,) ident(r)operator(,) ident(i)operator(\)) operator(:) ident(newComplexCanonicalize)operator(()ident(context)operator(,) ident(r)operator(,) ident(i)operator(\))operator(,) ident(re)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(str_to_c_strict)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(RubyArray) ident(a) operator(=) ident(str_to_c_internal)operator(()ident(context)operator(,) ident(recv)operator(\))operator(;) + keyword(if) operator(()ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(.)ident(isNil)operator(()operator(\)) operator(||) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(s) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(;) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid value for Complex: )delimiter(")> operator(+) ident(s)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * Placeholder until/if we can support this + * + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Continuation)delimiter(")>operator(\)) +directive(public) type(class) class(RubyContinuation) operator({) + directive(public) directive(static) type(void) ident(createContinuation)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(cContinuation) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Continuation)delimiter(")>operator(,)ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,)ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(cContinuation)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyContinuation)operator(.)ident(class)operator(\))operator(;) + ident(runtime)operator(.)ident(setContinuation)operator(()ident(cContinuation)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(call)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(call)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Continuations are not implemented in JRuby and will not work)delimiter(")>operator(\))operator(;) + operator(}) +operator(})comment(// RubyContinuation) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006, 2007 Ola Bini <ola@ologix.com> + * Copyright (C\) 2007 Nick Sieger <nicksieger@gmail.com> + * Copyright (C\) 2008 Vladimir Sizikov <vsizikov@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.security.Provider)operator(;) +keyword(import) include(java.security.MessageDigest)operator(;) +keyword(import) include(java.security.NoSuchAlgorithmException)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) + +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.callback.Callback)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) + +comment(/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Digest)delimiter(")>operator(\)) +directive(public) type(class) class(RubyDigest) operator({) + directive(private) directive(static) type(Provider) ident(provider) operator(=) keyword(null)operator(;) + + directive(public) directive(static) type(void) ident(createDigest)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(try) operator({) + ident(provider) operator(=) operator(()type(Provider)operator(\)) type(Class)operator(.)ident(forName)operator(()string<delimiter(")content(org.bouncycastle.jce.provider.BouncyCastleProvider)delimiter(")>operator(\))operator(.)ident(newInstance)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()type(Exception) ident(e)operator(\)) operator({) + comment(// provider is not available) + operator(}) + + ident(RubyModule) ident(mDigest) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Digest)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigestBase) operator(=) ident(mDigest)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Base)delimiter(")>operator(,)ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(Base)operator(.)ident(BASE_ALLOCATOR)operator(\))operator(;) + + ident(cDigestBase)operator(.)ident(defineAnnotatedMethods)operator(()ident(Base)operator(.)ident(class)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(MessageDigest) ident(createMessageDigest)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(providerName)operator(\)) directive(throws) type(NoSuchAlgorithmException) operator({) + keyword(if)operator(()ident(provider) operator(!=) keyword(null)operator(\)) operator({) + keyword(try) operator({) + keyword(return) type(MessageDigest)operator(.)ident(getInstance)operator(()ident(providerName)operator(,) ident(provider)operator(\))operator(;) + operator(}) keyword(catch)operator(()type(NoSuchAlgorithmException) ident(e)operator(\)) operator({) + comment(// bouncy castle doesn't support algorithm) + operator(}) + operator(}) + comment(// fall back to system JCA providers) + keyword(return) type(MessageDigest)operator(.)ident(getInstance)operator(()ident(providerName)operator(\))operator(;) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Digest::MD5)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Digest::Base)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(MD5) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Digest::RMD160)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Digest::Base)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(RMD160) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Digest::SHA1)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Digest::Base)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(SHA1) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Digest::SHA256)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Digest::Base)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(SHA256) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Digest::SHA384)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Digest::Base)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(SHA384) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Digest::SHA512)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Digest::Base)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(SHA512) operator({)operator(}) + + directive(public) directive(static) type(void) ident(createDigestMD5)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(digest.so)delimiter(")>operator(\))operator(;) + ident(RubyModule) ident(mDigest) operator(=) ident(runtime)operator(.)ident(fastGetModule)operator(()string<delimiter(")content(Digest)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigestBase) operator(=) ident(mDigest)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Base)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigest_MD5) operator(=) ident(mDigest)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(MD5)delimiter(")>operator(,)ident(cDigestBase)operator(,)ident(cDigestBase)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(cDigest_MD5)operator(.)ident(defineFastMethod)operator(()string<delimiter(")content(block_length)delimiter(")>operator(,) keyword(new) type(Callback)operator(()operator(\)) operator({) + directive(public) ident(Arity) ident(getArity)operator(()operator(\)) operator({) + keyword(return) ident(Arity)operator(.)ident(NO_ARGUMENTS)operator(;) + operator(}) + directive(public) ident(IRubyObject) ident(execute)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) integer(64)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + ident(cDigest_MD5)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(MD5)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(createDigestRMD160)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(digest.so)delimiter(")>operator(\))operator(;) + keyword(if)operator(()ident(provider) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newLoadError)operator(()string<delimiter(")content(RMD160 not supported without BouncyCastle)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyModule) ident(mDigest) operator(=) ident(runtime)operator(.)ident(fastGetModule)operator(()string<delimiter(")content(Digest)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigestBase) operator(=) ident(mDigest)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Base)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigest_RMD160) operator(=) ident(mDigest)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(RMD160)delimiter(")>operator(,)ident(cDigestBase)operator(,)ident(cDigestBase)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(cDigest_RMD160)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(RIPEMD160)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(createDigestSHA1)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(digest.so)delimiter(")>operator(\))operator(;) + ident(RubyModule) ident(mDigest) operator(=) ident(runtime)operator(.)ident(fastGetModule)operator(()string<delimiter(")content(Digest)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigestBase) operator(=) ident(mDigest)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Base)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigest_SHA1) operator(=) ident(mDigest)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(SHA1)delimiter(")>operator(,)ident(cDigestBase)operator(,)ident(cDigestBase)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(cDigest_SHA1)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(SHA1)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(createDigestSHA2)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(digest.so)delimiter(")>operator(\))operator(;) + keyword(try) operator({) + ident(createMessageDigest)operator(()ident(runtime)operator(,) string<delimiter(")content(SHA-256)delimiter(")>operator(\))operator(;) + operator(}) keyword(catch)operator(()type(NoSuchAlgorithmException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newLoadError)operator(()string<delimiter(")content(SHA2 not supported)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyModule) ident(mDigest) operator(=) ident(runtime)operator(.)ident(fastGetModule)operator(()string<delimiter(")content(Digest)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigestBase) operator(=) ident(mDigest)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Base)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(cDigest_SHA2_256) operator(=) ident(mDigest)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(SHA256)delimiter(")>operator(,)ident(cDigestBase)operator(,)ident(cDigestBase)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(cDigest_SHA2_256)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(SHA-256)delimiter(")>operator(\))operator(\))operator(;) + ident(RubyClass) ident(cDigest_SHA2_384) operator(=) ident(mDigest)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(SHA384)delimiter(")>operator(,)ident(cDigestBase)operator(,)ident(cDigestBase)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(cDigest_SHA2_384)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(SHA-384)delimiter(")>operator(\))operator(\))operator(;) + ident(RubyClass) ident(cDigest_SHA2_512) operator(=) ident(mDigest)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(SHA512)delimiter(")>operator(,)ident(cDigestBase)operator(,)ident(cDigestBase)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(cDigest_SHA2_512)operator(.)ident(setInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(SHA-512)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Digest::Base)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Base) directive(extends) ident(RubyObject) operator({) + directive(protected) directive(static) directive(final) ident(ObjectAllocator) ident(BASE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(Base)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(digest)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(s_digest)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(String) ident(name) operator(=) operator(()operator(()ident(RubyClass)operator(\))ident(recv)operator(\))operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(try) operator({) + type(MessageDigest) ident(md) operator(=) ident(createMessageDigest)operator(()ident(runtime)operator(,) ident(name)operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(md)operator(.)ident(digest)operator(()ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getBytes)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(catch)operator(()type(NoSuchAlgorithmException) ident(e)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Unsupported digest algorithm ()delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hexdigest)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(s_hexdigest)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(String) ident(name) operator(=) operator(()operator(()ident(RubyClass)operator(\))ident(recv)operator(\))operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(try) operator({) + type(MessageDigest) ident(md) operator(=) ident(createMessageDigest)operator(()ident(runtime)operator(,) ident(name)operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(ByteList)operator(.)ident(plain)operator(()ident(toHex)operator(()ident(md)operator(.)ident(digest)operator(()ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getBytes)operator(()operator(\))operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(catch)operator(()type(NoSuchAlgorithmException) ident(e)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Unsupported digest algorithm ()delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(MessageDigest) ident(algo)operator(;) + directive(private) type(StringBuffer) ident(data)operator(;) + + directive(public) ident(Base)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,)ident(type)operator(\))operator(;) + ident(data) operator(=) keyword(new) type(StringBuffer)operator(()operator(\))operator(;) + + keyword(if)operator(()ident(type) operator(==) ident(runtime)operator(.)ident(fastGetModule)operator(()string<delimiter(")content(Digest)delimiter(")>operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Base)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Digest::Base is an abstract class)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if)operator(()operator(!)ident(type)operator(.)ident(hasInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(the )delimiter(")> operator(+) ident(type) operator(+) string<delimiter(")content((\) function is unimplemented on this machine)delimiter(")>operator(\))operator(;) + operator(}) + keyword(try) operator({) + ident(setAlgorithm)operator(()ident(type)operator(.)ident(searchInternalModuleVariable)operator(()string<delimiter(")content(metadata)delimiter(")>operator(\))operator(\))operator(;) + operator(}) keyword(catch)operator(()type(NoSuchAlgorithmException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(the )delimiter(")> operator(+) ident(type) operator(+) string<delimiter(")content((\) function is unimplemented on this machine)delimiter(")>operator(\))operator(;) + operator(}) + + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(>) integer(0) operator(&&) operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(update)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if)operator(()local_variable(this) operator(==) ident(obj)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(()operator(()ident(RubyObject)operator(\))ident(obj)operator(\))operator(.)ident(checkFrozen)operator(()operator(\))operator(;) + + ident(data) operator(=) keyword(new) type(StringBuffer)operator(()operator(()operator(()ident(Base)operator(\))ident(obj)operator(\))operator(.)ident(data)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + type(String) ident(name) operator(=) operator(()operator(()ident(Base)operator(\))ident(obj)operator(\))operator(.)ident(algo)operator(.)ident(getAlgorithm)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(algo) operator(=) ident(createMessageDigest)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(name)operator(\))operator(;) + operator(}) keyword(catch)operator(()type(NoSuchAlgorithmException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Unsupported digest algorithm ()delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(update)delimiter(")>operator(,) string<delimiter(")content(<<)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(update)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(data)operator(.)ident(append)operator(()ident(obj)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(digest)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(digest)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(reset)operator(()operator(\))operator(;) + ident(data)operator(.)ident(append)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(digest) operator(=) ident(getDigest)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(reset)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(digest)operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(getDigest)operator(()operator(\)) operator({) + ident(algo)operator(.)ident(reset)operator(()operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(algo)operator(.)ident(digest)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(data)operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(digest!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(digest_bang)operator(()operator(\)) operator({) + ident(algo)operator(.)ident(reset)operator(()operator(\))operator(;) + type(byte)type([]) ident(digest) operator(=) ident(algo)operator(.)ident(digest)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(data)operator(\))operator(\))operator(;) + ident(reset)operator(()operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(digest)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(hexdigest)delimiter(")>operator(})operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(hexdigest)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(algo)operator(.)ident(reset)operator(()operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(reset)operator(()operator(\))operator(;) + ident(data)operator(.)ident(append)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + type(byte)type([]) ident(digest) operator(=) ident(ByteList)operator(.)ident(plain)operator(()ident(toHex)operator(()ident(algo)operator(.)ident(digest)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(data)operator(\))operator(\))operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(reset)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(digest)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_s)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + ident(algo)operator(.)ident(reset)operator(()operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(ByteList)operator(.)ident(plain)operator(()ident(toHex)operator(()ident(algo)operator(.)ident(digest)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(data)operator(\))operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(hexdigest!)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(hexdigest_bang)operator(()operator(\)) operator({) + ident(algo)operator(.)ident(reset)operator(()operator(\))operator(;) + type(byte)type([]) ident(digest) operator(=) ident(ByteList)operator(.)ident(plain)operator(()ident(toHex)operator(()ident(algo)operator(.)ident(digest)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(data)operator(\))operator(\))operator(\))operator(\))operator(;) + ident(reset)operator(()operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(digest)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + ident(algo)operator(.)ident(reset)operator(()operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(ByteList)operator(.)ident(plain)operator(()string<delimiter(")content(#<)delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(: )delimiter(")> operator(+) ident(toHex)operator(()ident(algo)operator(.)ident(digest)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(data)operator(\))operator(\))operator(\)) operator(+) string<delimiter(")content(>)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(IRubyObject) ident(oth)operator(\)) operator({) + type(boolean) ident(ret) operator(=) local_variable(this) operator(==) ident(oth)operator(;) + keyword(if)operator(()operator(!)ident(ret)operator(\)) operator({) + keyword(if) operator(()ident(oth) keyword(instanceof) ident(Base)operator(\)) operator({) + ident(Base) ident(b) operator(=) operator(()ident(Base)operator(\))ident(oth)operator(;) + ident(ret) operator(=) local_variable(this)operator(.)ident(algo)operator(.)ident(getAlgorithm)operator(()operator(\))operator(.)ident(equals)operator(()ident(b)operator(.)ident(algo)operator(.)ident(getAlgorithm)operator(()operator(\))operator(\)) operator(&&) + local_variable(this)operator(.)ident(getDigest)operator(()operator(\))operator(.)ident(equals)operator(()ident(b)operator(.)ident(getDigest)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(str) operator(=) ident(oth)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(ret) operator(=) local_variable(this)operator(.)ident(to_s)operator(()operator(\))operator(.)ident(equals)operator(()ident(str)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(ret) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(length)delimiter(")>operator(,) string<delimiter(")content(size)delimiter(")>operator(,) string<delimiter(")content(digest_length)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(length)operator(()operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(algo)operator(.)ident(getDigestLength)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(block_length)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(block_length)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRuntimeError)operator(() + local_variable(this)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( doesn't implement block_length(\))delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(reset)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(reset)operator(()operator(\)) operator({) + ident(algo)operator(.)ident(reset)operator(()operator(\))operator(;) + ident(data) operator(=) keyword(new) type(StringBuffer)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(setAlgorithm)operator(()ident(IRubyObject) ident(algo)operator(\)) directive(throws) type(NoSuchAlgorithmException) operator({) + local_variable(this)operator(.)ident(algo) operator(=) ident(createMessageDigest)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(algo)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(String) ident(toHex)operator(()type(byte)type([]) ident(val)operator(\)) operator({) + type(StringBuilder) ident(out) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + keyword(for)operator(()type(int) ident(i)operator(=)integer(0)operator(,)ident(j)operator(=)ident(val)operator(.)ident(length)operator(;)ident(i)operator(<)ident(j)operator(;)ident(i)operator(++)operator(\)) operator({) + type(String) ident(ve) operator(=) type(Integer)operator(.)ident(toString)operator(()operator(()operator(()operator(()type(int)operator(\))operator(()operator(()type(char)operator(\))ident(val)operator([)ident(i)operator(])operator(\))operator(\)) operator(&) hex(0xFF)operator(\))operator(,)integer(16)operator(\))operator(;) + keyword(if)operator(()ident(ve)operator(.)ident(length)operator(()operator(\)) operator(==) integer(1)operator(\)) operator({) + ident(ve) operator(=) string<delimiter(")content(0)delimiter(")> operator(+) ident(ve)operator(;) + operator(}) + ident(out)operator(.)ident(append)operator(()ident(ve)operator(\))operator(;) + operator(}) + keyword(return) ident(out)operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + operator(}) +operator(})comment(// RubyDigest) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.File)operator(;) +keyword(import) include(java.io.FileInputStream)operator(;) +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.ext.posix.util.Platform)operator(;) + +keyword(import) include(org.jruby.javasupport.JavaUtil)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.Dir)operator(;) +keyword(import) include(org.jruby.util.JRubyFile)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) + +comment(/** + * .The Ruby built-in class Dir. + * + * @author jvoegele + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Dir)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Enumerable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyDir) directive(extends) ident(RubyObject) operator({) + comment(// What we passed to the constructor for method 'path') + directive(private) ident(RubyString) ident(path)operator(;) + directive(protected) ident(JRubyFile) ident(dir)operator(;) + directive(private) type(String)type([]) ident(snapshot)operator(;) comment(// snapshot of contents of directory) + directive(private) type(int) ident(pos)operator(;) comment(// current position in directory) + directive(private) type(boolean) ident(isOpen) operator(=) keyword(true)operator(;) + + directive(public) ident(RubyDir)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) ident(ObjectAllocator) ident(DIR_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyDir)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createDirClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(dirClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Dir)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(DIR_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setDir)operator(()ident(dirClass)operator(\))operator(;) + + ident(dirClass)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + + ident(dirClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyDir)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(dirClass)operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(checkDir)operator(()operator(\)) operator({) + keyword(if) operator(()operator(!)ident(isTaint)operator(()operator(\)) operator(&&) ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: operation on untainted Dir)delimiter(")>operator(\))operator(;) + + ident(testFrozen)operator(()string<delimiter(")delimiter(")>operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isOpen)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(closed directory)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Creates a new <code>Dir</code>. This method takes a snapshot of the + * contents of the directory at creation time, so changes to the contents + * of the directory will not be reflected during the lifetime of the + * <code>Dir</code> object returned, so a new <code>Dir</code> instance + * must be created to reflect changes to the underlying file system. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject) ident(_newPath)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(RubyString) ident(newPath) operator(=) ident(_newPath)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(checkSafeString)operator(()ident(newPath)operator(\))operator(;) + + type(String) ident(adjustedPath) operator(=) ident(RubyFile)operator(.)ident(adjustRootPathOnWindows)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(newPath)operator(.)ident(toString)operator(()operator(\))operator(,) keyword(null)operator(\))operator(;) + ident(checkDirIsTwoSlashesOnWindows)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(adjustedPath)operator(\))operator(;) + + ident(dir) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(adjustedPath)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(dir)operator(.)ident(isDirectory)operator(()operator(\))operator(\)) operator({) + ident(dir) operator(=) keyword(null)operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(()ident(newPath)operator(.)ident(toString)operator(()operator(\)) operator(+) string<delimiter(")content( is not a directory)delimiter(")>operator(\))operator(;) + operator(}) + ident(path) operator(=) ident(newPath)operator(;) + type(List)operator(<)type(String)operator(>) ident(snapshotList) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + ident(snapshotList)operator(.)ident(add)operator(()string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + ident(snapshotList)operator(.)ident(add)operator(()string<delimiter(")content(..)delimiter(")>operator(\))operator(;) + ident(snapshotList)operator(.)ident(addAll)operator(()ident(getContents)operator(()ident(dir)operator(\))operator(\))operator(;) + ident(snapshot) operator(=) operator(()type(String)type([])operator(\)) ident(snapshotList)operator(.)ident(toArray)operator(()keyword(new) type(String)operator([)ident(snapshotList)operator(.)ident(size)operator(()operator(\))operator(])operator(\))operator(;) + ident(pos) operator(=) integer(0)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + +comment(// ----- Ruby Class Methods ----------------------------------------------------) + + directive(private) directive(static) type(List)operator(<)ident(ByteList)operator(>) ident(dirGlobs)operator(()type(String) ident(cwd)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) type(int) ident(flags)operator(\)) operator({) + type(List)operator(<)ident(ByteList)operator(>) ident(dirs) operator(=) keyword(new) type(ArrayList)operator(<)ident(ByteList)operator(>)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(ByteList) ident(globPattern) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + ident(dirs)operator(.)ident(addAll)operator(()ident(Dir)operator(.)ident(push_glob)operator(()ident(cwd)operator(,) ident(globPattern)operator(,) ident(flags)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(dirs)operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(asRubyStringList)operator(()ident(Ruby) ident(runtime)operator(,) type(List)operator(<)ident(ByteList)operator(>) ident(dirs)operator(\)) operator({) + type(List)operator(<)ident(RubyString)operator(>) ident(allFiles) operator(=) keyword(new) type(ArrayList)operator(<)ident(RubyString)operator(>)operator(()operator(\))operator(;) + + keyword(for) operator(()ident(ByteList) ident(dir)operator(:) ident(dirs)operator(\)) operator({) + ident(allFiles)operator(.)ident(add)operator(()ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(dir)operator(\))operator(\))operator(;) + operator(}) + + ident(IRubyObject)type([]) ident(tempFileList) operator(=) keyword(new) ident(IRubyObject)operator([)ident(allFiles)operator(.)ident(size)operator(()operator(\))operator(])operator(;) + ident(allFiles)operator(.)ident(toArray)operator(()ident(tempFileList)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newArrayNoCopy)operator(()ident(tempFileList)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(String) ident(getCWD)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(try) operator({) + keyword(return) keyword(new) ident(org)operator(.)ident(jruby)operator(.)ident(util)operator(.)ident(NormalizedFile)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(\))operator(.)ident(getCanonicalPath)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()type(Exception) ident(e)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest)operator(=)keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(aref)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(List)operator(<)ident(ByteList)operator(>) ident(dirs)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(ByteList) ident(globPattern) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + ident(dirs) operator(=) ident(Dir)operator(.)ident(push_glob)operator(()ident(getCWD)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) ident(globPattern)operator(,) integer(0)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(dirs) operator(=) ident(dirGlobs)operator(()ident(getCWD)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) ident(args)operator(,) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(asRubyStringList)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(dirs)operator(\))operator(;) + operator(}) + + comment(/** + * Returns an array of filenames matching the specified wildcard pattern + * <code>pat</code>. If a block is given, the array is iterated internally + * with each filename is passed to the block in turn. In this case, Nil is + * returned. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(glob)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(glob)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(flags) operator(=) ident(args)operator(.)ident(length) operator(==) integer(2) operator(?) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)integer(1)operator(])operator(\)) operator(:) integer(0)operator(;) + + type(List)operator(<)ident(ByteList)operator(>) ident(dirs)operator(;) + ident(IRubyObject) ident(tmp) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(checkArrayType)operator(()operator(\))operator(;) + keyword(if) operator(()ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(ByteList) ident(globPattern) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + ident(dirs) operator(=) ident(Dir)operator(.)ident(push_glob)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(globPattern)operator(,) ident(flags)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(dirs) operator(=) ident(dirGlobs)operator(()ident(getCWD)operator(()ident(runtime)operator(\))operator(,) operator(()operator(()ident(RubyArray)operator(\)) ident(tmp)operator(\))operator(.)ident(toJavaArray)operator(()operator(\))operator(,) ident(flags)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(dirs)operator(.)ident(size)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(dirs)operator(.)ident(get)operator(()ident(i)operator(\))operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(asRubyStringList)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(dirs)operator(\))operator(;) + operator(}) + + comment(/** + * @return all entries for this Dir + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(entries)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(entries)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArrayNoCopy)operator(()ident(JavaUtil)operator(.)ident(convertJavaArrayToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(snapshot)operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Returns an array containing all of the filenames in the given directory. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(entries)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(entries)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(path)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + type(String) ident(adjustedPath) operator(=) ident(RubyFile)operator(.)ident(adjustRootPathOnWindows)operator(() + ident(runtime)operator(,) ident(path)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(null)operator(\))operator(;) + ident(checkDirIsTwoSlashesOnWindows)operator(()ident(runtime)operator(,) ident(adjustedPath)operator(\))operator(;) + + directive(final) ident(JRubyFile) ident(directory) operator(=) ident(JRubyFile)operator(.)ident(create)operator(() + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(adjustedPath)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(directory)operator(.)ident(isDirectory)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such directory)delimiter(")>operator(\))operator(;) + operator(}) + type(List)operator(<)type(String)operator(>) ident(fileList) operator(=) ident(getContents)operator(()ident(directory)operator(\))operator(;) + ident(fileList)operator(.)ident(add)operator(()integer(0)operator(,) string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + ident(fileList)operator(.)ident(add)operator(()integer(1)operator(,) string<delimiter(")content(..)delimiter(")>operator(\))operator(;) + type(Object)type([]) ident(files) operator(=) ident(fileList)operator(.)ident(toArray)operator(()operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArrayNoCopy)operator(()ident(JavaUtil)operator(.)ident(convertJavaArrayToRuby)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(files)operator(\))operator(\))operator(;) + operator(}) + + comment(// MRI behavior: just plain '//' or '\\\\\\\\' are considered illegal on Windows.) + directive(private) directive(static) type(void) ident(checkDirIsTwoSlashesOnWindows)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(path)operator(\)) operator({) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS) operator(&&) operator(()string<delimiter(")content(//)delimiter(")>operator(.)ident(equals)operator(()ident(path)operator(\)) operator(||) string<delimiter(")char(\\\\)char(\\\\)delimiter(")>operator(.)ident(equals)operator(()ident(path)operator(\))operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()string<delimiter(")content(Invalid argument - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** Changes the current directory to <code>path</code> */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chdir)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chdir)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(path) operator(=) ident(args)operator(.)ident(length) operator(==) integer(1) operator(?) + operator(()ident(RubyString)operator(\)) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\)) operator(:) ident(getHomeDirectoryPath)operator(()ident(context)operator(\))operator(;) + type(String) ident(adjustedPath) operator(=) ident(RubyFile)operator(.)ident(adjustRootPathOnWindows)operator(() + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(path)operator(.)ident(toString)operator(()operator(\))operator(,) keyword(null)operator(\))operator(;) + ident(checkDirIsTwoSlashesOnWindows)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(adjustedPath)operator(\))operator(;) + ident(JRubyFile) ident(dir) operator(=) ident(getDir)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(adjustedPath)operator(,) keyword(true)operator(\))operator(;) + type(String) ident(realPath) operator(=) keyword(null)operator(;) + type(String) ident(oldCwd) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(;) + + comment(// We get canonical path to try and flatten the path out.) + comment(// a dir '/subdir/..' should return as '/') + comment(// cnutter: Do we want to flatten path out?) + keyword(try) operator({) + ident(realPath) operator(=) ident(dir)operator(.)ident(getCanonicalPath)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + ident(realPath) operator(=) ident(dir)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(result) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + comment(// FIXME: Don't allow multiple threads to do this at once) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(setCurrentDirectory)operator(()ident(realPath)operator(\))operator(;) + keyword(try) operator({) + ident(result) operator(=) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(path)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(dir) operator(=) ident(getDir)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(oldCwd)operator(,) keyword(true)operator(\))operator(;) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(setCurrentDirectory)operator(()ident(oldCwd)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(setCurrentDirectory)operator(()ident(realPath)operator(\))operator(;) + ident(result) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** + * Changes the root directory (only allowed by super user\). Not available + * on all platforms. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chroot)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chroot)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(path)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(chroot not implemented: chroot is non-portable and is not supported.)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Deletes the directory specified by <code>path</code>. The directory must + * be empty. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(rmdir)delimiter(")>operator(,) string<delimiter(")content(unlink)delimiter(")>operator(,) string<delimiter(")content(delete)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(rmdir)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(path)operator(\)) operator({) + ident(JRubyFile) ident(directory) operator(=) ident(getDir)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(path)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(true)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(directory)operator(.)ident(delete)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newSystemCallError)operator(()string<delimiter(")content(No such directory)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + operator(}) + + comment(/** + * Executes the block once for each file in the directory specified by + * <code>path</code>. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(foreach)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(foreach)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(_path)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(path) operator(=) ident(_path)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(checkSafeString)operator(()ident(path)operator(\))operator(;) + + ident(RubyClass) ident(dirClass) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDir)operator(()operator(\))operator(;) + ident(RubyDir) ident(dir) operator(=) operator(()ident(RubyDir)operator(\)) ident(dirClass)operator(.)ident(newInstance)operator(()ident(context)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(path) operator(})operator(,) ident(block)operator(\))operator(;) + + ident(dir)operator(.)ident(each)operator(()ident(context)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** Returns the current directory. */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(getwd)delimiter(")>operator(,) string<delimiter(")content(pwd)delimiter(")>operator(})operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyString) ident(getwd)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(ruby) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(return) ident(RubyString)operator(.)ident(newUnicodeString)operator(()ident(ruby)operator(,) ident(ruby)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Creates the directory specified by <code>path</code>. Note that the + * <code>mode</code> parameter is provided only to support existing Ruby + * code, and is ignored. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(mkdir)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(mkdir)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(checkSafeString)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + type(String) ident(path) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(toString)operator(()operator(\))operator(;) + + type(File) ident(newDir) operator(=) ident(getDir)operator(()ident(runtime)operator(,) ident(path)operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()type(File)operator(.)ident(separatorChar) operator(==) string<delimiter(')char(\\\\)delimiter(')>operator(\)) operator({) + ident(newDir) operator(=) keyword(new) type(File)operator(()ident(newDir)operator(.)ident(getPath)operator(()operator(\))operator(\))operator(;) + operator(}) + + type(int) ident(mode) operator(=) ident(args)operator(.)ident(length) operator(==) integer(2) operator(?) operator(()operator(()type(int)operator(\)) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\)) operator(:) oct(0777)operator(;) + + keyword(if) operator(()ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(mkdir)operator(()ident(newDir)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(,) ident(mode)operator(\)) operator(<) integer(0)operator(\)) operator({) + comment(// FIXME: This is a system error based on errno) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newSystemCallError)operator(()string<delimiter(")content(mkdir failed)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Returns a new directory object for <code>path</code>. If a block is + * provided, a new directory object is passed to the block, which closes the + * directory object before terminating. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(open)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(open)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(path)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyDir) ident(directory) operator(=) + operator(()ident(RubyDir)operator(\)) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDir)operator(()operator(\))operator(.)ident(newInstance)operator(()ident(context)operator(,) + keyword(new) ident(IRubyObject)type([]) operator({) ident(path) operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(return) ident(directory)operator(;) + + keyword(try) operator({) + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(directory)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(directory)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + +comment(// ----- Ruby Instance Methods -------------------------------------------------) + + comment(/** + * Closes the directory stream. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) operator({) + comment(// Make sure any read(\)s after close fail.) + ident(checkDir)operator(()operator(\))operator(;) + + ident(isOpen) operator(=) keyword(false)operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Executes the block once for each entry in the directory. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(checkDir)operator(()operator(\))operator(;) + + type(String)type([]) ident(contents) operator(=) ident(snapshot)operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(contents)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(contents)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** + * Returns the current position in the directory. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(tell)delimiter(")>operator(,) string<delimiter(")content(pos)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyInteger) ident(tell)operator(()operator(\)) operator({) + ident(checkDir)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(pos)operator(\))operator(;) + operator(}) + + comment(/** + * Moves to a position <code>d</code>. <code>pos</code> must be a value + * returned by <code>tell</code> or 0. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(seek)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(seek)operator(()ident(IRubyObject) ident(newPos)operator(\)) operator({) + ident(checkDir)operator(()operator(\))operator(;) + + ident(set_pos)operator(()ident(newPos)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pos=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_pos)operator(()ident(IRubyObject) ident(newPos)operator(\)) operator({) + local_variable(this)operator(.)ident(pos) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(newPos)operator(\))operator(;) + keyword(return) ident(newPos)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(path)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(path)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(checkDir)operator(()operator(\))operator(;) + + keyword(return) ident(path)operator(.)ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** Returns the next entry from this directory. */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(read)operator(()operator(\)) operator({) + ident(checkDir)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(>=) ident(snapshot)operator(.)ident(length)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + ident(RubyString) ident(result) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(snapshot)operator([)ident(pos)operator(])operator(\))operator(;) + ident(pos)operator(++)operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** Moves position in this directory to the first entry. */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rewind)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rewind)operator(()operator(\)) operator({) + keyword(if) operator(()operator(!)ident(isTaint)operator(()operator(\)) operator(&&) ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't close)delimiter(")>operator(\))operator(;) + ident(checkDir)operator(()operator(\))operator(;) + + ident(pos) operator(=) integer(0)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + +comment(// ----- Helper Methods --------------------------------------------------------) + + comment(/** Returns a Java <code>File</code> object for the specified path. If + * <code>path</code> is not a directory, throws <code>IOError</code>. + * + * @param path path for which to return the <code>File</code> object. + * @param mustExist is true the directory must exist. If false it must not. + * @throws IOError if <code>path</code> is not a directory. + */) + directive(protected) directive(static) ident(JRubyFile) ident(getDir)operator(()directive(final) ident(Ruby) ident(runtime)operator(,) directive(final) type(String) ident(path)operator(,) directive(final) type(boolean) ident(mustExist)operator(\)) operator({) + ident(JRubyFile) ident(result) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,)ident(path)operator(\))operator(;) + keyword(if) operator(()ident(mustExist) operator(&&) operator(!)ident(result)operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + type(boolean) ident(isDirectory) operator(=) ident(result)operator(.)ident(isDirectory)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(mustExist) operator(&&) operator(!)ident(isDirectory)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOTDIRError)operator(()ident(path) operator(+) string<delimiter(")content( is not a directory)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(!)ident(mustExist) operator(&&) ident(isDirectory)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEEXISTError)operator(()string<delimiter(")content(File exists - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** + * Returns the contents of the specified <code>directory</code> as an + * <code>ArrayList</code> containing the names of the files as Java Strings. + */) + directive(protected) directive(static) type(List)operator(<)type(String)operator(>) ident(getContents)operator(()type(File) ident(directory)operator(\)) operator({) + type(String)type([]) ident(contents) operator(=) ident(directory)operator(.)ident(list)operator(()operator(\))operator(;) + type(List)operator(<)type(String)operator(>) ident(result) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + + comment(// If an IO exception occurs (something odd, but possible\)) + comment(// A directory may return null.) + keyword(if) operator(()ident(contents) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(contents)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(add)operator(()ident(contents)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** + * Returns the contents of the specified <code>directory</code> as an + * <code>ArrayList</code> containing the names of the files as Ruby Strings. + */) + directive(protected) directive(static) type(List)operator(<)ident(RubyString)operator(>) ident(getContents)operator(()type(File) ident(directory)operator(,) ident(Ruby) ident(runtime)operator(\)) operator({) + type(List)operator(<)ident(RubyString)operator(>) ident(result) operator(=) keyword(new) type(ArrayList)operator(<)ident(RubyString)operator(>)operator(()operator(\))operator(;) + type(String)type([]) ident(contents) operator(=) ident(directory)operator(.)ident(list)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(contents)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(add)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(contents)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** + * Returns the home directory of the specified <code>user</code> on the + * system. If the home directory of the specified user cannot be found, + * an <code>ArgumentError it thrown</code>. + */) + directive(public) directive(static) ident(IRubyObject) ident(getHomeDirectoryPath)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(user)operator(\)) operator({) + comment(/* + * TODO: This version is better than the hackish previous one. Windows + * behavior needs to be defined though. I suppose this version + * could be improved more too. + * TODO: /etc/passwd is also inadequate for MacOSX since it does not + * use /etc/passwd for regular user accounts + */) + + type(String) ident(passwd) operator(=) keyword(null)operator(;) + keyword(try) operator({) + type(FileInputStream) ident(stream) operator(=) keyword(new) type(FileInputStream)operator(()string<delimiter(")content(/etc/passwd)delimiter(")>operator(\))operator(;) + type(int) ident(totalBytes) operator(=) ident(stream)operator(.)ident(available)operator(()operator(\))operator(;) + type(byte)type([]) ident(bytes) operator(=) keyword(new) type(byte)operator([)ident(totalBytes)operator(])operator(;) + ident(stream)operator(.)ident(read)operator(()ident(bytes)operator(\))operator(;) + ident(stream)operator(.)ident(close)operator(()operator(\))operator(;) + ident(passwd) operator(=) keyword(new) type(String)operator(()ident(bytes)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + type(String)type([]) ident(rows) operator(=) ident(passwd)operator(.)ident(split)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))operator(;) + type(int) ident(rowCount) operator(=) ident(rows)operator(.)ident(length)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(rowCount)operator(;) ident(i)operator(++)operator(\)) operator({) + type(String)type([]) ident(fields) operator(=) ident(rows)operator([)ident(i)operator(])operator(.)ident(split)operator(()string<delimiter(")content(:)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(fields)operator([)integer(0)operator(])operator(.)ident(equals)operator(()ident(user)operator(\))operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(fields)operator([)integer(5)operator(])operator(\))operator(;) + operator(}) + operator(}) + + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(user )delimiter(")> operator(+) ident(user) operator(+) string<delimiter(")content( doesn't exist)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(getHomeDirectoryPath)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyHash) ident(systemHash) operator(=) operator(()ident(RubyHash)operator(\)) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ENV_JAVA)delimiter(")>operator(\))operator(;) + ident(RubyHash) ident(envHash) operator(=) operator(()ident(RubyHash)operator(\)) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ENV)delimiter(")>operator(\))operator(;) + ident(IRubyObject) ident(home) operator(=) ident(envHash)operator(.)ident(op_aref)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(HOME)delimiter(")>operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(home) operator(==) keyword(null) operator(||) ident(home)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(home) operator(=) ident(systemHash)operator(.)ident(op_aref)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(user.home)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(home) operator(==) keyword(null) operator(||) ident(home)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(home) operator(=) ident(envHash)operator(.)ident(op_aref)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(LOGDIR)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(home) operator(==) keyword(null) operator(||) ident(home)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(user.home/LOGDIR not set)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) operator(()ident(RubyString)operator(\)) ident(home)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.util.Comparator)operator(;) +keyword(import) include(java.util.Arrays)operator(;) +keyword(import) include(java.util.concurrent.atomic.AtomicInteger)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) + +keyword(import) include(org.jruby.exceptions.JumpException)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallBlock)operator(;) +keyword(import) include(org.jruby.runtime.BlockCallback)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) + +comment(/** + * The implementation of Ruby's Enumerable module. + */) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Enumerable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyEnumerable) operator({) + + directive(public) directive(static) ident(RubyModule) ident(createEnumerableModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(enumModule) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Enumerable)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setEnumerable)operator(()ident(enumModule)operator(\))operator(;) + + ident(enumModule)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyEnumerable)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(enumModule)operator(;) + operator(}) + + directive(public) directive(static) ident(IRubyObject) ident(callEach)operator(()ident(Ruby) ident(runtime)operator(,) ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) + ident(BlockCallback) ident(callback)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(self)operator(,) string<delimiter(")content(each)delimiter(")>operator(,) ident(CallBlock)operator(.)ident(newCallClosure)operator(()ident(self)operator(,) ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(,) + ident(Arity)operator(.)ident(noArguments)operator(()operator(\))operator(,) ident(callback)operator(,) ident(context)operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(class) class(ExitIteration) directive(extends) type(RuntimeException) operator({) + directive(public) type(Throwable) ident(fillInStackTrace)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(first)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(first_0)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + + directive(final) ident(IRubyObject)type([]) ident(holder) operator(=) keyword(new) ident(IRubyObject)type([])operator({)ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(})operator(;) + + keyword(try) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(ctx)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#first cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + ident(holder)operator([)integer(0)operator(]) operator(=) ident(largs)operator([)integer(0)operator(])operator(;) + keyword(throw) keyword(new) ident(ExitIteration)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(catch)operator(()ident(ExitIteration) ident(ei)operator(\)) operator({)operator(}) + + keyword(return) ident(holder)operator([)integer(0)operator(])operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(first)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(first_1)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(IRubyObject) ident(num)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + + keyword(if)operator(()ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(num)operator(\)) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative index)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(private) type(int) ident(iter) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(num)operator(\))operator(;) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#first cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if)operator(()ident(iter)operator(--) operator(==) integer(0)operator(\)) operator({) + keyword(throw) keyword(new) ident(ExitIteration)operator(()operator(\))operator(;) + operator(}) + ident(result)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(catch)operator(()ident(ExitIteration) ident(ei)operator(\)) operator({)operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_a)delimiter(")>operator(,) string<delimiter(")content(entries)delimiter(")>operator(})operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(to_a)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(AppendBlockCallback)operator(()ident(runtime)operator(,) ident(result)operator(\))operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sort)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sort)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(AppendBlockCallback)operator(()ident(runtime)operator(,) ident(result)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(sort_bang)operator(()ident(block)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sort_by)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sort_by)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) comment(// MUST NOT be used across threads) + + keyword(if) operator(()ident(self) keyword(instanceof) ident(RubyArray)operator(\)) operator({) + ident(RubyArray) ident(selfArray) operator(=) operator(()ident(RubyArray)operator(\)) ident(self)operator(;) + directive(final) ident(IRubyObject)type([])type([]) ident(valuesAndCriteria) operator(=) keyword(new) ident(IRubyObject)operator([)ident(selfArray)operator(.)ident(size)operator(()operator(\))operator(])operator([)integer(2)operator(])operator(;) + + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + type(AtomicInteger) ident(i) operator(=) keyword(new) type(AtomicInteger)operator(()integer(0)operator(\))operator(;) + + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(IRubyObject)type([]) ident(myVandC) operator(=) ident(valuesAndCriteria)operator([)ident(i)operator(.)ident(getAndIncrement)operator(()operator(\))operator(])operator(;) + ident(myVandC)operator([)integer(0)operator(]) operator(=) ident(largs)operator([)integer(0)operator(])operator(;) + ident(myVandC)operator([)integer(1)operator(]) operator(=) ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + type(Arrays)operator(.)ident(sort)operator(()ident(valuesAndCriteria)operator(,) keyword(new) type(Comparator)operator(<)ident(IRubyObject)type([])operator(>)operator(()operator(\)) operator({) + directive(public) type(int) ident(compare)operator(()ident(IRubyObject)type([]) ident(o1)operator(,) ident(IRubyObject)type([]) ident(o2)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(fix2int)operator(()ident(o1)operator([)integer(1)operator(])operator(.)ident(callMethod)operator(()ident(localContext)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(o2)operator([)integer(1)operator(])operator(\))operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + ident(IRubyObject) ident(dstArray)type([]) operator(=) keyword(new) ident(IRubyObject)operator([)ident(selfArray)operator(.)ident(size)operator(()operator(\))operator(])operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(dstArray)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(dstArray)operator([)ident(i)operator(]) operator(=) ident(valuesAndCriteria)operator([)ident(i)operator(])operator([)integer(0)operator(])operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newArrayNoCopy)operator(()ident(dstArray)operator(\))operator(;) + operator(}) keyword(else) operator({) + directive(final) ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(AppendBlockCallback)operator(()ident(runtime)operator(,) ident(result)operator(\))operator(\))operator(;) + + directive(final) ident(IRubyObject)type([])type([]) ident(valuesAndCriteria) operator(=) keyword(new) ident(IRubyObject)operator([)ident(result)operator(.)ident(size)operator(()operator(\))operator(])operator([)integer(2)operator(])operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(valuesAndCriteria)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(val) operator(=) ident(result)operator(.)ident(eltInternal)operator(()ident(i)operator(\))operator(;) + ident(valuesAndCriteria)operator([)ident(i)operator(])operator([)integer(0)operator(]) operator(=) ident(val)operator(;) + ident(valuesAndCriteria)operator([)ident(i)operator(])operator([)integer(1)operator(]) operator(=) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(val)operator(\))operator(;) + operator(}) + + type(Arrays)operator(.)ident(sort)operator(()ident(valuesAndCriteria)operator(,) keyword(new) type(Comparator)operator(<)ident(IRubyObject)type([])operator(>)operator(()operator(\)) operator({) + directive(public) type(int) ident(compare)operator(()ident(IRubyObject)type([]) ident(o1)operator(,) ident(IRubyObject)type([]) ident(o2)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(fix2int)operator(()ident(o1)operator([)integer(1)operator(])operator(.)ident(callMethod)operator(()ident(localContext)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(o2)operator([)integer(1)operator(])operator(\))operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(valuesAndCriteria)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(eltInternalSet)operator(()ident(i)operator(,) ident(valuesAndCriteria)operator([)ident(i)operator(])operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(grep)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(grep)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(IRubyObject) ident(pattern)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(ctx)operator(.)ident(setRubyFrameDelta)operator(()ident(ctx)operator(.)ident(getRubyFrameDelta)operator(()operator(\))operator(+)integer(2)operator(\))operator(;) + keyword(if) operator(()ident(pattern)operator(.)ident(callMethod)operator(()ident(ctx)operator(,) ident(MethodIndex)operator(.)ident(OP_EQQ)operator(,) string<delimiter(")content(===)delimiter(")>operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(value) operator(=) ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + directive(synchronized) operator(()ident(result)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(value)operator(\))operator(;) + operator(}) + operator(}) + ident(ctx)operator(.)ident(setRubyFrameDelta)operator(()ident(ctx)operator(.)ident(getRubyFrameDelta)operator(()operator(\))operator(-)integer(2)operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(pattern)operator(.)ident(callMethod)operator(()ident(ctx)operator(,) ident(MethodIndex)operator(.)ident(OP_EQQ)operator(,) string<delimiter(")content(===)delimiter(")>operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + directive(synchronized) operator(()ident(result)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(detect)delimiter(")>operator(,) string<delimiter(")content(find)delimiter(")>operator(})operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(detect)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(IRubyObject) ident(result)type([]) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) keyword(null) operator(})operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + ident(IRubyObject) ident(ifnone) operator(=) keyword(null)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) ident(ifnone) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + + keyword(try) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#detect/find cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(result)operator([)integer(0)operator(]) operator(=) ident(largs)operator([)integer(0)operator(])operator(;) + keyword(throw) ident(JumpException)operator(.)ident(SPECIAL_JUMP)operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(SpecialJump) ident(sj)operator(\)) operator({) + keyword(return) ident(result)operator([)integer(0)operator(])operator(;) + operator(}) + + keyword(return) ident(ifnone) operator(!=) keyword(null) operator(?) ident(ifnone)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(call)delimiter(")>operator(\)) operator(:) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(select)delimiter(")>operator(,) string<delimiter(")content(find_all)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(select)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + directive(synchronized) operator(()ident(result)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reject)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(reject)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + directive(synchronized) operator(()ident(result)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(collect)delimiter(")>operator(,) string<delimiter(")content(map)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(collect)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(IRubyObject) ident(value) operator(=) ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + directive(synchronized) operator(()ident(result)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(value)operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(AppendBlockCallback)operator(()ident(runtime)operator(,) ident(result)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inject)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(inject)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(IRubyObject) ident(result)type([]) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) keyword(null) operator(})operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) ident(result)operator([)integer(0)operator(]) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#inject cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + ident(result)operator([)integer(0)operator(]) operator(=) ident(result)operator([)integer(0)operator(]) operator(==) keyword(null) operator(?) + ident(largs)operator([)integer(0)operator(]) operator(:) ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(runtime)operator(.)ident(newArray)operator(()ident(result)operator([)integer(0)operator(])operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(,) keyword(null)operator(,) keyword(null)operator(,) keyword(true)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(result)operator([)integer(0)operator(]) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(result)operator([)integer(0)operator(])operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(partition)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(partition)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(arr_true) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(arr_false) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + directive(synchronized) operator(()ident(arr_true)operator(\)) operator({) + ident(arr_true)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + directive(synchronized) operator(()ident(arr_false)operator(\)) operator({) + ident(arr_false)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(arr_true)operator(,) ident(arr_false)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(class) class(EachWithIndex) directive(implements) ident(BlockCallback) operator({) + directive(private) type(int) ident(index) operator(=) integer(0)operator(;) + directive(private) directive(final) ident(Block) ident(block)operator(;) + directive(private) directive(final) ident(Ruby) ident(runtime)operator(;) + + directive(public) ident(EachWithIndex)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(Block) ident(block)operator(\)) operator({) + local_variable(this)operator(.)ident(block) operator(=) ident(block)operator(;) + local_variable(this)operator(.)ident(runtime) operator(=) ident(ctx)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(iargs)operator(,) ident(Block) ident(block)operator(\)) operator({) + local_variable(this)operator(.)ident(block)operator(.)ident(call)operator(()ident(context)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(runtime)operator(.)ident(newArray)operator(()ident(iargs)operator([)integer(0)operator(])operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(index)operator(++)operator(\))operator(\)) operator(})operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_with_index)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(each_with_index)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(self)operator(,) string<delimiter(")content(each)delimiter(")>operator(,) ident(CallBlock)operator(.)ident(newCallClosure)operator(()ident(self)operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getEnumerable)operator(()operator(\))operator(,) + ident(Arity)operator(.)ident(noArguments)operator(()operator(\))operator(,) keyword(new) ident(EachWithIndex)operator(()ident(context)operator(,) ident(block)operator(\))operator(,) ident(context)operator(\))operator(\))operator(;) + + keyword(return) ident(self)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(include?)delimiter(")>operator(,) string<delimiter(")content(member?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(include_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(IRubyObject) ident(arg)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + + keyword(try) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#include?/member? cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(RubyObject)operator(.)ident(equalInternal)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(,) ident(arg)operator(\))operator(\)) operator({) + keyword(throw) ident(JumpException)operator(.)ident(SPECIAL_JUMP)operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(SpecialJump) ident(sj)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(max)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(max)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(IRubyObject) ident(result)type([]) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) keyword(null) operator(})operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#max{} cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(result)operator([)integer(0)operator(]) operator(==) keyword(null) operator(||) ident(RubyComparable)operator(.)ident(cmpint)operator(()ident(ctx)operator(,) ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) + ident(runtime)operator(.)ident(newArray)operator(()ident(largs)operator([)integer(0)operator(])operator(,) ident(result)operator([)integer(0)operator(])operator(\))operator(\))operator(,) ident(largs)operator([)integer(0)operator(])operator(,) ident(result)operator([)integer(0)operator(])operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(result)operator([)integer(0)operator(]) operator(=) ident(largs)operator([)integer(0)operator(])operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + directive(synchronized) operator(()ident(result)operator(\)) operator({) + keyword(if) operator(()ident(result)operator([)integer(0)operator(]) operator(==) keyword(null) operator(||) ident(RubyComparable)operator(.)ident(cmpint)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(.)ident(callMethod)operator(()ident(ctx)operator(,) + ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(result)operator([)integer(0)operator(])operator(\))operator(,) ident(largs)operator([)integer(0)operator(])operator(,) ident(result)operator([)integer(0)operator(])operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(result)operator([)integer(0)operator(]) operator(=) ident(largs)operator([)integer(0)operator(])operator(;) + operator(}) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator([)integer(0)operator(]) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(result)operator([)integer(0)operator(])operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(min)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(min)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(IRubyObject) ident(result)type([]) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) keyword(null) operator(})operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#min{} cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(result)operator([)integer(0)operator(]) operator(==) keyword(null) operator(||) ident(RubyComparable)operator(.)ident(cmpint)operator(()ident(ctx)operator(,) ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) + ident(runtime)operator(.)ident(newArray)operator(()ident(largs)operator([)integer(0)operator(])operator(,) ident(result)operator([)integer(0)operator(])operator(\))operator(\))operator(,) ident(largs)operator([)integer(0)operator(])operator(,) ident(result)operator([)integer(0)operator(])operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(result)operator([)integer(0)operator(]) operator(=) ident(largs)operator([)integer(0)operator(])operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + directive(synchronized) operator(()ident(result)operator(\)) operator({) + keyword(if) operator(()ident(result)operator([)integer(0)operator(]) operator(==) keyword(null) operator(||) ident(RubyComparable)operator(.)ident(cmpint)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(.)ident(callMethod)operator(()ident(ctx)operator(,) + ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(result)operator([)integer(0)operator(])operator(\))operator(,) ident(largs)operator([)integer(0)operator(])operator(,) ident(result)operator([)integer(0)operator(])operator(\)) operator(<) integer(0)operator(\)) operator({) + ident(result)operator([)integer(0)operator(]) operator(=) ident(largs)operator([)integer(0)operator(])operator(;) + operator(}) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator([)integer(0)operator(]) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(result)operator([)integer(0)operator(])operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(all?)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(all_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + + keyword(try) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#all? cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(JumpException)operator(.)ident(SPECIAL_JUMP)operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#all? cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(largs)operator([)integer(0)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(JumpException)operator(.)ident(SPECIAL_JUMP)operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(SpecialJump) ident(sj)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(any?)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(any_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(ThreadContext) ident(localContext) operator(=) ident(context)operator(;) + + keyword(try) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#any? cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(JumpException)operator(.)ident(SPECIAL_JUMP)operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(localContext) operator(!=) ident(ctx)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(Enumerable#any? cannot be parallelized)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(largs)operator([)integer(0)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(JumpException)operator(.)ident(SPECIAL_JUMP)operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(SpecialJump) ident(sj)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zip)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(zip)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(IRubyObject)type([]) ident(args)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(args)operator([)ident(i)operator(]) operator(=) ident(TypeConverter)operator(.)ident(convertToType)operator(()ident(args)operator([)ident(i)operator(])operator(,) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_A)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(\))operator(;) + operator(}) + + directive(final) type(int) ident(aLen) operator(=) ident(args)operator(.)ident(length) operator(+) integer(1)operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + type(AtomicInteger) ident(ix) operator(=) keyword(new) type(AtomicInteger)operator(()integer(0)operator(\))operator(;) + + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(RubyArray) ident(array) operator(=) ident(runtime)operator(.)ident(newArray)operator(()ident(aLen)operator(\))operator(;) + type(int) ident(myIx) operator(=) ident(ix)operator(.)ident(getAndIncrement)operator(()operator(\))operator(;) + ident(array)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(,) ident(j) operator(=) ident(args)operator(.)ident(length)operator(;) ident(i) operator(<) ident(j)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()operator(()operator(()ident(RubyArray)operator(\)) ident(args)operator([)ident(i)operator(])operator(\))operator(.)ident(entry)operator(()ident(myIx)operator(\))operator(\))operator(;) + operator(}) + ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(array)operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + directive(final) ident(RubyArray) ident(zip) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + type(AtomicInteger) ident(ix) operator(=) keyword(new) type(AtomicInteger)operator(()integer(0)operator(\))operator(;) + + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(RubyArray) ident(array) operator(=) ident(runtime)operator(.)ident(newArray)operator(()ident(aLen)operator(\))operator(;) + ident(array)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + type(int) ident(myIx) operator(=) ident(ix)operator(.)ident(getAndIncrement)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(,) ident(j) operator(=) ident(args)operator(.)ident(length)operator(;) ident(i) operator(<) ident(j)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()operator(()operator(()ident(RubyArray)operator(\)) ident(args)operator([)ident(i)operator(])operator(\))operator(.)ident(entry)operator(()ident(myIx)operator(\))operator(\))operator(;) + operator(}) + directive(synchronized) operator(()ident(zip)operator(\)) operator({) + ident(zip)operator(.)ident(append)operator(()ident(array)operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + keyword(return) ident(zip)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(group_by)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(group_by)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyHash) ident(result) operator(=) keyword(new) ident(RubyHash)operator(()ident(runtime)operator(\))operator(;) + + ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(IRubyObject) ident(key) operator(=) ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + directive(synchronized) operator(()ident(result)operator(\)) operator({) + ident(IRubyObject) ident(curr) operator(=) ident(result)operator(.)ident(fastARef)operator(()ident(key)operator(\))operator(;) + + keyword(if) operator(()ident(curr) operator(==) keyword(null)operator(\)) operator({) + ident(curr) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + ident(result)operator(.)ident(fastASet)operator(()ident(key)operator(,) ident(curr)operator(\))operator(;) + operator(}) + ident(curr)operator(.)ident(callMethod)operator(()ident(ctx)operator(,) ident(MethodIndex)operator(.)ident(OP_LSHIFT)operator(,) string<delimiter(")content(<<)delimiter(")>operator(,) ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(public) directive(static) directive(final) type(class) class(AppendBlockCallback) directive(implements) ident(BlockCallback) operator({) + directive(private) ident(Ruby) ident(runtime)operator(;) + directive(private) ident(RubyArray) ident(result)operator(;) + + directive(public) ident(AppendBlockCallback)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyArray) ident(result)operator(\)) operator({) + local_variable(this)operator(.)ident(runtime) operator(=) ident(runtime)operator(;) + local_variable(this)operator(.)ident(result) operator(=) ident(result)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006 Michael Studman <me@michaelstudman.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.BlockCallback)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * Implementation of Ruby's Enumerator module. + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Enumerable::Enumerator)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Enumerable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyEnumerator) directive(extends) ident(RubyObject) operator({) + comment(/** target for each operation */) + directive(private) ident(IRubyObject) ident(object)operator(;) + + comment(/** method to invoke for each operation */) + directive(private) ident(IRubyObject) ident(method)operator(;) + + comment(/** args to each method */) + directive(private) ident(IRubyObject)type([]) ident(methodArgs)operator(;) + + directive(private) directive(static) ident(ObjectAllocator) ident(ENUMERATOR_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyEnumerator)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) type(void) ident(defineEnumerator)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(kernel) operator(=) ident(runtime)operator(.)ident(getKernel)operator(()operator(\))operator(;) + ident(kernel)operator(.)ident(defineAnnotatedMethod)operator(()ident(RubyEnumerator)operator(.)ident(class)operator(,) string<delimiter(")content(obj_to_enum)delimiter(")>operator(\))operator(;) + + ident(RubyModule) ident(enm) operator(=) ident(runtime)operator(.)ident(getClassFromPath)operator(()string<delimiter(")content(Enumerable)delimiter(")>operator(\))operator(;) + ident(enm)operator(.)ident(defineAnnotatedMethod)operator(()ident(RubyEnumerator)operator(.)ident(class)operator(,) string<delimiter(")content(each_with_index)delimiter(")>operator(\))operator(;) + ident(enm)operator(.)ident(defineAnnotatedMethod)operator(()ident(RubyEnumerator)operator(.)ident(class)operator(,) string<delimiter(")content(each_slice)delimiter(")>operator(\))operator(;) + ident(enm)operator(.)ident(defineAnnotatedMethod)operator(()ident(RubyEnumerator)operator(.)ident(class)operator(,) string<delimiter(")content(enum_slice)delimiter(")>operator(\))operator(;) + ident(enm)operator(.)ident(defineAnnotatedMethod)operator(()ident(RubyEnumerator)operator(.)ident(class)operator(,) string<delimiter(")content(each_cons)delimiter(")>operator(\))operator(;) + ident(enm)operator(.)ident(defineAnnotatedMethod)operator(()ident(RubyEnumerator)operator(.)ident(class)operator(,) string<delimiter(")content(enum_cons)delimiter(")>operator(\))operator(;) + + ident(RubyClass) ident(enmr) operator(=) ident(enm)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Enumerator)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ENUMERATOR_ALLOCATOR)operator(\))operator(;) + + ident(enmr)operator(.)ident(includeModule)operator(()ident(enm)operator(\))operator(;) + + ident(enmr)operator(.)ident(defineAnnotatedMethod)operator(()ident(RubyEnumerator)operator(.)ident(class)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(\))operator(;) + ident(enmr)operator(.)ident(defineAnnotatedMethod)operator(()ident(RubyEnumerator)operator(.)ident(class)operator(,) string<delimiter(")content(each)delimiter(")>operator(\))operator(;) + + ident(runtime)operator(.)ident(setEnumerator)operator(()ident(enmr)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_enum)delimiter(")>operator(,) string<delimiter(")content(enum_for)delimiter(")>operator(})operator(,) ident(optional) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(obj_to_enum)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject)type([]) ident(newArgs) operator(=) keyword(new) ident(IRubyObject)operator([)ident(args)operator(.)ident(length) operator(+) integer(1)operator(])operator(;) + ident(newArgs)operator([)integer(0)operator(]) operator(=) ident(self)operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(0)operator(,) ident(newArgs)operator(,) integer(1)operator(,) ident(args)operator(.)ident(length)operator(\))operator(;) + + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getEnumerator)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(newArgs)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyEnumerator)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + ident(object) operator(=) ident(method) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(object) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(method) operator(=) ident(args)operator(.)ident(length) operator(>) integer(1) operator(?) ident(args)operator([)integer(1)operator(]) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(fastNewSymbol)operator(()string<delimiter(")content(each)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(2)operator(\)) operator({) + ident(methodArgs) operator(=) keyword(new) ident(IRubyObject)operator([)type(Math)operator(.)ident(max)operator(()integer(0)operator(,) ident(args)operator(.)ident(length) operator(-) integer(2)operator(\))operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(2)operator(,) ident(methodArgs)operator(,) integer(0)operator(,) ident(args)operator(.)ident(length) operator(-) integer(2)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(methodArgs) operator(=) keyword(new) ident(IRubyObject)operator([)integer(0)operator(])operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** + * Send current block and supplied args to method on target. According to MRI + * Block may not be given and "each" should just ignore it and call on through to + * underlying method. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(object)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(method)operator(.)ident(asJavaString)operator(()operator(\))operator(,) ident(methodArgs)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(enum_with_index)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(each_with_index)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(\)) operator({) + ident(IRubyObject) ident(enumerator) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getEnumerator)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(enumerator)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(self)operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastNewSymbol)operator(()string<delimiter(")content(each_with_index)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_slice)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(each_slice)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) type(int) ident(size) operator(=) operator(()type(int)operator(\))ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg)operator(\))operator(;) + + keyword(if) operator(()ident(size) operator(<=) integer(0)operator(\)) keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid slice size)delimiter(")>operator(\))operator(;) + + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(result)type([]) operator(=) keyword(new) ident(RubyArray)type([])operator({)ident(runtime)operator(.)ident(newArray)operator(()ident(size)operator(\))operator(})operator(;) + + ident(RubyEnumerable)operator(.)ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(result)operator([)integer(0)operator(])operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(result)operator([)integer(0)operator(])operator(.)ident(size)operator(()operator(\)) operator(==) ident(size)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(result)operator([)integer(0)operator(])operator(\))operator(;) + ident(result)operator([)integer(0)operator(]) operator(=) ident(runtime)operator(.)ident(newArray)operator(()ident(size)operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(if) operator(()ident(result)operator([)integer(0)operator(])operator(.)ident(size)operator(()operator(\)) operator(>) integer(0)operator(\)) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(result)operator([)integer(0)operator(])operator(\))operator(;) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_cons)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(each_cons)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) type(int) ident(size) operator(=) operator(()type(int)operator(\))ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg)operator(\))operator(;) + + keyword(if) operator(()ident(size) operator(<=) integer(0)operator(\)) keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid size)delimiter(")>operator(\))operator(;) + + directive(final) ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()ident(size)operator(\))operator(;) + + ident(RubyEnumerable)operator(.)ident(callEach)operator(()ident(runtime)operator(,) ident(context)operator(,) ident(self)operator(,) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(largs)operator(,) ident(Block) ident(blk)operator(\)) operator({) + keyword(if) operator(()ident(result)operator(.)ident(size)operator(()operator(\)) operator(==) ident(size)operator(\)) ident(result)operator(.)ident(shift)operator(()operator(\))operator(;) + ident(result)operator(.)ident(append)operator(()ident(largs)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(result)operator(.)ident(size)operator(()operator(\)) operator(==) ident(size)operator(\)) ident(block)operator(.)ident(yield)operator(()ident(ctx)operator(,) ident(result)operator(.)ident(aryDup)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(enum_slice)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(enum_slice)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(IRubyObject) ident(enumerator) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getEnumerator)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(enumerator)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(self)operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastNewSymbol)operator(()string<delimiter(")content(each_slice)delimiter(")>operator(\))operator(,) ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(enum_cons)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(enum_cons)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(IRubyObject) ident(enumerator) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getEnumerator)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(enumerator)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(self)operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastNewSymbol)operator(()string<delimiter(")content(each_cons)delimiter(")>operator(\))operator(,) ident(arg)operator(\))operator(;) + operator(}) +operator(}) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.ext.posix.Passwd)operator(;) +keyword(import) include(org.jruby.ext.posix.Group)operator(;) +keyword(import) include(org.jruby.ext.posix.POSIX)operator(;) +keyword(import) include(org.jruby.ext.posix.util.Platform)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Etc)delimiter(")>operator(\)) +directive(public) type(class) class(RubyEtc) operator({) + directive(public) directive(static) ident(RubyModule) ident(createEtcModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(etcModule) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Etc)delimiter(")>operator(\))operator(;) + + ident(runtime)operator(.)ident(setEtc)operator(()ident(etcModule)operator(\))operator(;) + + ident(etcModule)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyEtc)operator(.)ident(class)operator(\))operator(;) + + ident(definePasswdStruct)operator(()ident(runtime)operator(\))operator(;) + ident(defineGroupStruct)operator(()ident(runtime)operator(\))operator(;) + + keyword(return) ident(etcModule)operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(definePasswdStruct)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(IRubyObject)type([]) ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) + ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(Passwd)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(name)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(passwd)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(uid)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(gid)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(gecos)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(dir)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(shell)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(change)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(uclass)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(expire)delimiter(")>operator(\)) + operator(})operator(;) + + ident(runtime)operator(.)ident(setPasswdStruct)operator(()ident(RubyStruct)operator(.)ident(newInstance)operator(()ident(runtime)operator(.)ident(getStructClass)operator(()operator(\))operator(,) ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(defineGroupStruct)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(IRubyObject)type([]) ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) + ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(Group)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(name)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(passwd)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(gid)delimiter(")>operator(\))operator(,) + ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(mem)delimiter(")>operator(\)) + operator(})operator(;) + + ident(runtime)operator(.)ident(setGroupStruct)operator(()ident(RubyStruct)operator(.)ident(newInstance)operator(()ident(runtime)operator(.)ident(getStructClass)operator(()operator(\))operator(,) ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(setupPasswd)operator(()ident(Ruby) ident(runtime)operator(,) ident(Passwd) ident(passwd)operator(\)) operator({) + ident(IRubyObject)type([]) ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) + ident(runtime)operator(.)ident(newString)operator(()ident(passwd)operator(.)ident(getLoginName)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()ident(passwd)operator(.)ident(getPassword)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newFixnum)operator(()ident(passwd)operator(.)ident(getUID)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newFixnum)operator(()ident(passwd)operator(.)ident(getGID)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()ident(passwd)operator(.)ident(getGECOS)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()ident(passwd)operator(.)ident(getHome)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()ident(passwd)operator(.)ident(getShell)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newFixnum)operator(()ident(passwd)operator(.)ident(getPasswdChangeTime)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()ident(passwd)operator(.)ident(getAccessClass)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newFixnum)operator(()ident(passwd)operator(.)ident(getExpire)operator(()operator(\))operator(\)) + + operator(})operator(;) + + keyword(return) ident(RubyStruct)operator(.)ident(newStruct)operator(()ident(runtime)operator(.)ident(getPasswdStruct)operator(()operator(\))operator(,) ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + + directive(private) directive(static) ident(IRubyObject) ident(setupGroup)operator(()ident(Ruby) ident(runtime)operator(,) type(Group) ident(group)operator(\)) operator({) + ident(IRubyObject)type([]) ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) + ident(runtime)operator(.)ident(newString)operator(()ident(group)operator(.)ident(getName)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()ident(group)operator(.)ident(getPassword)operator(()operator(\))operator(\))operator(,) + ident(runtime)operator(.)ident(newFixnum)operator(()ident(group)operator(.)ident(getGID)operator(()operator(\))operator(\))operator(,) + ident(intoStringArray)operator(()ident(runtime)operator(,) ident(group)operator(.)ident(getMembers)operator(()operator(\))operator(\)) + operator(})operator(;) + + keyword(return) ident(RubyStruct)operator(.)ident(newStruct)operator(()ident(runtime)operator(.)ident(getGroupStruct)operator(()operator(\))operator(,) ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(intoStringArray)operator(()ident(Ruby) ident(runtime)operator(,) type(String)type([]) ident(members)operator(\)) operator({) + ident(IRubyObject)type([]) ident(arr) operator(=) keyword(new) ident(IRubyObject)operator([)ident(members)operator(.)ident(length)operator(])operator(;) + keyword(for)operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i)operator(<)ident(arr)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(arr)operator([)ident(i)operator(]) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(members)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(newArrayNoCopy)operator(()ident(arr)operator(\))operator(;) + operator(}) + + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getpwuid)delimiter(")>operator(,) ident(optional)operator(=)integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getpwuid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(POSIX) ident(posix) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(;) + type(int) ident(uid) operator(=) ident(args)operator(.)ident(length) operator(==) integer(0) operator(?) ident(posix)operator(.)ident(getuid)operator(()operator(\)) operator(:) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + ident(Passwd) ident(pwd) operator(=) ident(posix)operator(.)ident(getpwuid)operator(()ident(uid)operator(\))operator(;) + keyword(if)operator(()ident(pwd) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS)operator(\)) operator({) comment(// MRI behavior) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(can't find user for )delimiter(")> operator(+) ident(uid)operator(\))operator(;) + operator(}) + keyword(return) ident(setupPasswd)operator(()ident(runtime)operator(,) ident(pwd)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getpwnam)delimiter(")>operator(,) ident(required)operator(=)integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getpwnam)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(name)operator(\)) operator({) + type(String) ident(nam) operator(=) ident(name)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(Passwd) ident(pwd) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getpwnam)operator(()ident(nam)operator(\))operator(;) + keyword(if)operator(()ident(pwd) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS)operator(\)) operator({) comment(// MRI behavior) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(can't find user for )delimiter(")> operator(+) ident(nam)operator(\))operator(;) + operator(}) + keyword(return) ident(setupPasswd)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(pwd)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(passwd)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(frame)operator(=)keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(passwd)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(POSIX) ident(posix) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(;) + keyword(if)operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(posix)operator(.)ident(setpwent)operator(()operator(\))operator(;) + ident(Passwd) ident(pw)operator(;) + keyword(while)operator(()operator(()ident(pw) operator(=) ident(posix)operator(.)ident(getpwent)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(setupPasswd)operator(()ident(runtime)operator(,) ident(pw)operator(\))operator(\))operator(;) + operator(}) + ident(posix)operator(.)ident(endpwent)operator(()operator(\))operator(;) + operator(}) + + ident(Passwd) ident(pw) operator(=) ident(posix)operator(.)ident(getpwent)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pw) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(setupPasswd)operator(()ident(runtime)operator(,) ident(pw)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getlogin)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getlogin)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + type(String) ident(login) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getlogin)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(login) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newString)operator(()ident(login)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(endpwent)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(endpwent)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(endpwent)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setpwent)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setpwent)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setpwent)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getpwent)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getpwent)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(Passwd) ident(passwd) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getpwent)operator(()operator(\))operator(;) + keyword(if) operator(()ident(passwd) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(setupPasswd)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(passwd)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getgrnam)delimiter(")>operator(,) ident(required)operator(=)integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getgrnam)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(name)operator(\)) operator({) + type(String) ident(nam) operator(=) ident(name)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + type(Group) ident(grp) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getgrnam)operator(()ident(nam)operator(\))operator(;) + keyword(if)operator(()ident(grp) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS)operator(\)) operator({) comment(// MRI behavior) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(can't find group for )delimiter(")> operator(+) ident(nam)operator(\))operator(;) + operator(}) + keyword(return) ident(setupGroup)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(grp)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getgrgid)delimiter(")>operator(,) ident(optional)operator(=)integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getgrgid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(POSIX) ident(posix) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(;) + type(int) ident(gid) operator(=) ident(args)operator(.)ident(length) operator(==) integer(0) operator(?) ident(posix)operator(.)ident(getgid)operator(()operator(\)) operator(:) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + type(Group) ident(gr) operator(=) ident(posix)operator(.)ident(getgrgid)operator(()ident(gid)operator(\))operator(;) + keyword(if)operator(()ident(gr) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS)operator(\)) operator({) comment(// MRI behavior) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(can't find group for )delimiter(")> operator(+) ident(gid)operator(\))operator(;) + operator(}) + keyword(return) ident(setupGroup)operator(()ident(runtime)operator(,) ident(gr)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(endgrent)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(endgrent)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(endgrent)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setgrent)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setgrent)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setgrent)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(group)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(frame)operator(=)keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(group)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(POSIX) ident(posix) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(;) + keyword(if)operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(posix)operator(.)ident(setgrent)operator(()operator(\))operator(;) + type(Group) ident(gr)operator(;) + keyword(while)operator(()operator(()ident(gr) operator(=) ident(posix)operator(.)ident(getgrent)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(setupGroup)operator(()ident(runtime)operator(,) ident(gr)operator(\))operator(\))operator(;) + operator(}) + ident(posix)operator(.)ident(endgrent)operator(()operator(\))operator(;) + operator(}) + + type(Group) ident(gr) operator(=) ident(posix)operator(.)ident(getgrent)operator(()operator(\))operator(;) + keyword(if) operator(()ident(gr) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(setupGroup)operator(()ident(runtime)operator(,) ident(gr)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getgrent)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getgrent)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(Group) ident(gr) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getgrent)operator(()operator(\))operator(;) + keyword(if) operator(()ident(gr) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(setupGroup)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(gr)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Joey Gibson <joey@joeygibson.com> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 David Corbin <dcorbin@users.sf.net> + * Copyright (C\) 2006 Michael Studman <codehaus@michaelstudman.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.PrintStream)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) + +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.Frame)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ObjectMarshal)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.builtin.Variable)operator(;) +keyword(import) include(org.jruby.runtime.component.VariableEntry)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.SafePropertyAccessor)operator(;) + +comment(/** + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Exception)delimiter(")>operator(\)) +directive(public) type(class) class(RubyException) directive(extends) ident(RubyObject) operator({) + directive(private) type(StackTraceElement)type([]) ident(backtraceFrames)operator(;) + directive(private) type(StackTraceElement)type([]) ident(javaStackTrace)operator(;) + directive(private) ident(IRubyObject) ident(backtrace)operator(;) + directive(public) ident(IRubyObject) ident(message)operator(;) + directive(public) directive(static) directive(final) type(int) ident(TRACE_HEAD) operator(=) integer(8)operator(;) + directive(public) directive(static) directive(final) type(int) ident(TRACE_TAIL) operator(=) integer(4)operator(;) + directive(public) directive(static) directive(final) type(int) ident(TRACE_MAX) operator(=) ident(TRACE_HEAD) operator(+) ident(TRACE_TAIL) operator(+) integer(6)operator(;) + + directive(protected) ident(RubyException)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) ident(rubyClass)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyException)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) type(String) ident(message)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + + local_variable(this)operator(.)ident(message) operator(=) ident(message) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(newString)operator(()ident(message)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(EXCEPTION_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(RubyException) ident(instance) operator(=) keyword(new) ident(RubyException)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + + comment(// for future compatibility as constructors move toward not accepting metaclass?) + ident(instance)operator(.)ident(setMetaClass)operator(()ident(klass)operator(\))operator(;) + + keyword(return) ident(instance)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(static) directive(final) ident(ObjectMarshal) ident(EXCEPTION_MARSHAL) operator(=) keyword(new) ident(ObjectMarshal)operator(()operator(\)) operator({) + directive(public) type(void) ident(marshalTo)operator(()ident(Ruby) ident(runtime)operator(,) type(Object) ident(obj)operator(,) ident(RubyClass) ident(type)operator(,) + ident(MarshalStream) ident(marshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyException) ident(exc) operator(=) operator(()ident(RubyException)operator(\))ident(obj)operator(;) + + ident(marshalStream)operator(.)ident(registerLinkTarget)operator(()ident(exc)operator(\))operator(;) + type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(attrs) operator(=) ident(exc)operator(.)ident(getVariableList)operator(()operator(\))operator(;) + ident(attrs)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(() + string<delimiter(")content(mesg)delimiter(")>operator(,) ident(exc)operator(.)ident(message) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(exc)operator(.)ident(message)operator(\))operator(\))operator(;) + ident(attrs)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()string<delimiter(")content(bt)delimiter(")>operator(,) ident(exc)operator(.)ident(getBacktrace)operator(()operator(\))operator(\))operator(\))operator(;) + ident(marshalStream)operator(.)ident(dumpVariables)operator(()ident(attrs)operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(unmarshalFrom)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(,) + ident(UnmarshalStream) ident(unmarshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyException) ident(exc) operator(=) operator(()ident(RubyException)operator(\))ident(type)operator(.)ident(allocate)operator(()operator(\))operator(;) + + ident(unmarshalStream)operator(.)ident(registerLinkTarget)operator(()ident(exc)operator(\))operator(;) + ident(unmarshalStream)operator(.)ident(defaultVariablesUnmarshal)operator(()ident(exc)operator(\))operator(;) + + ident(exc)operator(.)ident(message) operator(=) ident(exc)operator(.)ident(removeInternalVariable)operator(()string<delimiter(")content(mesg)delimiter(")>operator(\))operator(;) + ident(exc)operator(.)ident(set_backtrace)operator(()ident(exc)operator(.)ident(removeInternalVariable)operator(()string<delimiter(")content(bt)delimiter(")>operator(\))operator(\))operator(;) + + keyword(return) ident(exc)operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createExceptionClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(exceptionClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Exception)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(EXCEPTION_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setException)operator(()ident(exceptionClass)operator(\))operator(;) + + ident(exceptionClass)operator(.)ident(setMarshal)operator(()ident(EXCEPTION_MARSHAL)operator(\))operator(;) + ident(exceptionClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyException)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(exceptionClass)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyException) ident(newException)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(excptnClass)operator(,) type(String) ident(msg)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyException)operator(()ident(runtime)operator(,) ident(excptnClass)operator(,) ident(msg)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(setBacktraceFrames)operator(()type(StackTraceElement)type([]) ident(backtraceFrames)operator(\)) operator({) + local_variable(this)operator(.)ident(backtraceFrames) operator(=) ident(backtraceFrames)operator(;) + keyword(if) operator(()ident(TRACE_TYPE) operator(==) ident(RAW) operator(||) + ident(TRACE_TYPE) operator(==) ident(RAW_FILTERED) operator(||) + ident(TRACE_TYPE) operator(==) ident(RUBY_COMPILED) operator(||) + ident(TRACE_TYPE) operator(==) ident(RUBY_HYBRID)operator(\)) operator({) + ident(javaStackTrace) operator(=) type(Thread)operator(.)ident(currentThread)operator(()operator(\))operator(.)ident(getStackTrace)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) directive(final) type(int) ident(RAW) operator(=) integer(0)operator(;) + directive(public) directive(static) directive(final) type(int) ident(RAW_FILTERED) operator(=) integer(1)operator(;) + directive(public) directive(static) directive(final) type(int) ident(RUBY_FRAMED) operator(=) integer(2)operator(;) + directive(public) directive(static) directive(final) type(int) ident(RUBY_COMPILED) operator(=) integer(3)operator(;) + directive(public) directive(static) directive(final) type(int) ident(RUBY_HYBRID) operator(=) integer(4)operator(;) + + directive(public) directive(static) directive(final) type(int) ident(TRACE_TYPE)operator(;) + + directive(static) operator({) + type(String) ident(style) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.backtrace.style)delimiter(")>operator(,) string<delimiter(")content(ruby_framed)delimiter(")>operator(\))operator(.)ident(toLowerCase)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(style)operator(.)ident(equals)operator(()string<delimiter(")content(raw)delimiter(")>operator(\))operator(\)) ident(TRACE_TYPE) operator(=) ident(RAW)operator(;) + keyword(else) keyword(if) operator(()ident(style)operator(.)ident(equals)operator(()string<delimiter(")content(raw_filtered)delimiter(")>operator(\))operator(\)) ident(TRACE_TYPE) operator(=) ident(RAW_FILTERED)operator(;) + keyword(else) keyword(if) operator(()ident(style)operator(.)ident(equals)operator(()string<delimiter(")content(ruby_framed)delimiter(")>operator(\))operator(\)) ident(TRACE_TYPE) operator(=) ident(RUBY_FRAMED)operator(;) + keyword(else) keyword(if) operator(()ident(style)operator(.)ident(equals)operator(()string<delimiter(")content(ruby_compiled)delimiter(")>operator(\))operator(\)) ident(TRACE_TYPE) operator(=) ident(RUBY_COMPILED)operator(;) + keyword(else) keyword(if) operator(()ident(style)operator(.)ident(equals)operator(()string<delimiter(")content(ruby_hybrid)delimiter(")>operator(\))operator(\)) ident(TRACE_TYPE) operator(=) ident(RUBY_HYBRID)operator(;) + keyword(else) ident(TRACE_TYPE) operator(=) ident(RUBY_FRAMED)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getBacktrace)operator(()operator(\)) operator({) + keyword(if) operator(()ident(backtrace) operator(==) keyword(null)operator(\)) operator({) + ident(initBacktrace)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(backtrace)operator(;) + operator(}) + + directive(public) type(void) ident(initBacktrace)operator(()operator(\)) operator({) + keyword(switch) operator(()ident(TRACE_TYPE)operator(\)) operator({) + keyword(case) ident(RAW)operator(:) + ident(backtrace) operator(=) ident(ThreadContext)operator(.)ident(createRawBacktrace)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(javaStackTrace)operator(,) keyword(false)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) ident(RAW_FILTERED)operator(:) + ident(backtrace) operator(=) ident(ThreadContext)operator(.)ident(createRawBacktrace)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(javaStackTrace)operator(,) keyword(true)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) ident(RUBY_FRAMED)operator(:) + ident(backtrace) operator(=) ident(backtraceFrames) operator(==) keyword(null) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(ThreadContext)operator(.)ident(createBacktraceFromFrames)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(backtraceFrames)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) ident(RUBY_COMPILED)operator(:) + ident(backtrace) operator(=) ident(ThreadContext)operator(.)ident(createRubyCompiledBacktrace)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(javaStackTrace)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) ident(RUBY_HYBRID)operator(:) + ident(backtrace) operator(=) ident(ThreadContext)operator(.)ident(createRubyHybridBacktrace)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(backtraceFrames)operator(,) ident(javaStackTrace)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + keyword(break)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) ident(message) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(backtrace)operator(()operator(\)) operator({) + keyword(return) ident(getBacktrace)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_backtrace)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()ident(obj)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(backtrace) operator(=) keyword(null)operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(!)ident(isArrayOfStrings)operator(()ident(obj)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(backtrace must be Array of String)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(backtrace) operator(=) operator(()ident(RubyArray)operator(\)) ident(obj)operator(;) + operator(}) + keyword(return) ident(backtrace)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exception)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exception)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyClass)operator(\)) ident(recv)operator(\))operator(.)ident(newInstance)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyException) ident(exception)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0) operator(:) + keyword(return) local_variable(this)operator(;) + keyword(case) integer(1) operator(:) + keyword(if)operator(()ident(args)operator([)integer(0)operator(]) operator(==) local_variable(this)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + ident(RubyException) ident(ret) operator(=) operator(()ident(RubyException)operator(\))ident(rbClone)operator(()operator(\))operator(;) + ident(ret)operator(.)ident(initialize)operator(()ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) comment(// This looks wrong, but it's the way MRI does it.) + keyword(return) ident(ret)operator(;) + keyword(default) operator(:) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(Wrong argument count)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(if) operator(()ident(message)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + ident(message)operator(.)ident(setTaint)operator(()ident(isTaint)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(message)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_str)delimiter(")>operator(,) string<delimiter(")content(message)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(to_str)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_S)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** inspects an object and return a kind of debug information + * + *@return A RubyString containing the debug information. + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(inspect)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyModule) ident(rubyClass) operator(=) ident(getMetaClass)operator(()operator(\))operator(;) + ident(RubyString) ident(exception) operator(=) ident(RubyString)operator(.)ident(objAsString)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + + keyword(if) operator(()ident(exception)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(rubyClass)operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + type(StringBuilder) ident(sb) operator(=) keyword(new) type(StringBuilder)operator(()string<delimiter(")content(#<)delimiter(")>operator(\))operator(;) + ident(sb)operator(.)ident(append)operator(()ident(rubyClass)operator(.)ident(getName)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(: )delimiter(")>operator(\))operator(.)ident(append)operator(()ident(exception)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(sb)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(printBacktrace)operator(()type(PrintStream) ident(errorStream)operator(\)) operator({) + ident(IRubyObject) ident(backtrace) operator(=) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(backtrace)delimiter(")>operator(\))operator(;) + type(boolean) ident(debug) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(backtrace)operator(.)ident(isNil)operator(()operator(\)) operator(&&) ident(backtrace) keyword(instanceof) ident(RubyArray)operator(\)) operator({) + ident(IRubyObject)type([]) ident(elements) operator(=) ident(backtrace)operator(.)ident(convertToArray)operator(()operator(\))operator(.)ident(toJavaArray)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(elements)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(stackTraceLine) operator(=) ident(elements)operator([)ident(i)operator(])operator(;) + keyword(if) operator(()ident(stackTraceLine) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(printStackTraceLine)operator(()ident(errorStream)operator(,) ident(stackTraceLine)operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(debug) operator(&&) ident(i) operator(==) ident(RubyException)operator(.)ident(TRACE_HEAD) operator(&&) ident(elements)operator(.)ident(length) operator(>) ident(RubyException)operator(.)ident(TRACE_MAX)operator(\)) operator({) + type(int) ident(hiddenLevels) operator(=) ident(elements)operator(.)ident(length) operator(-) ident(RubyException)operator(.)ident(TRACE_HEAD) operator(-) ident(RubyException)operator(.)ident(TRACE_TAIL)operator(;) + ident(errorStream)operator(.)ident(print)operator(()string<delimiter(")char(\\t)content( ... )delimiter(")> operator(+) ident(hiddenLevels) operator(+) string<delimiter(")content( levels...)char(\\n)delimiter(")>operator(\))operator(;) + ident(i) operator(=) ident(elements)operator(.)ident(length) operator(-) ident(RubyException)operator(.)ident(TRACE_TAIL)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + + directive(private) type(void) ident(printStackTraceLine)operator(()type(PrintStream) ident(errorStream)operator(,) ident(IRubyObject) ident(stackTraceLine)operator(\)) operator({) + ident(errorStream)operator(.)ident(print)operator(()string<delimiter(")char(\\t)content(from )delimiter(")> operator(+) ident(stackTraceLine) operator(+) string<delimiter(')content(\\n)delimiter(')>operator(\))operator(;) + operator(}) + + directive(private) type(boolean) ident(isArrayOfStrings)operator(()ident(IRubyObject) ident(backtrace)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(backtrace) keyword(instanceof) ident(RubyArray)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + + ident(IRubyObject)type([]) ident(elements) operator(=) operator(()operator(()ident(RubyArray)operator(\)) ident(backtrace)operator(\))operator(.)ident(toJavaArray)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0) operator(;) ident(i) operator(<) ident(elements)operator(.)ident(length) operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(elements)operator([)ident(i)operator(]) keyword(instanceof) ident(RubyString)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + operator(}) + + keyword(return) keyword(true)operator(;) + operator(}) +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2003 Joey Gibson <joey@joeygibson.com> + * Copyright (C\) 2004-2007 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2007 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.util.io.OpenFile)operator(;) +keyword(import) include(org.jruby.util.io.ChannelDescriptor)operator(;) +keyword(import) include(java.io.File)operator(;) +keyword(import) include(java.io.FileDescriptor)operator(;) +keyword(import) include(java.io.FileNotFoundException)operator(;) +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.InputStream)operator(;) +keyword(import) include(java.io.Reader)operator(;) +keyword(import) include(java.nio.channels.Channels)operator(;) +keyword(import) include(java.nio.channels.FileChannel)operator(;) +keyword(import) include(java.nio.channels.FileLock)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.ext.posix.util.Platform)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.io.DirectoryAsFileException)operator(;) +keyword(import) include(org.jruby.util.io.Stream)operator(;) +keyword(import) include(org.jruby.util.io.ChannelStream)operator(;) +keyword(import) include(org.jruby.util.io.ModeFlags)operator(;) +keyword(import) include(org.jruby.util.JRubyFile)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) +keyword(import) include(org.jruby.util.io.BadDescriptorException)operator(;) +keyword(import) include(org.jruby.util.io.FileExistsException)operator(;) +keyword(import) include(org.jruby.util.io.InvalidValueException)operator(;) +keyword(import) include(org.jruby.util.io.PipeException)operator(;) + +comment(/** + * Ruby File class equivalent in java. + **/) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(File)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(IO)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(FileTest)delimiter(")>operator(\)) +directive(public) type(class) class(RubyFile) directive(extends) ident(RubyIO) operator({) + directive(private) directive(static) directive(final) type(long) ident(serialVersionUID) operator(=) integer(1L)operator(;) + + directive(public) directive(static) directive(final) type(int) ident(LOCK_SH) operator(=) integer(1)operator(;) + directive(public) directive(static) directive(final) type(int) ident(LOCK_EX) operator(=) integer(2)operator(;) + directive(public) directive(static) directive(final) type(int) ident(LOCK_NB) operator(=) integer(4)operator(;) + directive(public) directive(static) directive(final) type(int) ident(LOCK_UN) operator(=) integer(8)operator(;) + + directive(private) directive(static) directive(final) type(int) ident(FNM_NOESCAPE) operator(=) integer(1)operator(;) + directive(private) directive(static) directive(final) type(int) ident(FNM_PATHNAME) operator(=) integer(2)operator(;) + directive(private) directive(static) directive(final) type(int) ident(FNM_DOTMATCH) operator(=) integer(4)operator(;) + directive(private) directive(static) directive(final) type(int) ident(FNM_CASEFOLD) operator(=) integer(8)operator(;) + directive(private) directive(static) directive(final) type(int) ident(FNM_SYSCASE)operator(;) + + directive(static) operator({) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS)operator(\)) operator({) + ident(FNM_SYSCASE) operator(=) ident(FNM_CASEFOLD)operator(;) + operator(}) keyword(else) operator({) + ident(FNM_SYSCASE) operator(=) integer(0)operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(boolean) ident(startsWithDriveLetterOnWindows)operator(()type(String) ident(path)operator(\)) operator({) + keyword(return) operator(()ident(path) operator(!=) keyword(null)operator(\)) + operator(&&) ident(Platform)operator(.)ident(IS_WINDOWS) operator(&&) + operator(()operator(()ident(path)operator(.)ident(length)operator(()operator(\))operator(>)integer(1) operator(&&) ident(path)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(/)delimiter(')>operator(\)) operator(?) + operator(()ident(path)operator(.)ident(length)operator(()operator(\)) operator(>) integer(2) + operator(&&) ident(isWindowsDriveLetter)operator(()ident(path)operator(.)ident(charAt)operator(()integer(1)operator(\))operator(\)) + operator(&&) ident(path)operator(.)ident(charAt)operator(()integer(2)operator(\)) operator(==) string<delimiter(')content(:)delimiter(')>operator(\)) operator(:) + operator(()ident(path)operator(.)ident(length)operator(()operator(\)) operator(>) integer(1) + operator(&&) ident(isWindowsDriveLetter)operator(()ident(path)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(\)) + operator(&&) ident(path)operator(.)ident(charAt)operator(()integer(1)operator(\)) operator(==) string<delimiter(')content(:)delimiter(')>operator(\))operator(\))operator(;) + operator(}) + comment(// adjusts paths started with '/' or '\\\\', on windows.) + directive(static) type(String) ident(adjustRootPathOnWindows)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(path)operator(,) type(String) ident(dir)operator(\)) operator({) + keyword(if) operator(()ident(path) operator(==) keyword(null)operator(\)) keyword(return) ident(path)operator(;) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS)operator(\)) operator({) + comment(// MRI behavior on Windows: it treats '/' as a root of) + comment(// a current drive (but only if SINGLE slash is present!\):) + comment(// E.g., if current work directory is) + comment(// 'D:/home/directory', then '/' means 'D:/'.) + comment(//) + comment(// Basically, '/path' is treated as a *RELATIVE* path,) + comment(// relative to the current drive. '//path' is treated) + comment(// as absolute one.) + keyword(if) operator(()operator(()ident(path)operator(.)ident(startsWith)operator(()string<delimiter(")content(/)delimiter(")>operator(\)) operator(&&) operator(!)operator(()ident(path)operator(.)ident(length)operator(()operator(\))operator(>)integer(2) operator(&&) ident(path)operator(.)ident(charAt)operator(()integer(2)operator(\)) operator(==) string<delimiter(')content(:)delimiter(')>operator(\))operator(\)) operator(||) ident(path)operator(.)ident(startsWith)operator(()string<delimiter(")char(\\\\)delimiter(")>operator(\))operator(\)) operator({) + keyword(if) operator(()ident(path)operator(.)ident(length)operator(()operator(\)) operator(>) integer(1) operator(&&) operator(()ident(path)operator(.)ident(charAt)operator(()integer(1)operator(\)) operator(==) string<delimiter(')content(/)delimiter(')> operator(||) ident(path)operator(.)ident(charAt)operator(()integer(1)operator(\)) operator(==) string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(\)) operator({) + keyword(return) ident(path)operator(;) + operator(}) + + comment(// First try to use drive letter from supplied dir value,) + comment(// then try current work dir.) + keyword(if) operator(()operator(!)ident(startsWithDriveLetterOnWindows)operator(()ident(dir)operator(\))operator(\)) operator({) + ident(dir) operator(=) ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(dir)operator(.)ident(length)operator(()operator(\)) operator(>=) integer(2)operator(\)) operator({) + ident(path) operator(=) ident(dir)operator(.)ident(substring)operator(()integer(0)operator(,) integer(2)operator(\)) operator(+) ident(path)operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(startsWithDriveLetterOnWindows)operator(()ident(path)operator(\)) operator(&&) ident(path)operator(.)ident(length)operator(()operator(\)) operator(==) integer(2)operator(\)) operator({) + comment(// compensate for missing slash after drive letter on windows) + ident(path) operator(+=) string<delimiter(")content(/)delimiter(")>operator(;) + operator(}) + operator(}) + keyword(return) ident(path)operator(;) + operator(}) + + directive(protected) type(String) ident(path)operator(;) + directive(private) type(FileLock) ident(currentLock)operator(;) + + directive(public) ident(RubyFile)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + comment(// XXX This constructor is a hack to implement the __END__ syntax.) + comment(// Converting a reader back into an InputStream doesn't generally work.) + directive(public) ident(RubyFile)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(path)operator(,) directive(final) type(Reader) ident(reader)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) ident(path)operator(,) keyword(new) type(InputStream)operator(()operator(\)) operator({) + directive(public) type(int) ident(read)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(return) ident(reader)operator(.)ident(read)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFile)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(path)operator(,) type(InputStream) ident(in)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getFile)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(path) operator(=) ident(path)operator(;) + keyword(try) operator({) + local_variable(this)operator(.)ident(openFile)operator(.)ident(setMainStream)operator(()keyword(new) ident(ChannelStream)operator(()ident(runtime)operator(,) keyword(new) ident(ChannelDescriptor)operator(()type(Channels)operator(.)ident(newChannel)operator(()ident(in)operator(\))operator(,) ident(getNewFileno)operator(()operator(\))operator(,) keyword(new) type(FileDescriptor)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + local_variable(this)operator(.)ident(openFile)operator(.)ident(setMode)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getModes)operator(()operator(\))operator(.)ident(getOpenFileFlags)operator(()operator(\))operator(\))operator(;) + ident(registerDescriptor)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(FILE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(RubyFile) ident(instance) operator(=) keyword(new) ident(RubyFile)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + + ident(instance)operator(.)ident(setMetaClass)operator(()ident(klass)operator(\))operator(;) + + keyword(return) ident(instance)operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(File::Constants)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Constants) operator({)operator(}) + + directive(public) directive(static) ident(RubyClass) ident(createFileClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(fileClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(File)delimiter(")>operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(,) ident(FILE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setFile)operator(()ident(fileClass)operator(\))operator(;) + ident(RubyString) ident(separator) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(/)delimiter(")>operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + + ident(fileClass)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyFile)operator(;) + operator(}) + operator(})operator(;) + + ident(separator)operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(fileClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(SEPARATOR)delimiter(")>operator(,) ident(separator)operator(\))operator(;) + ident(fileClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(Separator)delimiter(")>operator(,) ident(separator)operator(\))operator(;) + + keyword(if) operator(()type(File)operator(.)ident(separatorChar) operator(==) string<delimiter(')char(\\\\)delimiter(')>operator(\)) operator({) + ident(RubyString) ident(altSeparator) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")char(\\\\)delimiter(")>operator(\))operator(;) + ident(altSeparator)operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(fileClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(ALT_SEPARATOR)delimiter(")>operator(,) ident(altSeparator)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(fileClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(ALT_SEPARATOR)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(RubyString) ident(pathSeparator) operator(=) ident(runtime)operator(.)ident(newString)operator(()type(File)operator(.)ident(pathSeparator)operator(\))operator(;) + ident(pathSeparator)operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(fileClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(PATH_SEPARATOR)delimiter(")>operator(,) ident(pathSeparator)operator(\))operator(;) + + comment(// TODO: why are we duplicating the constants here, and then in) + comment(// File::Constants below? File::Constants is included in IO.) + + comment(// TODO: These were missing, so we're not handling them elsewhere?) + comment(// FIXME: The old value, 32786, didn't match what IOModes expected, so I reference) + comment(// the constant here. THIS MAY NOT BE THE CORRECT VALUE.) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(BINARY)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(BINARY)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_NOESCAPE)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_NOESCAPE)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_CASEFOLD)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_CASEFOLD)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_SYSCASE)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_SYSCASE)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_DOTMATCH)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_DOTMATCH)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_PATHNAME)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_PATHNAME)operator(\))operator(\))operator(;) + + comment(// Create constants for open flags) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(RDONLY)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(RDONLY)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(WRONLY)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(WRONLY)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(RDWR)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(RDWR)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(CREAT)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(CREAT)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(EXCL)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(EXCL)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(NOCTTY)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(NOCTTY)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(TRUNC)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(TRUNC)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(APPEND)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(APPEND)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(NONBLOCK)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(NONBLOCK)operator(\))operator(\))operator(;) + + comment(// Create constants for flock) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(LOCK_SH)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RubyFile)operator(.)ident(LOCK_SH)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(LOCK_EX)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RubyFile)operator(.)ident(LOCK_EX)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(LOCK_NB)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RubyFile)operator(.)ident(LOCK_NB)operator(\))operator(\))operator(;) + ident(fileClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(LOCK_UN)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RubyFile)operator(.)ident(LOCK_UN)operator(\))operator(\))operator(;) + + comment(// Create Constants class) + ident(RubyModule) ident(constants) operator(=) ident(fileClass)operator(.)ident(defineModuleUnder)operator(()string<delimiter(")content(Constants)delimiter(")>operator(\))operator(;) + + comment(// TODO: These were missing, so we're not handling them elsewhere?) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(BINARY)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(BINARY)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(SYNC)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()hex(0x1000)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_NOESCAPE)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_NOESCAPE)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_CASEFOLD)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_CASEFOLD)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_SYSCASE)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_SYSCASE)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_DOTMATCH)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_DOTMATCH)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(FNM_PATHNAME)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(FNM_PATHNAME)operator(\))operator(\))operator(;) + + comment(// Create constants for open flags) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(RDONLY)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(RDONLY)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(WRONLY)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(WRONLY)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(RDWR)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(RDWR)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(CREAT)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(CREAT)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(EXCL)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(EXCL)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(NOCTTY)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(NOCTTY)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(TRUNC)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(TRUNC)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(APPEND)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(APPEND)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(NONBLOCK)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(ModeFlags)operator(.)ident(NONBLOCK)operator(\))operator(\))operator(;) + + comment(// Create constants for flock) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(LOCK_SH)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RubyFile)operator(.)ident(LOCK_SH)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(LOCK_EX)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RubyFile)operator(.)ident(LOCK_EX)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(LOCK_NB)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RubyFile)operator(.)ident(LOCK_NB)operator(\))operator(\))operator(;) + ident(constants)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(LOCK_UN)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RubyFile)operator(.)ident(LOCK_UN)operator(\))operator(\))operator(;) + + comment(// File::Constants module is included in IO.) + ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(.)ident(includeModule)operator(()ident(constants)operator(\))operator(;) + + ident(runtime)operator(.)ident(getFileTest)operator(()operator(\))operator(.)ident(extend_object)operator(()ident(fileClass)operator(\))operator(;) + + ident(fileClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyFile)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(fileClass)operator(;) + operator(}) + + annotation(@JRubyMethod) + annotation(@Override) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) operator({) + comment(// Make sure any existing lock is released before we try and close the file) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + keyword(try) operator({) + ident(currentLock)operator(.)ident(release)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) local_variable(super)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(flock)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(lockingConstant)operator(\)) operator({) + comment(// TODO: port exact behavior from MRI, and move most locking logic into ChannelDescriptor) + comment(// TODO: for all LOCK_NB cases, return false if they would block) + ident(ChannelDescriptor) ident(descriptor) operator(=) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(;) + + comment(// null channel always succeeds for all locking operations) + keyword(if) operator(()ident(descriptor)operator(.)ident(isNull)operator(()operator(\))operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + type(FileChannel) ident(fileChannel) operator(=) operator(()type(FileChannel)operator(\))ident(descriptor)operator(.)ident(getChannel)operator(()operator(\))operator(;) + type(int) ident(lockMode) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(lockingConstant)operator(\))operator(;) + + comment(// Exclusive locks in Java require the channel to be writable, otherwise) + comment(// an exception is thrown (terminating JRuby execution\).) + comment(// But flock behavior of MRI is that it allows) + comment(// exclusive locks even on non-writable file. So we convert exclusive) + comment(// lock to shared lock if the channel is not writable, to better match) + comment(// the MRI behavior.) + keyword(if) operator(()operator(!)ident(openFile)operator(.)ident(isWritable)operator(()operator(\)) operator(&&) operator(()ident(lockMode) operator(&) ident(LOCK_EX)operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(lockMode) operator(=) operator(()ident(lockMode) operator(^) ident(LOCK_EX)operator(\)) operator(|) ident(LOCK_SH)operator(;) + operator(}) + + keyword(try) operator({) + keyword(switch) operator(()ident(lockMode)operator(\)) operator({) + keyword(case) ident(LOCK_UN)operator(:) + keyword(case) ident(LOCK_UN) operator(|) ident(LOCK_NB)operator(:) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + ident(currentLock)operator(.)ident(release)operator(()operator(\))operator(;) + ident(currentLock) operator(=) keyword(null)operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(break)operator(;) + keyword(case) ident(LOCK_EX)operator(:) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + ident(currentLock)operator(.)ident(release)operator(()operator(\))operator(;) + ident(currentLock) operator(=) keyword(null)operator(;) + operator(}) + ident(currentLock) operator(=) ident(fileChannel)operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(break)operator(;) + keyword(case) ident(LOCK_EX) operator(|) ident(LOCK_NB)operator(:) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + ident(currentLock)operator(.)ident(release)operator(()operator(\))operator(;) + ident(currentLock) operator(=) keyword(null)operator(;) + operator(}) + ident(currentLock) operator(=) ident(fileChannel)operator(.)ident(tryLock)operator(()operator(\))operator(;) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(break)operator(;) + keyword(case) ident(LOCK_SH)operator(:) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + ident(currentLock)operator(.)ident(release)operator(()operator(\))operator(;) + ident(currentLock) operator(=) keyword(null)operator(;) + operator(}) + + ident(currentLock) operator(=) ident(fileChannel)operator(.)ident(lock)operator(()integer(0L)operator(,) type(Long)operator(.)ident(MAX_VALUE)operator(,) keyword(true)operator(\))operator(;) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(break)operator(;) + keyword(case) ident(LOCK_SH) operator(|) ident(LOCK_NB)operator(:) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + ident(currentLock)operator(.)ident(release)operator(()operator(\))operator(;) + ident(currentLock) operator(=) keyword(null)operator(;) + operator(}) + + ident(currentLock) operator(=) ident(fileChannel)operator(.)ident(tryLock)operator(()integer(0L)operator(,) type(Long)operator(.)ident(MAX_VALUE)operator(,) keyword(true)operator(\))operator(;) + keyword(if) operator(()ident(currentLock) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(break)operator(;) + keyword(default)operator(:) + operator(}) + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(ioe)operator(.)ident(printStackTrace)operator(()type(System)operator(.)ident(err)operator(\))operator(;) + operator(}) + comment(// Return false here) + operator(}) keyword(catch) operator(()ident(java)operator(.)ident(nio)operator(.)ident(channels)operator(.)ident(OverlappingFileLockException) ident(ioe)operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(ioe)operator(.)ident(printStackTrace)operator(()type(System)operator(.)ident(err)operator(\))operator(;) + operator(}) + comment(// Return false here) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(openFile) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRuntimeError)operator(()string<delimiter(")content(reinitializing File)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0) operator(&&) ident(args)operator(.)ident(length) operator(<) integer(3)operator(\)) operator({) + ident(IRubyObject) ident(fd) operator(=) ident(TypeConverter)operator(.)ident(convertToTypeWithCheck)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getFixnum)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_INT)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(!)ident(fd)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(args)operator([)integer(0)operator(]) operator(=) ident(fd)operator(;) + keyword(return) local_variable(super)operator(.)ident(initialize)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(openFile)operator(()ident(args)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(openFile)operator(()ident(IRubyObject) ident(args)type([])operator(\)) operator({) + ident(IRubyObject) ident(filename) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(checkSafeString)operator(()ident(filename)operator(\))operator(;) + + ident(path) operator(=) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getUnicodeValue)operator(()operator(\))operator(;) + + type(String) ident(modeString)operator(;) + ident(ModeFlags) ident(modes)operator(;) + type(int) ident(perm)operator(;) + + keyword(try) operator({) + keyword(if) operator(()operator(()ident(args)operator(.)ident(length) operator(>) integer(1) operator(&&) ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator(||) operator(()ident(args)operator(.)ident(length) operator(>) integer(2) operator(&&) operator(!)ident(args)operator([)integer(2)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modeString) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(modes) operator(=) ident(getIOModes)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(modeString)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(2) operator(&&) operator(!)ident(args)operator([)integer(2)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(perm) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)integer(2)operator(])operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(perm) operator(=) integer(438)operator(;) comment(// 0666) + operator(}) + + ident(sysopenInternal)operator(()ident(path)operator(,) ident(modes)operator(,) ident(perm)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modeString) operator(=) string<delimiter(")content(r)delimiter(")>operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(modeString) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + operator(}) + ident(openInternal)operator(()ident(path)operator(,) ident(modeString)operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(finally) operator({)operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(private) type(void) ident(sysopenInternal)operator(()type(String) ident(path)operator(,) ident(ModeFlags) ident(modes)operator(,) type(int) ident(perm)operator(\)) directive(throws) ident(InvalidValueException) operator({) + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + + ident(openFile)operator(.)ident(setPath)operator(()ident(path)operator(\))operator(;) + ident(openFile)operator(.)ident(setMode)operator(()ident(modes)operator(.)ident(getOpenFileFlags)operator(()operator(\))operator(\))operator(;) + + ident(ChannelDescriptor) ident(descriptor) operator(=) ident(sysopen)operator(()ident(path)operator(,) ident(modes)operator(,) ident(perm)operator(\))operator(;) + ident(openFile)operator(.)ident(setMainStream)operator(()ident(fdopen)operator(()ident(descriptor)operator(,) ident(modes)operator(\))operator(\))operator(;) + + ident(registerDescriptor)operator(()ident(descriptor)operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(openInternal)operator(()type(String) ident(path)operator(,) type(String) ident(modeString)operator(\)) directive(throws) ident(InvalidValueException) operator({) + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + + ident(openFile)operator(.)ident(setMode)operator(()ident(getIOModes)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(modeString)operator(\))operator(.)ident(getOpenFileFlags)operator(()operator(\))operator(\))operator(;) + ident(openFile)operator(.)ident(setPath)operator(()ident(path)operator(\))operator(;) + ident(openFile)operator(.)ident(setMainStream)operator(()ident(fopen)operator(()ident(path)operator(,) ident(modeString)operator(\))operator(\))operator(;) + + ident(registerDescriptor)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(ChannelDescriptor) ident(sysopen)operator(()type(String) ident(path)operator(,) ident(ModeFlags) ident(modes)operator(,) type(int) ident(perm)operator(\)) directive(throws) ident(InvalidValueException) operator({) + keyword(try) operator({) + ident(ChannelDescriptor) ident(descriptor) operator(=) ident(ChannelDescriptor)operator(.)ident(open)operator(() + ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) + ident(path)operator(,) + ident(modes)operator(,) + ident(perm)operator(,) + ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(\))operator(;) + + comment(// TODO: check if too many open files, GC and try again) + + keyword(return) ident(descriptor)operator(;) + operator(}) keyword(catch) operator(()type(FileNotFoundException) ident(fnfe)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(DirectoryAsFileException) ident(dafe)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEISDirError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(FileExistsException) ident(fee)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEEXISTError)operator(()string<delimiter(")content(file exists: )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(ioe)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(Stream) ident(fopen)operator(()type(String) ident(path)operator(,) type(String) ident(modeString)operator(\)) operator({) + keyword(try) operator({) + ident(Stream) ident(stream) operator(=) ident(ChannelStream)operator(.)ident(fopen)operator(() + ident(getRuntime)operator(()operator(\))operator(,) + ident(path)operator(,) + ident(getIOModes)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(modeString)operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(stream) operator(==) keyword(null)operator(\)) operator({) + comment(// TODO) + comment(// if (errno == EMFILE || errno == ENFILE\) {) + comment(// rb_gc(\);) + comment(// file = fopen(fname, mode\);) + comment(// }) + comment(// if (!file\) {) + comment(// rb_sys_fail(fname\);) + comment(// }) + operator(}) + + comment(// Do we need to be in SETVBUF mode for buffering to make sense? This comes up elsewhere.) + comment(// #ifdef USE_SETVBUF) + comment(// if (setvbuf(file, NULL, _IOFBF, 0\) != 0\)) + comment(// rb_warn("setvbuf(\) can't be honoured for %s", fname\);) + comment(// #endif) + comment(// #ifdef __human68k__) + comment(// fmode(file, _IOTEXT\);) + comment(// #endif) + keyword(return) ident(stream)operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(FileNotFoundException) ident(ex)operator(\)) operator({) + comment(// FNFException can be thrown in both cases, when the file) + comment(// is not found, or when permission is denied.) + keyword(if) operator(()ident(Ruby)operator(.)ident(isSecurityRestricted)operator(()operator(\)) operator(||) keyword(new) type(File)operator(()ident(path)operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEACCESError)operator(() + string<delimiter(")content(Permission denied - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(() + string<delimiter(")content(File not found - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(DirectoryAsFileException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEISDirError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(FileExistsException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEEXISTError)operator(()ident(path)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(chmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + type(int) ident(mode) operator(=) operator(()type(int)operator(\)) ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)keyword(new) type(File)operator(()ident(path)operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(chmod)operator(()ident(path)operator(,) ident(mode)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(chown)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + type(int) ident(owner) operator(=) operator(-)integer(1)operator(;) + keyword(if) operator(()operator(!)ident(arg1)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(owner) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg1)operator(\))operator(;) + operator(}) + + type(int) ident(group) operator(=) operator(-)integer(1)operator(;) + keyword(if) operator(()operator(!)ident(arg2)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(group) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg2)operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)keyword(new) type(File)operator(()ident(path)operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(chown)operator(()ident(path)operator(,) ident(owner)operator(,) ident(group)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(atime)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(path)operator(,) keyword(false)operator(\))operator(.)ident(atime)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(ctime)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(path)operator(,) keyword(false)operator(\))operator(.)ident(ctime)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(lchmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + type(int) ident(mode) operator(=) operator(()type(int)operator(\)) ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)keyword(new) type(File)operator(()ident(path)operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(lchmod)operator(()ident(path)operator(,) ident(mode)operator(\))operator(\))operator(;) + operator(}) + + comment(// TODO: this method is not present in MRI!) + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(lchown)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + type(int) ident(owner) operator(=) operator(-)integer(1)operator(;) + keyword(if) operator(()operator(!)ident(arg1)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(owner) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg1)operator(\))operator(;) + operator(}) + + type(int) ident(group) operator(=) operator(-)integer(1)operator(;) + keyword(if) operator(()operator(!)ident(arg2)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(group) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg2)operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)keyword(new) type(File)operator(()ident(path)operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(lchown)operator(()ident(path)operator(,) ident(owner)operator(,) ident(group)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(lstat)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(path)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(mtime)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(getLastModified)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(path)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(RubyString) ident(path)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(path)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + annotation(@Override) + directive(public) ident(IRubyObject) ident(stat)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(openFile)operator(.)ident(checkClosed)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(path)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(truncate)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(RubyInteger) ident(newLength) operator(=) ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + keyword(if) operator(()ident(newLength)operator(.)ident(getLongValue)operator(()operator(\)) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()string<delimiter(")content(invalid argument: )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + keyword(try) operator({) + ident(openFile)operator(.)ident(checkWritable)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(ftruncate)operator(()ident(newLength)operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoESPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + comment(// Should we do anything?) + operator(}) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(String) ident(toString)operator(()operator(\)) operator({) + keyword(return) string<delimiter(")content(RubyFile()delimiter(")> operator(+) ident(path) operator(+) string<delimiter(")content(, )delimiter(")> operator(+) ident(openFile)operator(.)ident(getMode)operator(()operator(\)) operator(+) string<delimiter(")content(, )delimiter(")> operator(+) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileno)operator(()operator(\)) operator(+) string<delimiter(")content(\))delimiter(")>operator(;) + operator(}) + + comment(// TODO: This is also defined in the MetaClass too...Consolidate somewhere.) + directive(private) directive(static) ident(ModeFlags) ident(getModes)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(object)operator(\)) directive(throws) ident(InvalidValueException) operator({) + keyword(if) operator(()ident(object) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(getIOModes)operator(()ident(runtime)operator(,) operator(()operator(()ident(RubyString)operator(\)) ident(object)operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(object) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) keyword(new) ident(ModeFlags)operator(()operator(()operator(()ident(RubyFixnum)operator(\)) ident(object)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(Invalid type for modes)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + annotation(@Override) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + type(StringBuilder) ident(val) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + ident(val)operator(.)ident(append)operator(()string<delimiter(")content(#<File:)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(path)operator(\))operator(;) + keyword(if)operator(()operator(!)ident(openFile)operator(.)ident(isOpen)operator(()operator(\))operator(\)) operator({) + ident(val)operator(.)ident(append)operator(()string<delimiter(")content( (closed\))delimiter(")>operator(\))operator(;) + operator(}) + ident(val)operator(.)ident(append)operator(()string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(val)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/* File class methods */) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(basename)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(String) ident(name) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + + comment(// MRI-compatible basename handling for windows drive letter paths) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS)operator(\)) operator({) + keyword(if) operator(()ident(name)operator(.)ident(length)operator(()operator(\)) operator(>) integer(1) operator(&&) ident(name)operator(.)ident(charAt)operator(()integer(1)operator(\)) operator(==) string<delimiter(')content(:)delimiter(')> operator(&&) type(Character)operator(.)ident(isLetter)operator(()ident(name)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(\))operator(\)) operator({) + keyword(switch) operator(()ident(name)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + keyword(case) integer(2)operator(:) + keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(infectBy)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(3)operator(:) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(name)operator(.)ident(substring)operator(()integer(2)operator(\))operator(\))operator(.)ident(infectBy)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) + keyword(switch) operator(()ident(name)operator(.)ident(charAt)operator(()integer(2)operator(\))operator(\)) operator({) + keyword(case) string<delimiter(')content(/)delimiter(')>operator(:) + keyword(case) string<delimiter(')char(\\\\)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(default)operator(:) + comment(// strip c: away from relative-pathed name) + ident(name) operator(=) ident(name)operator(.)ident(substring)operator(()integer(2)operator(\))operator(;) + keyword(break)operator(;) + operator(}) + keyword(break)operator(;) + operator(}) + operator(}) + operator(}) + + keyword(while) operator(()ident(name)operator(.)ident(length)operator(()operator(\)) operator(>) integer(1) operator(&&) ident(name)operator(.)ident(charAt)operator(()ident(name)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\)) operator(==) string<delimiter(')content(/)delimiter(')>operator(\)) operator({) + ident(name) operator(=) ident(name)operator(.)ident(substring)operator(()integer(0)operator(,) ident(name)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\))operator(;) + operator(}) + + comment(// Paths which end in "/" or "\\\\" must be stripped off.) + type(int) ident(slashCount) operator(=) integer(0)operator(;) + type(int) ident(length) operator(=) ident(name)operator(.)ident(length)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(length) operator(-) integer(1)operator(;) ident(i) operator(>=) integer(0)operator(;) ident(i)operator(--)operator(\)) operator({) + type(char) ident(c) operator(=) ident(name)operator(.)ident(charAt)operator(()ident(i)operator(\))operator(;) + keyword(if) operator(()ident(c) operator(!=) string<delimiter(')content(/)delimiter(')> operator(&&) ident(c) operator(!=) string<delimiter(')char(\\\\)delimiter(')>operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(slashCount)operator(++)operator(;) + operator(}) + keyword(if) operator(()ident(slashCount) operator(>) integer(0) operator(&&) ident(length) operator(>) integer(1)operator(\)) operator({) + ident(name) operator(=) ident(name)operator(.)ident(substring)operator(()integer(0)operator(,) ident(name)operator(.)ident(length)operator(()operator(\)) operator(-) ident(slashCount)operator(\))operator(;) + operator(}) + + type(int) ident(index) operator(=) ident(name)operator(.)ident(lastIndexOf)operator(()string<delimiter(')content(/)delimiter(')>operator(\))operator(;) + keyword(if) operator(()ident(index) operator(==) operator(-)integer(1)operator(\)) operator({) + comment(// XXX actually only on windows...) + ident(index) operator(=) ident(name)operator(.)ident(lastIndexOf)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(name)operator(.)ident(equals)operator(()string<delimiter(")content(/)delimiter(")>operator(\)) operator(&&) ident(index) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(name) operator(=) ident(name)operator(.)ident(substring)operator(()ident(index) operator(+) integer(1)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(2)operator(\)) operator({) + type(String) ident(ext) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if) operator(()string<delimiter(")content(.*)delimiter(")>operator(.)ident(equals)operator(()ident(ext)operator(\))operator(\)) operator({) + ident(index) operator(=) ident(name)operator(.)ident(lastIndexOf)operator(()string<delimiter(')content(.)delimiter(')>operator(\))operator(;) + keyword(if) operator(()ident(index) operator(>) integer(0)operator(\)) operator({) comment(// -1 no match; 0 it is dot file not extension) + ident(name) operator(=) ident(name)operator(.)ident(substring)operator(()integer(0)operator(,) ident(index)operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(name)operator(.)ident(endsWith)operator(()ident(ext)operator(\))operator(\)) operator({) + ident(name) operator(=) ident(name)operator(.)ident(substring)operator(()integer(0)operator(,) ident(name)operator(.)ident(length)operator(()operator(\)) operator(-) ident(ext)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(name)operator(\))operator(.)ident(infectBy)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + type(int) ident(count) operator(=) integer(0)operator(;) + ident(RubyInteger) ident(mode) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(filename) operator(=) ident(args)operator([)ident(i)operator(])operator(;) + + keyword(if) operator(()operator(!)ident(RubyFileTest)operator(.)ident(exist_p)operator(()ident(filename)operator(,) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(filename)operator(\))operator(;) + operator(}) + + type(boolean) ident(result) operator(=) integer(0) operator(==) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(chmod)operator(()ident(filename)operator(.)ident(toString)operator(()operator(\))operator(,) operator(()type(int)operator(\))ident(mode)operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(result)operator(\)) operator({) + ident(count)operator(++)operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(count)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(3)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chown)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + type(int) ident(count) operator(=) integer(0)operator(;) + type(int) ident(owner) operator(=) operator(-)integer(1)operator(;) + keyword(if) operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(owner) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + type(int) ident(group) operator(=) operator(-)integer(1)operator(;) + keyword(if) operator(()operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(group) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) integer(2)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(filename) operator(=) ident(args)operator([)ident(i)operator(])operator(;) + + keyword(if) operator(()operator(!)ident(RubyFileTest)operator(.)ident(exist_p)operator(()ident(filename)operator(,) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(filename)operator(\))operator(;) + operator(}) + + type(boolean) ident(result) operator(=) integer(0) operator(==) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(chown)operator(()ident(filename)operator(.)ident(toString)operator(()operator(\))operator(,) ident(owner)operator(,) ident(group)operator(\))operator(;) + keyword(if) operator(()ident(result)operator(\)) operator({) + ident(count)operator(++)operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(count)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(dirname)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(RubyString) ident(filename) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(arg)operator(\))operator(;) + type(String) ident(jfilename) operator(=) ident(filename)operator(.)ident(toString)operator(()operator(\))operator(;) + type(String) ident(name) operator(=) ident(jfilename)operator(.)ident(replace)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(,) string<delimiter(')content(/)delimiter(')>operator(\))operator(;) + type(int) ident(minPathLength) operator(=) integer(1)operator(;) + type(boolean) ident(trimmedSlashes) operator(=) keyword(false)operator(;) + + type(boolean) ident(startsWithDriveLetterOnWindows) operator(=) ident(startsWithDriveLetterOnWindows)operator(()ident(name)operator(\))operator(;) + + keyword(if) operator(()ident(startsWithDriveLetterOnWindows)operator(\)) operator({) + ident(minPathLength) operator(=) integer(3)operator(;) + operator(}) + + keyword(while) operator(()ident(name)operator(.)ident(length)operator(()operator(\)) operator(>) ident(minPathLength) operator(&&) ident(name)operator(.)ident(charAt)operator(()ident(name)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\)) operator(==) string<delimiter(')content(/)delimiter(')>operator(\)) operator({) + ident(trimmedSlashes) operator(=) keyword(true)operator(;) + ident(name) operator(=) ident(name)operator(.)ident(substring)operator(()integer(0)operator(,) ident(name)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\))operator(;) + operator(}) + + type(String) ident(result)operator(;) + keyword(if) operator(()ident(startsWithDriveLetterOnWindows) operator(&&) ident(name)operator(.)ident(length)operator(()operator(\)) operator(==) integer(2)operator(\)) operator({) + keyword(if) operator(()ident(trimmedSlashes)operator(\)) operator({) + comment(// C:\\ is returned unchanged) + ident(result) operator(=) ident(jfilename)operator(.)ident(substring)operator(()integer(0)operator(,) integer(3)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result) operator(=) ident(jfilename)operator(.)ident(substring)operator(()integer(0)operator(,) integer(2)operator(\)) operator(+) string<delimiter(')content(.)delimiter(')>operator(;) + operator(}) + operator(}) keyword(else) operator({) + comment(//TODO deal with UNC names) + type(int) ident(index) operator(=) ident(name)operator(.)ident(lastIndexOf)operator(()string<delimiter(')content(/)delimiter(')>operator(\))operator(;) + keyword(if) operator(()ident(index) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(if) operator(()ident(startsWithDriveLetterOnWindows)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(jfilename)operator(.)ident(substring)operator(()integer(0)operator(,) integer(2)operator(\)) operator(+) string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(index) operator(==) integer(0)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(/)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(startsWithDriveLetterOnWindows) operator(&&) ident(index) operator(==) integer(2)operator(\)) operator({) + comment(// Include additional path separator) + comment(// (so that dirname of "C:\\file.txt" is "C:\\", not "C:"\)) + ident(index)operator(++)operator(;) + operator(}) + + ident(result) operator(=) ident(jfilename)operator(.)ident(substring)operator(()integer(0)operator(,) ident(index)operator(\))operator(;) + operator(}) + + type(char) ident(endChar)operator(;) + comment(// trim trailing slashes) + keyword(while) operator(()ident(result)operator(.)ident(length)operator(()operator(\)) operator(>) ident(minPathLength)operator(\)) operator({) + ident(endChar) operator(=) ident(result)operator(.)ident(charAt)operator(()ident(result)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\))operator(;) + keyword(if) operator(()ident(endChar) operator(==) string<delimiter(')content(/)delimiter(')> operator(||) ident(endChar) operator(==) string<delimiter(')char(\\\\)delimiter(')>operator(\)) operator({) + ident(result) operator(=) ident(result)operator(.)ident(substring)operator(()integer(0)operator(,) ident(result)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(result)operator(\))operator(.)ident(infectBy)operator(()ident(filename)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(boolean) ident(isWindowsDriveLetter)operator(()type(char) ident(c)operator(\)) operator({) + keyword(return) operator(()ident(c) operator(>=) string<delimiter(')content(a)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(z)delimiter(')>operator(\)) operator(||) operator(()ident(c) operator(>=) string<delimiter(')content(A)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(Z)delimiter(')>operator(\))operator(;) + operator(}) + + + comment(/** + * Returns the extension name of the file. An empty string is returned if + * the filename (not the entire path\) starts or ends with a dot. + * @param recv + * @param arg Path to get extension name of + * @return Extension, including the dot, or an empty string + */) + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(extname)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(IRubyObject) ident(baseFilename) operator(=) ident(basename)operator(()ident(context)operator(,) ident(recv)operator(,) keyword(new) ident(IRubyObject)type([])operator({)ident(arg)operator(})operator(\))operator(;) + type(String) ident(filename) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(baseFilename)operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + type(String) ident(result) operator(=) string<delimiter(")delimiter(")>operator(;) + + type(int) ident(dotIndex) operator(=) ident(filename)operator(.)ident(lastIndexOf)operator(()string<delimiter(")content(.)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(dotIndex) operator(>) integer(0) operator(&&) ident(dotIndex) operator(!=) operator(()ident(filename)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\))operator(\)) operator({) + comment(// Dot is not at beginning and not at end of filename. ) + ident(result) operator(=) ident(filename)operator(.)ident(substring)operator(()ident(dotIndex)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(result)operator(\))operator(;) + operator(}) + + comment(/** + * Converts a pathname to an absolute pathname. Relative paths are + * referenced from the current working directory of the process unless + * a second argument is given, in which case it will be used as the + * starting point. If the second argument is also relative, it will + * first be converted to an absolute pathname. + * @param recv + * @param args + * @return Resulting absolute path as a String + */) + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(expand_path)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + type(String) ident(relativePath) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + + type(boolean) ident(isAbsoluteWithFilePrefix) operator(=) ident(relativePath)operator(.)ident(startsWith)operator(()string<delimiter(")content(file:)delimiter(")>operator(\))operator(;) + + type(String) ident(cwd) operator(=) keyword(null)operator(;) + + comment(// Handle ~user paths ) + ident(relativePath) operator(=) ident(expandUserPath)operator(()ident(context)operator(,) ident(relativePath)operator(\))operator(;) + + comment(// If there's a second argument, it's the path to which the first ) + comment(// argument is relative.) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(2) operator(&&) operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + + type(String) ident(cwdArg) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + + comment(// Handle ~user paths.) + ident(cwd) operator(=) ident(expandUserPath)operator(()ident(context)operator(,) ident(cwdArg)operator(\))operator(;) + + ident(cwd) operator(=) ident(adjustRootPathOnWindows)operator(()ident(runtime)operator(,) ident(cwd)operator(,) keyword(null)operator(\))operator(;) + + type(boolean) ident(startsWithSlashNotOnWindows) operator(=) operator(()ident(cwd) operator(!=) keyword(null)operator(\)) + operator(&&) operator(!)ident(Platform)operator(.)ident(IS_WINDOWS) operator(&&) ident(cwd)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) + operator(&&) ident(cwd)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(/)delimiter(')>operator(;) + + comment(// TODO: better detection when path is absolute or not.) + comment(// If the path isn't absolute, then prepend the current working) + comment(// directory to the path.) + keyword(if) operator(()operator(!)ident(startsWithSlashNotOnWindows) operator(&&) operator(!)ident(startsWithDriveLetterOnWindows)operator(()ident(cwd)operator(\))operator(\)) operator({) + ident(cwd) operator(=) keyword(new) type(File)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(cwd)operator(\))operator(.)ident(getAbsolutePath)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + comment(// If there's no second argument, simply use the working directory ) + comment(// of the runtime.) + ident(cwd) operator(=) ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(;) + operator(}) + + comment(// Something wrong we don't know the cwd...) + comment(// TODO: Is this behavior really desirable? /mov) + keyword(if) operator(()ident(cwd) operator(==) keyword(null)operator(\)) keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + + comment(/* The counting of slashes that follows is simply a way to adhere to + * Ruby's UNC (or something\) compatibility. When Ruby's expand_path is + * called with "//foo//bar" it will return "//foo/bar". JRuby uses + * java.io.File, and hence returns "/foo/bar". In order to retain + * java.io.File in the lower layers and provide full Ruby + * compatibility, the number of extra slashes must be counted and + * prepended to the result. + */) + + comment(// TODO: special handling on windows for some corner cases) +comment(// if (IS_WINDOWS\) {) +comment(// if (relativePath.startsWith("//"\)\) {) +comment(// if (relativePath.length(\) > 2 && relativePath.charAt(2\) != '/'\) {) +comment(// int nextSlash = relativePath.indexOf('/', 3\);) +comment(// if (nextSlash != -1\) {) +comment(// return runtime.newString() +comment(// relativePath.substring(0, nextSlash\)) +comment(// + canonicalize(relativePath.substring(nextSlash\)\)\);) +comment(// } else {) +comment(// return runtime.newString(relativePath\);) +comment(// }) +comment(// }) +comment(// }) +comment(// }) + + comment(// Find out which string to check.) + type(String) ident(padSlashes) operator(=) string<delimiter(")delimiter(")>operator(;) + keyword(if) operator(()operator(!)ident(Platform)operator(.)ident(IS_WINDOWS)operator(\)) operator({) + keyword(if) operator(()ident(relativePath)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(&&) ident(relativePath)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(/)delimiter(')>operator(\)) operator({) + ident(padSlashes) operator(=) ident(countSlashes)operator(()ident(relativePath)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(cwd)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(&&) ident(cwd)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(/)delimiter(')>operator(\)) operator({) + ident(padSlashes) operator(=) ident(countSlashes)operator(()ident(cwd)operator(\))operator(;) + operator(}) + operator(}) + + ident(JRubyFile) ident(path)operator(;) + + keyword(if) operator(()ident(relativePath)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(path) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(relativePath)operator(,) ident(cwd)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(relativePath) operator(=) ident(adjustRootPathOnWindows)operator(()ident(runtime)operator(,) ident(relativePath)operator(,) ident(cwd)operator(\))operator(;) + ident(path) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(cwd)operator(,) ident(relativePath)operator(\))operator(;) + operator(}) + + type(String) ident(tempResult) operator(=) ident(padSlashes) operator(+) ident(canonicalize)operator(()ident(path)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(;) + + keyword(if)operator(()ident(isAbsoluteWithFilePrefix)operator(\)) operator({) + ident(tempResult) operator(=) ident(tempResult)operator(.)ident(substring)operator(()ident(tempResult)operator(.)ident(indexOf)operator(()string<delimiter(")content(file:)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newString)operator(()ident(tempResult)operator(\))operator(;) + operator(}) + + comment(/** + * This method checks a path, and if it starts with ~, then it expands + * the path to the absolute path of the user's home directory. If the + * string does not begin with ~, then the string is simply returned. + * unaltered. + * @param recv + * @param path Path to check + * @return Expanded path + */) + directive(public) directive(static) type(String) ident(expandUserPath)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(path)operator(\)) operator({) + + type(int) ident(pathLength) operator(=) ident(path)operator(.)ident(length)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(pathLength) operator(>=) integer(1) operator(&&) ident(path)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(~)delimiter(')>operator(\)) operator({) + comment(// Enebo : Should ~frogger\\\\foo work (it doesnt in linux ruby\)?) + type(int) ident(userEnd) operator(=) ident(path)operator(.)ident(indexOf)operator(()string<delimiter(')content(/)delimiter(')>operator(\))operator(;) + + keyword(if) operator(()ident(userEnd) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(if) operator(()ident(pathLength) operator(==) integer(1)operator(\)) operator({) + comment(// Single '~' as whole path to expand) + ident(path) operator(=) ident(RubyDir)operator(.)ident(getHomeDirectoryPath)operator(()ident(context)operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + comment(// No directory delimeter. Rest of string is username) + ident(userEnd) operator(=) ident(pathLength)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(userEnd) operator(==) integer(1)operator(\)) operator({) + comment(// '~/...' as path to expand) + ident(path) operator(=) ident(RubyDir)operator(.)ident(getHomeDirectoryPath)operator(()ident(context)operator(\))operator(.)ident(toString)operator(()operator(\)) operator(+) + ident(path)operator(.)ident(substring)operator(()integer(1)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(userEnd) operator(>) integer(1)operator(\))operator({) + comment(// '~user/...' as path to expand) + type(String) ident(user) operator(=) ident(path)operator(.)ident(substring)operator(()integer(1)operator(,) ident(userEnd)operator(\))operator(;) + ident(IRubyObject) ident(dir) operator(=) ident(RubyDir)operator(.)ident(getHomeDirectoryPath)operator(()ident(context)operator(,) ident(user)operator(\))operator(;) + + keyword(if) operator(()ident(dir)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(user )delimiter(")> operator(+) ident(user) operator(+) string<delimiter(")content( does not exist)delimiter(")>operator(\))operator(;) + operator(}) + + ident(path) operator(=) string<delimiter(")delimiter(")> operator(+) ident(dir) operator(+) operator(()ident(pathLength) operator(==) ident(userEnd) operator(?) string<delimiter(")delimiter(")> operator(:) ident(path)operator(.)ident(substring)operator(()ident(userEnd)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(path)operator(;) + operator(}) + + comment(/** + * Returns a string consisting of <code>n-1</code> slashes, where + * <code>n</code> is the number of slashes at the beginning of the input + * string. + * @param stringToCheck + * @return + */) + directive(private) directive(static) type(String) ident(countSlashes)operator(() type(String) ident(stringToCheck) operator(\)) operator({) + + comment(// Count number of extra slashes in the beginning of the string.) + type(int) ident(slashCount) operator(=) integer(0)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(stringToCheck)operator(.)ident(length)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(stringToCheck)operator(.)ident(charAt)operator(()ident(i)operator(\)) operator(==) string<delimiter(')content(/)delimiter(')>operator(\)) operator({) + ident(slashCount)operator(++)operator(;) + operator(}) keyword(else) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + + comment(// If there are N slashes, then we want N-1.) + keyword(if) operator(()ident(slashCount) operator(>) integer(0)operator(\)) operator({) + ident(slashCount)operator(--)operator(;) + operator(}) + + comment(// Prepare a string with the same number of redundant slashes so that ) + comment(// we easily can prepend it to the result.) + type(byte)type([]) ident(slashes) operator(=) keyword(new) type(byte)operator([)ident(slashCount)operator(])operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(slashCount)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(slashes)operator([)ident(i)operator(]) operator(=) string<delimiter(')content(/)delimiter(')>operator(;) + operator(}) + keyword(return) keyword(new) type(String)operator(()ident(slashes)operator(\))operator(;) + + operator(}) + + directive(private) directive(static) type(String) ident(canonicalize)operator(()type(String) ident(path)operator(\)) operator({) + keyword(return) ident(canonicalize)operator(()keyword(null)operator(,) ident(path)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(String) ident(canonicalize)operator(()type(String) ident(canonicalPath)operator(,) type(String) ident(remaining)operator(\)) operator({) + keyword(if) operator(()ident(remaining) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()string<delimiter(")delimiter(")>operator(.)ident(equals)operator(()ident(canonicalPath)operator(\))operator(\)) operator({) + keyword(return) string<delimiter(")content(/)delimiter(")>operator(;) + operator(}) keyword(else) operator({) + comment(// compensate for missing slash after drive letter on windows) + keyword(if) operator(()ident(startsWithDriveLetterOnWindows)operator(()ident(canonicalPath)operator(\)) + operator(&&) ident(canonicalPath)operator(.)ident(length)operator(()operator(\)) operator(==) integer(2)operator(\)) operator({) + ident(canonicalPath) operator(+=) string<delimiter(")content(/)delimiter(")>operator(;) + operator(}) + operator(}) + keyword(return) ident(canonicalPath)operator(;) + operator(}) + + type(String) ident(child)operator(;) + type(int) ident(slash) operator(=) ident(remaining)operator(.)ident(indexOf)operator(()string<delimiter(')content(/)delimiter(')>operator(\))operator(;) + keyword(if) operator(()ident(slash) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(child) operator(=) ident(remaining)operator(;) + ident(remaining) operator(=) keyword(null)operator(;) + operator(}) keyword(else) operator({) + ident(child) operator(=) ident(remaining)operator(.)ident(substring)operator(()integer(0)operator(,) ident(slash)operator(\))operator(;) + ident(remaining) operator(=) ident(remaining)operator(.)ident(substring)operator(()ident(slash) operator(+) integer(1)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(child)operator(.)ident(equals)operator(()string<delimiter(")content(.)delimiter(")>operator(\))operator(\)) operator({) + comment(// skip it) + keyword(if) operator(()ident(canonicalPath) operator(!=) keyword(null) operator(&&) ident(canonicalPath)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0) operator(\)) ident(canonicalPath) operator(+=) string<delimiter(")content(/)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(child)operator(.)ident(equals)operator(()string<delimiter(")content(..)delimiter(")>operator(\))operator(\)) operator({) + keyword(if) operator(()ident(canonicalPath) operator(==) keyword(null)operator(\)) keyword(throw) keyword(new) type(IllegalArgumentException)operator(()string<delimiter(")content(Cannot have .. at the start of an absolute path)delimiter(")>operator(\))operator(;) + type(int) ident(lastDir) operator(=) ident(canonicalPath)operator(.)ident(lastIndexOf)operator(()string<delimiter(')content(/)delimiter(')>operator(\))operator(;) + keyword(if) operator(()ident(lastDir) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(if) operator(()ident(startsWithDriveLetterOnWindows)operator(()ident(canonicalPath)operator(\))operator(\)) operator({) + comment(// do nothing, we should not delete the drive letter) + operator(}) keyword(else) operator({) + ident(canonicalPath) operator(=) string<delimiter(")delimiter(")>operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(canonicalPath) operator(=) ident(canonicalPath)operator(.)ident(substring)operator(()integer(0)operator(,) ident(lastDir)operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(canonicalPath) operator(==) keyword(null)operator(\)) operator({) + ident(canonicalPath) operator(=) ident(child)operator(;) + operator(}) keyword(else) operator({) + ident(canonicalPath) operator(+=) string<delimiter(")content(/)delimiter(")> operator(+) ident(child)operator(;) + operator(}) + + keyword(return) ident(canonicalize)operator(()ident(canonicalPath)operator(,) ident(remaining)operator(\))operator(;) + operator(}) + + comment(/** + * Returns true if path matches against pattern The pattern is not a regular expression; + * instead it follows rules similar to shell filename globbing. It may contain the following + * metacharacters: + * *: Glob - match any sequence chars (re: .*\). If like begins with '.' then it doesn't. + * ?: Matches a single char (re: .\). + * [set]: Matches a single char in a set (re: [...]\). + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(fnmatch)delimiter(")>operator(,) string<delimiter(")content(fnmatch?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(2)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(fnmatch)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(int) ident(flags) operator(=) ident(args)operator(.)ident(length) operator(==) integer(3) operator(?) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)integer(2)operator(])operator(\)) operator(:) integer(0)operator(;) + + ident(ByteList) ident(pattern) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + ident(ByteList) ident(path) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(org)operator(.)ident(jruby)operator(.)ident(util)operator(.)ident(Dir)operator(.)ident(fnmatch)operator(()ident(pattern)operator(.)ident(bytes)operator(,) ident(pattern)operator(.)ident(begin)operator(,) ident(pattern)operator(.)ident(begin)operator(+)ident(pattern)operator(.)ident(realSize)operator(,) + ident(path)operator(.)ident(bytes)operator(,) ident(path)operator(.)ident(begin)operator(,) ident(path)operator(.)ident(begin)operator(+)ident(path)operator(.)ident(realSize)operator(,) ident(flags)operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ftype)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(ftype)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(true)operator(\))operator(.)ident(ftype)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(String) ident(inspectJoin)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(RubyArray) ident(parent)operator(,) ident(RubyArray) ident(array)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + comment(// If already inspecting, there is no need to register/unregister again.) + keyword(if) operator(()ident(runtime)operator(.)ident(isInspecting)operator(()ident(parent)operator(\))operator(\)) keyword(return) ident(join)operator(()ident(context)operator(,) ident(recv)operator(,) ident(array)operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(runtime)operator(.)ident(registerInspecting)operator(()ident(parent)operator(\))operator(;) + keyword(return) ident(join)operator(()ident(context)operator(,) ident(recv)operator(,) ident(array)operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(runtime)operator(.)ident(unregisterInspecting)operator(()ident(parent)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) ident(RubyString) ident(join)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(RubyArray) ident(ary)operator(\)) operator({) + ident(IRubyObject)type([]) ident(args) operator(=) ident(ary)operator(.)ident(toJavaArray)operator(()operator(\))operator(;) + type(boolean) ident(isTainted) operator(=) keyword(false)operator(;) + type(StringBuilder) ident(buffer) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)ident(i)operator(])operator(.)ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(isTainted) operator(=) keyword(true)operator(;) + operator(}) + type(String) ident(element)operator(;) + keyword(if) operator(()ident(args)operator([)ident(i)operator(]) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(element) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)ident(i)operator(]) keyword(instanceof) ident(RubyArray)operator(\)) operator({) + keyword(if) operator(()ident(runtime)operator(.)ident(isInspecting)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(\)) operator({) + ident(element) operator(=) string<delimiter(")content([...])delimiter(")>operator(;) + operator(}) keyword(else) operator({) + ident(element) operator(=) ident(inspectJoin)operator(()ident(context)operator(,) ident(recv)operator(,) ident(ary)operator(,) operator(()operator(()ident(RubyArray)operator(\))ident(args)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(element) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + ident(chomp)operator(()ident(buffer)operator(\))operator(;) + keyword(if) operator(()ident(i) operator(>) integer(0) operator(&&) operator(!)ident(element)operator(.)ident(startsWith)operator(()string<delimiter(")content(/)delimiter(")>operator(\)) operator(&&) operator(!)ident(element)operator(.)ident(startsWith)operator(()string<delimiter(")char(\\\\)delimiter(")>operator(\))operator(\)) operator({) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(")content(/)delimiter(")>operator(\))operator(;) + operator(}) + ident(buffer)operator(.)ident(append)operator(()ident(element)operator(\))operator(;) + operator(}) + + ident(RubyString) ident(fixedStr) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(buffer)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(fixedStr)operator(.)ident(setTaint)operator(()ident(isTainted)operator(\))operator(;) + keyword(return) ident(fixedStr)operator(;) + operator(}) + + comment(/* + * Fixme: This does not have exact same semantics as RubyArray.join, but they + * probably could be consolidated (perhaps as join(args[], sep, doChomp\)\). + */) + annotation(@JRubyMethod)operator(()ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyString) ident(join)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(join)operator(()ident(context)operator(,) ident(recv)operator(,) ident(RubyArray)operator(.)ident(newArrayNoCopyLight)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(chomp)operator(()type(StringBuilder) ident(buffer)operator(\)) operator({) + type(int) ident(lastIndex) operator(=) ident(buffer)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(;) + + keyword(while) operator(()ident(lastIndex) operator(>=) integer(0) operator(&&) operator(()ident(buffer)operator(.)ident(lastIndexOf)operator(()string<delimiter(")content(/)delimiter(")>operator(\)) operator(==) ident(lastIndex) operator(||) ident(buffer)operator(.)ident(lastIndexOf)operator(()string<delimiter(")char(\\\\)delimiter(")>operator(\)) operator(==) ident(lastIndex)operator(\))operator(\)) operator({) + ident(buffer)operator(.)ident(setLength)operator(()ident(lastIndex)operator(\))operator(;) + ident(lastIndex)operator(--)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lstat)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(lstat)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + type(String) ident(f) operator(=) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if)operator(()ident(f)operator(.)ident(startsWith)operator(()string<delimiter(")content(file:)delimiter(")>operator(\)) operator(&&) ident(f)operator(.)ident(indexOf)operator(()string<delimiter(')content(!)delimiter(')>operator(\)) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(f) operator(=) ident(f)operator(.)ident(substring)operator(()integer(5)operator(,) ident(f)operator(.)ident(indexOf)operator(()string<delimiter(")content(!)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(f)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(stat)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(stat)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + type(String) ident(f) operator(=) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if)operator(()ident(f)operator(.)ident(startsWith)operator(()string<delimiter(")content(file:)delimiter(")>operator(\)) operator(&&) ident(f)operator(.)ident(indexOf)operator(()string<delimiter(')content(!)delimiter(')>operator(\)) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(f) operator(=) ident(f)operator(.)ident(substring)operator(()integer(5)operator(,) ident(f)operator(.)ident(indexOf)operator(()string<delimiter(")content(!)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(f)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(atime)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(atime)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + type(String) ident(f) operator(=) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if)operator(()ident(f)operator(.)ident(startsWith)operator(()string<delimiter(")content(file:)delimiter(")>operator(\)) operator(&&) ident(f)operator(.)ident(indexOf)operator(()string<delimiter(')content(!)delimiter(')>operator(\)) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(f) operator(=) ident(f)operator(.)ident(substring)operator(()integer(5)operator(,) ident(f)operator(.)ident(indexOf)operator(()string<delimiter(")content(!)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(f)operator(,) keyword(false)operator(\))operator(.)ident(atime)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ctime)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(ctime)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + type(String) ident(f) operator(=) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if)operator(()ident(f)operator(.)ident(startsWith)operator(()string<delimiter(")content(file:)delimiter(")>operator(\)) operator(&&) ident(f)operator(.)ident(indexOf)operator(()string<delimiter(')content(!)delimiter(')>operator(\)) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(f) operator(=) ident(f)operator(.)ident(substring)operator(()integer(5)operator(,) ident(f)operator(.)ident(indexOf)operator(()string<delimiter(")content(!)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(f)operator(,) keyword(false)operator(\))operator(.)ident(ctime)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(lchmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + type(int) ident(count) operator(=) integer(0)operator(;) + ident(RubyInteger) ident(mode) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(filename) operator(=) ident(args)operator([)ident(i)operator(])operator(;) + + keyword(if) operator(()operator(!)ident(RubyFileTest)operator(.)ident(exist_p)operator(()ident(filename)operator(,) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(filename)operator(\))operator(;) + operator(}) + + type(boolean) ident(result) operator(=) integer(0) operator(==) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(lchmod)operator(()ident(filename)operator(.)ident(toString)operator(()operator(\))operator(,) operator(()type(int)operator(\))ident(mode)operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(result)operator(\)) operator({) + ident(count)operator(++)operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(count)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(3)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(lchown)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(owner) operator(=) operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\)) operator(?) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)integer(0)operator(])operator(\)) operator(:) operator(-)integer(1)operator(;) + type(int) ident(group) operator(=) operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\)) operator(?) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)integer(1)operator(])operator(\)) operator(:) operator(-)integer(1)operator(;) + type(int) ident(count) operator(=) integer(0)operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(2)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(filename) operator(=) ident(args)operator([)ident(i)operator(])operator(;) + + keyword(if) operator(()operator(!)ident(RubyFileTest)operator(.)ident(exist_p)operator(()ident(filename)operator(,) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(filename)operator(\))operator(;) + operator(}) + + type(boolean) ident(result) operator(=) integer(0) operator(==) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(lchown)operator(()ident(filename)operator(.)ident(toString)operator(()operator(\))operator(,) ident(owner)operator(,) ident(group)operator(\))operator(;) + keyword(if) operator(()ident(result)operator(\)) operator({) + ident(count)operator(++)operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(count)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(link)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(from)operator(,) ident(IRubyObject) ident(to)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyString) ident(fromStr) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(from)operator(\))operator(;) + ident(RubyString) ident(toStr) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(to)operator(\))operator(;) + keyword(try) operator({) + keyword(if) operator(()ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(link)operator(() + ident(fromStr)operator(.)ident(toString)operator(()operator(\))operator(,)ident(toStr)operator(.)ident(toString)operator(()operator(\))operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + comment(// FIXME: When we get JNA3 we need to properly write this to errno.) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEEXISTError)operator(()string<delimiter(")content(File exists - )delimiter(")> + operator(+) ident(fromStr) operator(+) string<delimiter(")content( or )delimiter(")> operator(+) ident(toStr)operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(java)operator(.)ident(lang)operator(.)ident(UnsatisfiedLinkError) ident(ule)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(link(\) function is unimplemented on this machine)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(mtime)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(mtime)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + keyword(return) ident(getLastModified)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(rename)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(oldName)operator(,) ident(IRubyObject) ident(newName)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyString) ident(oldNameString) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(oldName)operator(\))operator(;) + ident(RubyString) ident(newNameString) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(newName)operator(\))operator(;) + ident(runtime)operator(.)ident(checkSafeString)operator(()ident(oldNameString)operator(\))operator(;) + ident(runtime)operator(.)ident(checkSafeString)operator(()ident(newNameString)operator(\))operator(;) + ident(JRubyFile) ident(oldFile) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(oldNameString)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(JRubyFile) ident(newFile) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(newNameString)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(oldFile)operator(.)ident(exists)operator(()operator(\)) operator(||) operator(!)ident(newFile)operator(.)ident(getParentFile)operator(()operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(oldNameString) operator(+) + string<delimiter(")content( or )delimiter(")> operator(+) ident(newNameString)operator(\))operator(;) + operator(}) + + ident(JRubyFile) ident(dest) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(newNameString)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(oldFile)operator(.)ident(renameTo)operator(()ident(dest)operator(\))operator(\)) operator({) comment(// rename is successful) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + comment(// rename via Java API call wasn't successful, let's try some tricks, similar to MRI ) + + keyword(if) operator(()ident(newFile)operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(chmod)operator(()ident(newNameString)operator(.)ident(toString)operator(()operator(\))operator(,) oct(0666)operator(\))operator(;) + ident(newFile)operator(.)ident(delete)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(oldFile)operator(.)ident(renameTo)operator(()ident(dest)operator(\))operator(\)) operator({) comment(// try to rename one more time) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + keyword(throw) ident(runtime)operator(.)ident(newErrnoEACCESError)operator(()string<delimiter(")content(Permission denied - )delimiter(")> operator(+) ident(oldNameString) operator(+) string<delimiter(")content( or )delimiter(")> operator(+) + ident(newNameString)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(RubyString) ident(filename) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(arg)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(dirname)operator(()ident(context)operator(,) ident(recv)operator(,) ident(filename)operator(\))operator(,) + ident(basename)operator(()ident(context)operator(,) ident(recv)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(filename) operator(})operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(symlink)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(from)operator(,) ident(IRubyObject) ident(to)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyString) ident(fromStr) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(from)operator(\))operator(;) + ident(RubyString) ident(toStr) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(to)operator(\))operator(;) + keyword(try) operator({) + keyword(if) operator(()ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(symlink)operator(() + ident(fromStr)operator(.)ident(toString)operator(()operator(\))operator(,) ident(toStr)operator(.)ident(toString)operator(()operator(\))operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + comment(// FIXME: When we get JNA3 we need to properly write this to errno.) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEEXISTError)operator(()string<delimiter(")content(File exists - )delimiter(")> + operator(+) ident(fromStr) operator(+) string<delimiter(")content( or )delimiter(")> operator(+) ident(toStr)operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(java)operator(.)ident(lang)operator(.)ident(UnsatisfiedLinkError) ident(ule)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(symlink(\) function is unimplemented on this machine)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(readlink)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(path)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(try) operator({) + type(String) ident(realPath) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(readlink)operator(()ident(path)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(RubyFileTest)operator(.)ident(exist_p)operator(()ident(recv)operator(,) ident(path)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(RubyFileTest)operator(.)ident(symlink_p)operator(()ident(recv)operator(,) ident(path)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()string<delimiter(")content(invalid argument - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(realPath) operator(==) keyword(null)operator(\)) operator({) + comment(//FIXME: When we get JNA3 we need to properly write this to errno.) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newString)operator(()ident(realPath)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(// Can we produce IOError which bypasses a close?) + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(truncate)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyString) ident(filename) operator(=) ident(arg1)operator(.)ident(convertToString)operator(()operator(\))operator(;) comment(// TODO: SafeStringValue here) + ident(RubyInteger) ident(newLength) operator(=) ident(arg2)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)keyword(new) type(File)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(filename)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(() + string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(filename)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(newLength)operator(.)ident(getLongValue)operator(()operator(\)) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()string<delimiter(")content(invalid argument: )delimiter(")> operator(+) ident(filename)operator(\))operator(;) + operator(}) + + ident(IRubyObject)type([]) ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) ident(filename)operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(r+)delimiter(")>operator(\)) operator(})operator(;) + ident(RubyFile) ident(file) operator(=) operator(()ident(RubyFile)operator(\)) ident(open)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + ident(file)operator(.)ident(truncate)operator(()ident(context)operator(,) ident(newLength)operator(\))operator(;) + ident(file)operator(.)ident(close)operator(()operator(\))operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(meta) operator(=) keyword(true)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(umask)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(oldMask) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(oldMask) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(umask)operator(()integer(0)operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(umask)operator(()ident(oldMask)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(oldMask) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(umask)operator(()operator(()type(int)operator(\)) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(oldMask)operator(\))operator(;) + operator(}) + + comment(/** + * This method does NOT set atime, only mtime, since Java doesn't support anything else. + */) + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(2)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(utime)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + comment(// Ignore access_time argument since Java does not support it.) + + type(long) ident(mtime)operator(;) + keyword(if) operator(()ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + ident(mtime) operator(=) operator(()operator(()ident(RubyTime)operator(\)) ident(args)operator([)integer(1)operator(])operator(\))operator(.)ident(getJavaDate)operator(()operator(\))operator(.)ident(getTime)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyNumeric)operator(\)) operator({) + ident(mtime) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(1)operator(]) operator(==) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\)) operator({) + ident(mtime) operator(=) type(System)operator(.)ident(currentTimeMillis)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(RubyTime) ident(time) operator(=) operator(()ident(RubyTime)operator(\)) ident(TypeConverter)operator(.)ident(convertToType)operator(()ident(args)operator([)integer(1)operator(])operator(,) ident(runtime)operator(.)ident(getTime)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(NO_INDEX)operator(,)string<delimiter(")content(to_time)delimiter(")>operator(,) keyword(true)operator(\))operator(;) + ident(mtime) operator(=) ident(time)operator(.)ident(getJavaDate)operator(()operator(\))operator(.)ident(getTime)operator(()operator(\))operator(;) + operator(}) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(2)operator(,) ident(j) operator(=) ident(args)operator(.)ident(length)operator(;) ident(i) operator(<) ident(j)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyString) ident(filename) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(;) + ident(runtime)operator(.)ident(checkSafeString)operator(()ident(filename)operator(\))operator(;) + ident(JRubyFile) ident(fileToTouch) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,)ident(filename)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(fileToTouch)operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content( No such file or directory - )char(\\")delimiter(")> operator(+) ident(filename) operator(+) string<delimiter(")char(\\")delimiter(")>operator(\))operator(;) + operator(}) + + ident(fileToTouch)operator(.)ident(setLastModified)operator(()ident(mtime)operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(args)operator(.)ident(length) operator(-) integer(2)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(unlink)delimiter(")>operator(,) string<delimiter(")content(delete)delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(unlink)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyString) ident(filename) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(;) + ident(runtime)operator(.)ident(checkSafeString)operator(()ident(filename)operator(\))operator(;) + ident(JRubyFile) ident(lToDelete) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,)ident(filename)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + + type(boolean) ident(isSymlink) operator(=) ident(RubyFileTest)operator(.)ident(symlink_p)operator(()ident(recv)operator(,) ident(filename)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + comment(// Broken symlinks considered by exists(\) as non-existing,) + comment(// so we need to check for symlinks explicitly.) + keyword(if) operator(()operator(!)ident(lToDelete)operator(.)ident(exists)operator(()operator(\)) operator(&&) operator(!)ident(isSymlink)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content( No such file or directory - )char(\\")delimiter(")> operator(+) ident(filename) operator(+) string<delimiter(")char(\\")delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(lToDelete)operator(.)ident(delete)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEACCESError)operator(()string<delimiter(")content(Permission denied - )char(\\")delimiter(")> operator(+) ident(filename) operator(+) string<delimiter(")char(\\")delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(args)operator(.)ident(length)operator(\))operator(;) + operator(}) + + comment(// Fast path since JNA stat is about 10x slower than this) + directive(private) directive(static) ident(IRubyObject) ident(getLastModified)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(path)operator(\)) operator({) + ident(JRubyFile) ident(file) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(runtime)operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(path)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(file)operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) ident(path)operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newTime)operator(()ident(file)operator(.)ident(lastModified)operator(()operator(\))operator(\))operator(;) + operator(}) +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Joey Gibson <joey@joeygibson.com> + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.FileDescriptor)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.ext.posix.FileStat)operator(;) +keyword(import) include(org.jruby.ext.posix.util.Platform)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.JRubyFile)operator(;) + +comment(/** + * Implements File::Stat + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(File::Stat)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Comparable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyFileStat) directive(extends) ident(RubyObject) operator({) + directive(private) directive(static) directive(final) type(long) ident(serialVersionUID) operator(=) integer(1L)operator(;) + + directive(private) ident(JRubyFile) ident(file)operator(;) + directive(private) ident(FileStat) ident(stat)operator(;) + + directive(private) directive(static) ident(ObjectAllocator) ident(ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyFileStat)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createFileStatClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + comment(// TODO: NOT_ALLOCATABLE_ALLOCATOR is probably ok here. Confirm. JRUBY-415) + directive(final) ident(RubyClass) ident(fileStatClass) operator(=) ident(runtime)operator(.)ident(getFile)operator(()operator(\))operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Stat)delimiter(")>operator(,)ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setFileStat)operator(()ident(fileStatClass)operator(\))operator(;) + + ident(fileStatClass)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(fastGetModule)operator(()string<delimiter(")content(Comparable)delimiter(")>operator(\))operator(\))operator(;) + ident(fileStatClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyFileStat)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(fileStatClass)operator(;) + operator(}) + + directive(protected) ident(RubyFileStat)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(clazz)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(clazz)operator(\))operator(;) + + operator(}) + + directive(public) directive(static) ident(RubyFileStat) ident(newFileStat)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(filename)operator(,) type(boolean) ident(lstat)operator(\)) operator({) + ident(RubyFileStat) ident(stat) operator(=) keyword(new) ident(RubyFileStat)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getFileStat)operator(()operator(\))operator(\))operator(;) + + ident(stat)operator(.)ident(setup)operator(()ident(filename)operator(,) ident(lstat)operator(\))operator(;) + + keyword(return) ident(stat)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFileStat) ident(newFileStat)operator(()ident(Ruby) ident(runtime)operator(,) type(FileDescriptor) ident(descriptor)operator(\)) operator({) + ident(RubyFileStat) ident(stat) operator(=) keyword(new) ident(RubyFileStat)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getFileStat)operator(()operator(\))operator(\))operator(;) + + ident(stat)operator(.)ident(setup)operator(()ident(descriptor)operator(\))operator(;) + + keyword(return) ident(stat)operator(;) + operator(}) + + directive(private) type(void) ident(setup)operator(()type(FileDescriptor) ident(descriptor)operator(\)) operator({) + ident(stat) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(fstat)operator(()ident(descriptor)operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(setup)operator(()type(String) ident(filename)operator(,) type(boolean) ident(lstat)operator(\)) operator({) + keyword(if) operator(()ident(Platform)operator(.)ident(IS_WINDOWS) operator(&&) ident(filename)operator(.)ident(length)operator(()operator(\)) operator(==) integer(2) + operator(&&) ident(filename)operator(.)ident(charAt)operator(()integer(1)operator(\)) operator(==) string<delimiter(')content(:)delimiter(')> operator(&&) type(Character)operator(.)ident(isLetter)operator(()ident(filename)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(\))operator(\)) operator({) + ident(filename) operator(+=) string<delimiter(")content(/)delimiter(")>operator(;) + operator(}) + + ident(file) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(filename)operator(\))operator(;) + + keyword(if) operator(()ident(lstat)operator(\)) operator({) + ident(stat) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(lstat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(stat) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject) ident(fname)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(setup)operator(()ident(fname)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(atime)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(atime)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newTime)operator(()ident(stat)operator(.)ident(atime)operator(()operator(\)) operator(*) integer(1000)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(blksize)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(blksize)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(blockSize)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(blockdev?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(blockdev_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isBlockDev)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(blocks)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(blocks)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(blocks)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chardev?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(chardev_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isCharDev)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(cmp)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyFileStat)operator(\))operator(\)) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + type(long) ident(time1) operator(=) ident(stat)operator(.)ident(mtime)operator(()operator(\))operator(;) + type(long) ident(time2) operator(=) operator(()operator(()ident(RubyFileStat)operator(\)) ident(other)operator(\))operator(.)ident(stat)operator(.)ident(mtime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(time1) operator(==) ident(time2)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(time1) operator(<) ident(time2)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()operator(-)integer(1)operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ctime)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(ctime)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newTime)operator(()ident(stat)operator(.)ident(ctime)operator(()operator(\)) operator(*) integer(1000)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dev)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(dev)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(dev)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dev_major)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(devMajor)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(major)operator(()ident(stat)operator(.)ident(dev)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dev_minor)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(devMinor)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(minor)operator(()ident(stat)operator(.)ident(dev)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(directory?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(directory_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isDirectory)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(executable?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(executable_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isExecutable)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(executable_real?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(executableReal_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isExecutableReal)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(file?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(file_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isFile)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ftype)delimiter(")>operator(\)) + directive(public) ident(RubyString) ident(ftype)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(stat)operator(.)ident(ftype)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gid)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(gid)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(gid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(grpowned?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(group_owned_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isGroupOwned)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(original)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(original) keyword(instanceof) ident(RubyFileStat)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument class)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyFileStat) ident(originalFileStat) operator(=) operator(()ident(RubyFileStat)operator(\)) ident(original)operator(;) + + ident(file) operator(=) ident(originalFileStat)operator(.)ident(file)operator(;) + ident(stat) operator(=) ident(originalFileStat)operator(.)ident(stat)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ino)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(ino)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(ino)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + type(StringBuilder) ident(buf) operator(=) keyword(new) type(StringBuilder)operator(()string<delimiter(")content(#<)delimiter(")>operator(\))operator(;) + ident(buf)operator(.)ident(append)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + ident(buf)operator(.)ident(append)operator(()string<delimiter(")content( )delimiter(")>operator(\))operator(;) + comment(// FIXME: Obvious issue that not all platforms can display all attributes. Ugly hacks.) + comment(// Using generic posix library makes pushing inspect behavior into specific system impls) + comment(// rather painful.) + keyword(try) operator({) ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(dev=0x)delimiter(")>operator(\))operator(.)ident(append)operator(()type(Long)operator(.)ident(toHexString)operator(()ident(stat)operator(.)ident(dev)operator(()operator(\))operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + keyword(try) operator({) ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(ino=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(stat)operator(.)ident(ino)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(mode=0)delimiter(")>operator(\))operator(.)ident(append)operator(()type(Integer)operator(.)ident(toOctalString)operator(()ident(stat)operator(.)ident(mode)operator(()operator(\))operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) + keyword(try) operator({) ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(nlink=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(stat)operator(.)ident(nlink)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + keyword(try) operator({) ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(uid=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(stat)operator(.)ident(uid)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + keyword(try) operator({) ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(gid=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(stat)operator(.)ident(gid)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + keyword(try) operator({) ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(rdev=0x)delimiter(")>operator(\))operator(.)ident(append)operator(()type(Long)operator(.)ident(toHexString)operator(()ident(stat)operator(.)ident(rdev)operator(()operator(\))operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(size=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(stat)operator(.)ident(st_size)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) + keyword(try) operator({) ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(blksize=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(stat)operator(.)ident(blockSize)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + keyword(try) operator({) ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(blocks=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(stat)operator(.)ident(blocks)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({)operator(}) + + ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(atime=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(atime)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) + ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(mtime=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(mtime)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(;) + ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(ctime=)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(ctime)operator(()operator(\))operator(\))operator(;) + ident(buf)operator(.)ident(append)operator(()string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buf)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(uid)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(uid)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(uid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(mode)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(mode)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(mode)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(mtime)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(mtime)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newTime)operator(()ident(stat)operator(.)ident(mtime)operator(()operator(\)) operator(*) integer(1000)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(mtimeEquals)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(mtime)operator(()operator(\)) operator(==) ident(newFileStat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(other)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(stat)operator(.)ident(mtime)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(mtimeGreaterThan)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(mtime)operator(()operator(\)) operator(>) ident(newFileStat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(other)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(stat)operator(.)ident(mtime)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(mtimeLessThan)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(mtime)operator(()operator(\)) operator(<) ident(newFileStat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(other)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(stat)operator(.)ident(mtime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nlink)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(nlink)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(nlink)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(owned?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(owned_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isOwned)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pipe?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(pipe_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isNamedPipe)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rdev)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rdev)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(rdev)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rdev_major)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rdevMajor)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(major)operator(()ident(stat)operator(.)ident(rdev)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rdev_minor)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rdevMinor)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(minor)operator(()ident(stat)operator(.)ident(rdev)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readable?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(readable_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isReadable)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readable_real?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(readableReal_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isReadableReal)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setgid?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(setgid_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isSetgid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setuid?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(setuid_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isSetuid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(size)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(stat)operator(.)ident(st_size)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(size?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(size_p)operator(()operator(\)) operator({) + type(long) ident(size) operator(=) ident(stat)operator(.)ident(st_size)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(size) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(size)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(socket?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(socket_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isSocket)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sticky?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(sticky_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isSticky)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(symlink?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(symlink_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isSymlink)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(writable?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(writable_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isWritable)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(writable_real?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(writableReal_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isWritableReal)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zero?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(zero_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(stat)operator(.)ident(isEmpty)operator(()operator(\))operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) + +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.JRubyFile)operator(;) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(FileTest)delimiter(")>operator(\)) +directive(public) type(class) class(RubyFileTest) operator({) + directive(public) directive(static) ident(RubyModule) ident(createFileTestModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(fileTestModule) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(FileTest)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setFileTest)operator(()ident(fileTestModule)operator(\))operator(;) + + ident(fileTestModule)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyFileTest)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(fileTestModule)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(blockdev?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(blockdev_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isBlockDev)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chardev?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chardev_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isCharDev)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(directory?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(directory_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isDirectory)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(executable?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(executable_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isExecutable)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(executable_real?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(executable_real_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isExecutableReal)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(exist?)delimiter(")>operator(,) string<delimiter(")content(exists?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exist_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + keyword(if) operator(()ident(Ruby)operator(.)ident(isSecurityRestricted)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + keyword(if)operator(()ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(.)ident(startsWith)operator(()string<delimiter(")content(file:)delimiter(")>operator(\))operator(\)) operator({) + type(String) ident(file) operator(=) ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(.)ident(substring)operator(()integer(5)operator(\))operator(;) + type(int) ident(bang) operator(=) ident(file)operator(.)ident(indexOf)operator(()string<delimiter(')content(!)delimiter(')>operator(\))operator(;) + keyword(if) operator(()ident(bang) operator(==) operator(-)integer(1) operator(||) ident(bang) operator(==) ident(file)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + type(String) ident(jar) operator(=) ident(file)operator(.)ident(substring)operator(()integer(0)operator(,) ident(bang)operator(\))operator(;) + type(String) ident(after) operator(=) ident(file)operator(.)ident(substring)operator(()ident(bang) operator(+) integer(2)operator(\))operator(;) + keyword(try) operator({) + ident(java)operator(.)ident(util)operator(.)ident(jar)operator(.)ident(JarFile) ident(jf) operator(=) keyword(new) ident(java)operator(.)ident(util)operator(.)ident(jar)operator(.)ident(JarFile)operator(()ident(jar)operator(\))operator(;) + keyword(if)operator(()ident(jf)operator(.)ident(getJarEntry)operator(()ident(after)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(catch)operator(()type(Exception) ident(e)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(file)operator(()ident(filename)operator(\))operator(.)ident(exists)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(file?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(file_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(filename)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(file)operator(.)ident(isFile)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(grpowned?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(grpowned_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isGroupOwned)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(identical?)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(identical_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename1)operator(,) ident(IRubyObject) ident(filename2)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file1) operator(=) ident(file)operator(()ident(filename1)operator(\))operator(;) + ident(JRubyFile) ident(file2) operator(=) ident(file)operator(()ident(filename2)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file1)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(file2)operator(.)ident(exists)operator(()operator(\)) operator(&&) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file1)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isIdentical)operator(()ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file2)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(owned?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(owned_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isOwned)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pipe?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(pipe_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isNamedPipe)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(// We use file test since it is faster than a stat; also euid == uid in Java always) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(readable?)delimiter(")>operator(,) string<delimiter(")content(readable_real?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(readable_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(file)operator(.)ident(canRead)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(// Not exposed by filetest, but so similiar in nature that it is stored here) + directive(public) directive(static) ident(IRubyObject) ident(rowned_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isROwned)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setgid?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setgid_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isSetgid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setuid?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setuid_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isSetuid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(size)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(size)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(file)operator(.)ident(exists)operator(()operator(\))operator(\)) ident(noFileError)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(file)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(size?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(size_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(file)operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + type(long) ident(length) operator(=) ident(file)operator(.)ident(length)operator(()operator(\))operator(;) + keyword(if) operator(()ident(length) operator(>) integer(0)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(length)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(socket?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(socket_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isSocket)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sticky?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sticky_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(stat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isSticky)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(symlink?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(symlink_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(try) operator({) + comment(// Note: We can't use file.exists(\) to check whether the symlink) + comment(// exists or not, because that method returns false for existing) + comment(// but broken symlink. So, we try without the existence check,) + comment(// but in the try-catch block.) + comment(// MRI behavior: symlink? on broken symlink should return true.) + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(lstat)operator(()ident(file)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(\))operator(.)ident(isSymlink)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(re)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(// We do both writable and writable_real through the same method because) + comment(// in our java process effective and real userid will always be the same.) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(writable?)delimiter(")>operator(,) string<delimiter(")content(writable_real?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(writable_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + keyword(return) ident(filename)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(file)operator(()ident(filename)operator(\))operator(.)ident(canWrite)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zero?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(zero_p)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(\)) operator({) + ident(JRubyFile) ident(file) operator(=) ident(file)operator(()ident(filename)operator(\))operator(;) + + keyword(return) ident(filename)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(file)operator(.)ident(exists)operator(()operator(\)) operator(&&) ident(file)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0L)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(JRubyFile) ident(file)operator(()ident(IRubyObject) ident(path)operator(\)) operator({) + type(String) ident(filename) operator(=) ident(path)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + + keyword(return) ident(JRubyFile)operator(.)ident(create)operator(()ident(path)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(filename)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(noFileError)operator(()ident(IRubyObject) ident(filename)operator(\)) operator({) + keyword(throw) ident(filename)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(No such file or directory - )delimiter(")> operator(+) + ident(filename)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(;) + operator(}) +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 David Corbin <dcorbin@users.sourceforge.net> + * Copyright (C\) 2006 Antti Karanta <antti.karanta@napa.fi> + * Copyright (C\) 2007 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.math.BigInteger)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.java.MiniJava)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.Convert)operator(;) +keyword(import) include(org.jruby.util.Numeric)operator(;) +keyword(import) include(org.jruby.util.TypeCoercer)operator(;) + +comment(/** + * Implementation of the Fixnum class. + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Fixnum)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Integer)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Precision)delimiter(")>operator(\)) +directive(public) type(class) class(RubyFixnum) directive(extends) ident(RubyInteger) operator({) + + directive(public) directive(static) ident(RubyClass) ident(createFixnumClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(fixnum) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Fixnum)delimiter(")>operator(,) ident(runtime)operator(.)ident(getInteger)operator(()operator(\))operator(,) + ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setFixnum)operator(()ident(fixnum)operator(\))operator(;) + ident(fixnum)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(FIXNUM)operator(;) + ident(fixnum)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyFixnum)operator(;) + operator(}) + operator(})operator(;) + + ident(fixnum)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getPrecision)operator(()operator(\))operator(\))operator(;) + + ident(fixnum)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyFixnum)operator(.)ident(class)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(runtime)operator(.)ident(fixnumCache)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(runtime)operator(.)ident(fixnumCache)operator([)ident(i)operator(]) operator(=) keyword(new) ident(RubyFixnum)operator(()ident(runtime)operator(,) ident(fixnum)operator(,) ident(i) operator(-) integer(128)operator(\))operator(;) + operator(}) + + keyword(return) ident(fixnum)operator(;) + operator(}) + + directive(private) directive(final) type(long) ident(value)operator(;) + directive(private) directive(static) directive(final) type(int) ident(BIT_SIZE) operator(=) integer(64)operator(;) + directive(public) directive(static) directive(final) type(long) ident(SIGN_BIT) operator(=) operator(()integer(1L) operator(<)operator(<) operator(()ident(BIT_SIZE) operator(-) integer(1)operator(\))operator(\))operator(;) + directive(public) directive(static) directive(final) type(long) ident(MAX) operator(=) operator(()integer(1L)operator(<)operator(<)operator(()ident(BIT_SIZE) operator(-) integer(1)operator(\))operator(\)) operator(-) integer(1)operator(;) + directive(public) directive(static) directive(final) type(long) ident(MIN) operator(=) operator(-)integer(1) operator(*) ident(MAX) operator(-) integer(1)operator(;) + directive(public) directive(static) directive(final) type(long) ident(MAX_MARSHAL_FIXNUM) operator(=) operator(()integer(1L) operator(<)operator(<) integer(30)operator(\)) operator(-) integer(1)operator(;) comment(// 0x3fff_ffff) + directive(public) directive(static) directive(final) type(long) ident(MIN_MARSHAL_FIXNUM) operator(=) operator(-) operator(()integer(1L) operator(<)operator(<) integer(30)operator(\))operator(;) comment(// -0x4000_0000) + + directive(private) directive(static) ident(IRubyObject) ident(fixCoerce)operator(()ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(do) operator({) + ident(x) operator(=) ident(x)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + operator(}) keyword(while) operator(()operator(!)operator(()ident(x) keyword(instanceof) ident(RubyFixnum)operator(\)) operator(&&) operator(!)operator(()ident(x) keyword(instanceof) ident(RubyBignum)operator(\))operator(\))operator(;) + keyword(return) ident(x)operator(;) + operator(}) + + directive(public) ident(RubyFixnum)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) integer(0)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFixnum)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getFixnum)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + operator(}) + + directive(private) ident(RubyFixnum)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klazz)operator(,) type(long) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klazz)operator(,) keyword(false)operator(\))operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(FIXNUM)operator(;) + operator(}) + + comment(/** + * short circuit for Fixnum key comparison + */) + annotation(@Override) + directive(public) directive(final) type(boolean) ident(eql)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(other) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(value) operator(==) operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(.)ident(value)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isImmediate)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyClass) ident(getSingletonClass)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't define singleton)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(Class)operator(<)operator(?)operator(>) ident(getJavaClass)operator(()operator(\)) operator({) + comment(// this precision-guessing needs to be thought out more, since in the) + comment(// case of coercing to Object we generally want to get the same type) + comment(// always) +comment(// if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE\) {) +comment(// return byte.class;) +comment(// } else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE\) {) +comment(// return short.class;) +comment(// } else if (value >= Character.MIN_VALUE && value <= Character.MAX_VALUE\) {) +comment(// return char.class;) +comment(// } else if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE\) {) +comment(// return int.class;) +comment(// }) + keyword(return) type(long)operator(.)ident(class)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(double) ident(getDoubleValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(long) ident(getLongValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(int) ident(CACHE_OFFSET) operator(=) integer(128)operator(;) + + directive(public) directive(static) ident(RubyFixnum) ident(newFixnum)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(isInCacheRange)operator(()ident(value)operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(fixnumCache)operator([)operator(()type(int)operator(\)) ident(value) operator(+) ident(CACHE_OFFSET)operator(])operator(;) + operator(}) + keyword(return) keyword(new) ident(RubyFixnum)operator(()ident(runtime)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(boolean) ident(isInCacheRange)operator(()type(long) ident(value)operator(\)) operator({) + keyword(return) ident(value) operator(<=) integer(127) operator(&&) ident(value) operator(>=) operator(-)integer(128)operator(;) + operator(}) + + directive(public) ident(RubyFixnum) ident(newFixnum)operator(()type(long) ident(newValue)operator(\)) operator({) + keyword(return) ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(newValue)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFixnum) ident(zero)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(fixnumCache)operator([)ident(CACHE_OFFSET)operator(])operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFixnum) ident(one)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(fixnumCache)operator([)ident(CACHE_OFFSET) operator(+) integer(1)operator(])operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFixnum) ident(two)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(fixnumCache)operator([)ident(CACHE_OFFSET) operator(+) integer(2)operator(])operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFixnum) ident(three)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(fixnumCache)operator([)ident(CACHE_OFFSET) operator(+) integer(3)operator(])operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFixnum) ident(four)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(fixnumCache)operator([)ident(CACHE_OFFSET) operator(+) integer(4)operator(])operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFixnum) ident(five)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(fixnumCache)operator([)ident(CACHE_OFFSET) operator(+) integer(5)operator(])operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFixnum) ident(minus_one)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(fixnumCache)operator([)ident(CACHE_OFFSET) operator(-) integer(1)operator(])operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + keyword(return) ident(newFixnum)operator(()ident(hashCode)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) directive(final) type(int) ident(hashCode)operator(()operator(\)) operator({) + keyword(return) operator(()type(int)operator(\))operator(()ident(value) operator(^) ident(value) operator(>)operator(>)operator(>) integer(32)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(equals)operator(()type(Object) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) operator(==) local_variable(this)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(RubyFixnum) ident(num) operator(=) operator(()ident(RubyFixnum)operator(\))ident(other)operator(;) + + keyword(if) operator(()ident(num)operator(.)ident(value) operator(==) ident(value)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/* ================ + * Instance Methods + * ================ + */) + + comment(/** fix_to_s + * + */) + directive(public) ident(RubyString) ident(to_s)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) keyword(return) ident(to_s)operator(()operator(\))operator(;) + keyword(case) integer(1)operator(:) keyword(return) ident(to_s)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(1)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod) + annotation(@Override) + directive(public) ident(RubyString) ident(to_s)operator(()operator(\)) operator({) + type(int) ident(base) operator(=) integer(10)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(Convert)operator(.)ident(longToByteList)operator(()ident(value)operator(,) ident(base)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(RubyString) ident(to_s)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + type(int) ident(base) operator(=) ident(num2int)operator(()ident(arg0)operator(\))operator(;) + keyword(if) operator(()ident(base) operator(<) integer(2) operator(||) ident(base) operator(>) integer(36)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(illegal radix )delimiter(")> operator(+) ident(base)operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(Convert)operator(.)ident(longToByteList)operator(()ident(value)operator(,) ident(base)operator(\))operator(\))operator(;) + operator(}) + + comment(/** fix_id2name + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(id2name)operator(()operator(\)) operator({) + ident(RubySymbol) ident(symbol) operator(=) ident(RubySymbol)operator(.)ident(getSymbolLong)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + + keyword(if) operator(()ident(symbol) operator(!=) keyword(null)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** fix_to_sym + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(to_sym)operator(()operator(\)) operator({) + ident(RubySymbol) ident(symbol) operator(=) ident(RubySymbol)operator(.)ident(getSymbolLong)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + + keyword(return) ident(symbol) operator(!=) keyword(null) operator(?) ident(symbol) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** fix_uminus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-@)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_uminus)operator(()operator(\)) operator({) + keyword(if) operator(()ident(value) operator(==) ident(MIN)operator(\)) operator({) comment(// a gotcha) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(BigInteger)operator(.)ident(valueOf)operator(()ident(value)operator(\))operator(.)ident(negate)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(-)ident(value)operator(\))operator(;) + operator(}) + + comment(/** fix_plus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_plus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(addFixnum)operator(()ident(context)operator(,) operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(addOther)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(addFixnum)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyFixnum) ident(other)operator(\)) operator({) + type(long) ident(otherValue) operator(=) ident(other)operator(.)ident(value)operator(;) + type(long) ident(result) operator(=) ident(value) operator(+) ident(otherValue)operator(;) + keyword(if) operator(()ident(additionOverflowed)operator(()ident(value)operator(,) ident(otherValue)operator(,) ident(result)operator(\))operator(\)) operator({) + keyword(return) ident(addAsBignum)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(result)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(boolean) ident(additionOverflowed)operator(()type(long) ident(original)operator(,) type(long) ident(other)operator(,) type(long) ident(result)operator(\)) operator({) + keyword(return) operator(()operator(~)operator(()ident(original) operator(^) ident(other)operator(\)) operator(&) operator(()ident(original) operator(^) ident(result)operator(\)) operator(&) ident(SIGN_BIT)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + directive(private) directive(static) type(boolean) ident(subtractionOverflowed)operator(()type(long) ident(original)operator(,) type(long) ident(other)operator(,) type(long) ident(result)operator(\)) operator({) + keyword(return) operator(()operator(~)operator(()ident(original) operator(^) operator(~)ident(other)operator(\)) operator(&) operator(()ident(original) operator(^) ident(result)operator(\)) operator(&) ident(SIGN_BIT)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(addAsBignum)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyFixnum) ident(other)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(.)ident(op_plus)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(addOther)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(op_plus)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFloat)operator(()operator(()type(double)operator(\)) ident(value) operator(+) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_minus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_minus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(subtractFixnum)operator(()ident(context)operator(,) operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(subtractOther)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(subtractFixnum)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyFixnum) ident(other)operator(\)) operator({) + type(long) ident(otherValue) operator(=) ident(other)operator(.)ident(value)operator(;) + type(long) ident(result) operator(=) ident(value) operator(-) ident(otherValue)operator(;) + keyword(if) operator(()ident(subtractionOverflowed)operator(()ident(value)operator(,) ident(otherValue)operator(,) ident(result)operator(\))operator(\)) operator({) + keyword(return) ident(subtractAsBignum)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(result)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(subtractAsBignum)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyFixnum) ident(other)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(.)ident(op_minus)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(subtractOther)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(.)ident(op_minus)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFloat)operator(()operator(()type(double)operator(\)) ident(value) operator(-) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_mul + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(*)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_mul)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(otherValue) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + keyword(if) operator(()ident(value) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + type(long) ident(result) operator(=) ident(value) operator(*) ident(otherValue)operator(;) + keyword(if) operator(()ident(result) operator(/) ident(value) operator(!=) ident(otherValue)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(runtime)operator(,) ident(value)operator(\))operator(.)ident(op_mul)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(newFixnum)operator(()ident(runtime)operator(,) ident(result)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(op_mul)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newFloat)operator(()operator(()type(double)operator(\)) ident(value) operator(*) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_div + * here is terrible MRI gotcha: + * 1.div 3.0 -> 0 + * 1 / 3.0 -> 0.3333333333333333 + * + * MRI is also able to do it in one place by looking at current frame in rb_num_coerce_bin: + * rb_funcall(x, ruby_frame->orig_func, 1, y\); + * + * also note that RubyFloat doesn't override Numeric.div + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(div)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(div_div)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(idiv)operator(()ident(context)operator(,) ident(other)operator(,) string<delimiter(")content(div)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(/)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_div)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(idiv)operator(()ident(context)operator(,) ident(other)operator(,) string<delimiter(")content(/)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(odd?)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyBoolean) ident(odd_p)operator(()operator(\)) operator({) + keyword(if)operator(()ident(value)operator(%)integer(2) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(even?)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyBoolean) ident(even_p)operator(()operator(\)) operator({) + keyword(if)operator(()ident(value)operator(%)integer(2) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(pred)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(-)integer(1)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(idiv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(,) type(String) ident(method)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(x) operator(=) ident(value)operator(;) + type(long) ident(y) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + + keyword(if) operator(()ident(y) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + + type(long) ident(div) operator(=) ident(x) operator(/) ident(y)operator(;) + type(long) ident(mod) operator(=) ident(x) operator(%) ident(y)operator(;) + + keyword(if) operator(()ident(mod) operator(<) integer(0) operator(&&) ident(y) operator(>) integer(0) operator(||) ident(mod) operator(>) integer(0) operator(&&) ident(y) operator(<) integer(0)operator(\)) operator({) + ident(div) operator(-=) integer(1)operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(div)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) ident(method)operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_mod + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(%)delimiter(")>operator(,) string<delimiter(")content(modulo)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(op_mod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + comment(// Java / and % are not the same as ruby) + type(long) ident(x) operator(=) ident(value)operator(;) + type(long) ident(y) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + + keyword(if) operator(()ident(y) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + + type(long) ident(mod) operator(=) ident(x) operator(%) ident(y)operator(;) + + keyword(if) operator(()ident(mod) operator(<) integer(0) operator(&&) ident(y) operator(>) integer(0) operator(||) ident(mod) operator(>) integer(0) operator(&&) ident(y) operator(<) integer(0)operator(\)) operator({) + ident(mod) operator(+=) ident(y)operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(mod)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_divmod + * + */) + annotation(@JRubyMethod) + annotation(@Override) + directive(public) ident(IRubyObject) ident(divmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(x) operator(=) ident(value)operator(;) + type(long) ident(y) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(y) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + + type(long) ident(div) operator(=) ident(x) operator(/) ident(y)operator(;) + type(long) ident(mod) operator(=) ident(x) operator(%) ident(y)operator(;) + + keyword(if) operator(()ident(mod) operator(<) integer(0) operator(&&) ident(y) operator(>) integer(0) operator(||) ident(mod) operator(>) integer(0) operator(&&) ident(y) operator(<) integer(0)operator(\)) operator({) + ident(div) operator(-=) integer(1)operator(;) + ident(mod) operator(+=) ident(y)operator(;) + operator(}) + + ident(IRubyObject) ident(fixDiv) operator(=) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(div)operator(\))operator(;) + ident(IRubyObject) ident(fixMod) operator(=) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(mod)operator(\))operator(;) + + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(fixDiv)operator(,) ident(fixMod)operator(\))operator(;) + + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_quo + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(quo)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_8)operator(\)) + directive(public) ident(IRubyObject) ident(quo)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(()type(double)operator(\)) ident(value) operator(/) operator(()type(double)operator(\)) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(quo)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_pow + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(**)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_pow)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if)operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(b) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + + keyword(if) operator(()ident(b) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(b) operator(==) integer(1)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + keyword(if) operator(()ident(b) operator(>) integer(0)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(.)ident(op_pow)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(pow)operator(()ident(value)operator(,) ident(b)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(pow)operator(()ident(value)operator(,) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\)) + operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_pow + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(**)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(op_pow_19)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(long) ident(a) operator(=) ident(value)operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(b) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + + keyword(if) operator(()ident(b) operator(<) integer(0)operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalRaw)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(b) operator(==) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(;) + keyword(if) operator(()ident(b) operator(==) integer(1)operator(\)) keyword(return) local_variable(this)operator(;) + + keyword(if) operator(()ident(a) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(b) operator(>) integer(0) operator(?) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\)) operator(:) ident(RubyNumeric)operator(.)ident(dbl2num)operator(()ident(runtime)operator(,) float(1.0) operator(/) float(0.0)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(a) operator(==) integer(1)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(;) + keyword(if) operator(()ident(a) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(return) ident(b) operator(%) integer(2) operator(==) integer(0) operator(?) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(;) + operator(}) + keyword(return) ident(Numeric)operator(.)ident(int_pow)operator(()ident(context)operator(,) ident(a)operator(,) ident(b)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(if) operator(()ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalRaw)operator(()ident(runtime)operator(,) local_variable(this)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(a) operator(==) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + keyword(if) operator(()ident(a) operator(==) integer(1)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(;) + keyword(if) operator(()ident(a) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(return) ident(RubyInteger)operator(.)ident(even_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(?) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(;) + operator(}) + ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(runtime)operator(,) ident(RubyBignum)operator(.)ident(fix2big)operator(()local_variable(this)operator(\))operator(\))operator(.)ident(op_pow)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(pow)operator(()ident(a)operator(,) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + + comment(/** fix_abs + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(abs)operator(()operator(\)) operator({) + keyword(if) operator(()ident(value) operator(<) integer(0)operator(\)) operator({) + comment(// A gotcha for Long.MIN_VALUE: value = -value) + keyword(if) operator(()ident(value) operator(==) type(Long)operator(.)ident(MIN_VALUE)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(() + ident(getRuntime)operator(()operator(\))operator(,) type(BigInteger)operator(.)ident(valueOf)operator(()ident(value)operator(\))operator(.)ident(negate)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(-)ident(value)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** fix_equal + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(==) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + keyword(return) local_variable(super)operator(.)ident(op_num_equal)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_cmp + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(compareFixnum)operator(()ident(context)operator(,) operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceCmp)operator(()ident(context)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(compareFixnum)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyFixnum) ident(other)operator(\)) operator({) + type(long) ident(otherValue) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + keyword(if) operator(()ident(value) operator(==) ident(otherValue)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(value) operator(>) ident(otherValue)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** fix_gt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_gt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(>) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceRelOp)operator(()ident(context)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_ge + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>=)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_ge)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(>=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceRelOp)operator(()ident(context)operator(,) string<delimiter(")content(>=)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_lt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_lt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(<) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + + keyword(return) ident(coerceRelOp)operator(()ident(context)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_le + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_le)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(<=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + + keyword(return) ident(coerceRelOp)operator(()ident(context)operator(,) string<delimiter(")content(<=)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** fix_rev + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(~)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_neg)operator(()operator(\)) operator({) + keyword(return) ident(newFixnum)operator(()operator(~)ident(value)operator(\))operator(;) + operator(}) + + comment(/** fix_and + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(&)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_and)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum) operator(||) operator(()ident(other) operator(=) ident(fixCoerce)operator(()ident(other)operator(\))operator(\)) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(&) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(op_and)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** fix_or + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(|)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_or)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum) operator(||) operator(()ident(other) operator(=) ident(fixCoerce)operator(()ident(other)operator(\))operator(\)) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(|) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(op_or)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** fix_xor + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(^)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_xor)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum) operator(||) operator(()ident(other) operator(=) ident(fixCoerce)operator(()ident(other)operator(\))operator(\)) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(^) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + keyword(return) operator(()operator(()ident(RubyBignum)operator(\)) ident(other)operator(\))operator(.)ident(op_xor)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** fix_aref + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if)operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator(&&) operator(!)operator(()operator(()ident(other) operator(=) ident(fixCoerce)operator(()ident(other)operator(\))operator(\)) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + ident(RubyBignum) ident(big) operator(=) operator(()ident(RubyBignum)operator(\)) ident(other)operator(;) + ident(RubyObject) ident(tryFix) operator(=) ident(RubyBignum)operator(.)ident(bignorm)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(big)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(tryFix) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + keyword(return) ident(big)operator(.)ident(getValue)operator(()operator(\))operator(.)ident(signum)operator(()operator(\)) operator(==) integer(0) operator(||) ident(value) operator(>=) integer(0) operator(?) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(one)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + type(long) ident(otherValue) operator(=) ident(fix2long)operator(()ident(other)operator(\))operator(;) + + keyword(if) operator(()ident(otherValue) operator(<) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(BIT_SIZE) operator(-) integer(1) operator(<) ident(otherValue)operator(\)) operator({) + keyword(return) ident(value) operator(<) integer(0) operator(?) ident(RubyFixnum)operator(.)ident(one)operator(()ident(getRuntime)operator(()operator(\))operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) operator(()ident(value) operator(&) operator(()integer(1L) operator(<)operator(<) ident(otherValue)operator(\))operator(\)) operator(==) integer(0) operator(?) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(one)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** fix_lshift + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<<)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_lshift)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(.)ident(op_lshift)operator(()ident(other)operator(\))operator(;) + + type(long) ident(width) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + + keyword(return) ident(width) operator(<) integer(0) operator(?) ident(rshift)operator(()operator(-)ident(width)operator(\)) operator(:) ident(lshift)operator(()ident(width)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(lshift)operator(()type(long) ident(width)operator(\)) operator({) + keyword(if) operator(()ident(width) operator(>) ident(BIT_SIZE) operator(-) integer(1) operator(||) operator(()operator(()operator(~)integer(0L) operator(<)operator(<) ident(BIT_SIZE) operator(-) ident(width) operator(-) integer(1)operator(\)) operator(&) ident(value)operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(.)ident(op_lshift)operator(()ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(width)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(<)operator(<) ident(width)operator(\))operator(;) + operator(}) + + comment(/** fix_rshift + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>>)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_rshift)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(.)ident(op_rshift)operator(()ident(other)operator(\))operator(;) + + type(long) ident(width) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(other)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(width) operator(==) integer(0)operator(\)) keyword(return) local_variable(this)operator(;) + + keyword(return) ident(width) operator(<) integer(0) operator(?) ident(lshift)operator(()operator(-)ident(width)operator(\)) operator(:) ident(rshift)operator(()ident(width)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(rshift)operator(()type(long) ident(width)operator(\)) operator({) + keyword(if) operator(()ident(width) operator(>=) ident(BIT_SIZE) operator(-) integer(1)operator(\)) operator({) + keyword(return) ident(value) operator(<) integer(0) operator(?) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(getRuntime)operator(()operator(\))operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(>)operator(>) ident(width)operator(\))operator(;) + operator(}) + + comment(/** fix_to_f + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(to_f)operator(()operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(()type(double)operator(\)) ident(value)operator(\))operator(;) + operator(}) + + comment(/** fix_size + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(newFixnum)operator(()operator(()type(long)operator(\)) operator(()operator(()ident(BIT_SIZE) operator(+) integer(7)operator(\)) operator(/) integer(8)operator(\))operator(\))operator(;) + operator(}) + + comment(/** fix_zero_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zero?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(zero_p)operator(()operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(==) integer(0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + annotation(@Override) + directive(public) ident(IRubyObject) ident(id)operator(()operator(\)) operator({) + keyword(if) operator(()ident(value) operator(<=) type(Long)operator(.)ident(MAX_VALUE) operator(/) integer(2) operator(&&) ident(value) operator(>=) type(Long)operator(.)ident(MIN_VALUE) operator(/) integer(2)operator(\)) operator({) + keyword(return) ident(newFixnum)operator(()integer(2) operator(*) ident(value) operator(+) integer(1)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(super)operator(.)ident(id)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(taint)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(freeze)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(// Piece of mri rb_to_id) + annotation(@Override) + directive(public) type(String) ident(asJavaString)operator(()operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(FIXNUMS_NOT_SYMBOLS)operator(,) string<delimiter(")content(do not use Fixnums as Symbols)delimiter(")>operator(\))operator(;) + + comment(// FIXME: I think this chunk is equivalent to MRI id2name (and not our public method ) + comment(// id2name\). Make into method if used more than once. ) + ident(RubySymbol) ident(symbol) operator(=) ident(RubySymbol)operator(.)ident(getSymbolLong)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + + keyword(if) operator(()ident(symbol) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")delimiter(")> operator(+) ident(value) operator(+) string<delimiter(")content( is not a symbol)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFixnum) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + keyword(return) ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(input)operator(.)ident(unmarshalInt)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/* ================ + * Singleton Methods + * ================ + */) + + comment(/** rb_fix_induced_from + * + */) + annotation(@JRubyMethod)operator(()ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(induced_from)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(num2fix)operator(()ident(other)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_java)operator(()operator(\)) operator({) + keyword(return) ident(MiniJava)operator(.)ident(javaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Long)operator(.)ident(valueOf)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(as)operator(()type(Class) ident(javaClass)operator(\)) operator({) + keyword(return) ident(MiniJava)operator(.)ident(javaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(coerceToJavaType)operator(()ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(,) ident(javaClass)operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(Object) ident(coerceToJavaType)operator(()ident(Ruby) ident(ruby)operator(,) ident(RubyFixnum) ident(self)operator(,) type(Class) ident(javaClass)operator(\)) operator({) + keyword(if) operator(()operator(!)type(Number)operator(.)ident(class)operator(.)ident(isAssignableFrom)operator(()ident(javaClass)operator(\))operator(\)) operator({) + keyword(throw) ident(ruby)operator(.)ident(newTypeError)operator(()ident(javaClass)operator(.)ident(getCanonicalName)operator(()operator(\)) operator(+) string<delimiter(")content( is not a numeric type)delimiter(")>operator(\))operator(;) + operator(}) + + ident(TypeCoercer) ident(coercer) operator(=) ident(JAVA_COERCERS)operator(.)ident(get)operator(()ident(javaClass)operator(\))operator(;) + + keyword(if) operator(()ident(coercer) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(ruby)operator(.)ident(newTypeError)operator(()string<delimiter(")content(Cannot coerce Fixnum to )delimiter(")> operator(+) ident(javaClass)operator(.)ident(getCanonicalName)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(coercer)operator(.)ident(coerce)operator(()ident(self)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(Map)operator(<)type(Class)operator(,) ident(TypeCoercer)operator(>) ident(JAVA_COERCERS) operator(=) keyword(new) type(HashMap)operator(<)type(Class)operator(,) ident(TypeCoercer)operator(>)operator(()operator(\))operator(;) + + directive(static) operator({) + ident(TypeCoercer) ident(intCoercer) operator(=) keyword(new) ident(TypeCoercer)operator(()operator(\)) operator({) + directive(public) type(Object) ident(coerce)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + ident(RubyFixnum) ident(fixnum) operator(=) operator(()ident(RubyFixnum)operator(\))ident(self)operator(;) + + keyword(if) operator(()ident(fixnum)operator(.)ident(value) operator(>) type(Integer)operator(.)ident(MAX_VALUE)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(Fixnum )delimiter(")> operator(+) ident(fixnum)operator(.)ident(value) operator(+) string<delimiter(")content( is too large for Java int)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) type(Integer)operator(.)ident(valueOf)operator(()operator(()type(int)operator(\))ident(fixnum)operator(.)ident(value)operator(\))operator(;) + operator(}) + operator(})operator(;) + ident(JAVA_COERCERS)operator(.)ident(put)operator(()type(int)operator(.)ident(class)operator(,) ident(intCoercer)operator(\))operator(;) + ident(JAVA_COERCERS)operator(.)ident(put)operator(()type(Integer)operator(.)ident(class)operator(,) ident(intCoercer)operator(\))operator(;) + operator(}) +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Don Schwartz <schwardo@users.sourceforge.net> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(static) include(org.jruby.util.Numeric.f_expt)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_mul)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_i)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.frexp)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.ldexp)operator(;) + +keyword(import) include(java.text.DecimalFormat)operator(;) +keyword(import) include(java.text.DecimalFormatSymbols)operator(;) +keyword(import) include(java.util.Locale)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) + +comment(/** + * A representation of a float object + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Float)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Numeric)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Precision)delimiter(")>operator(\)) +directive(public) type(class) class(RubyFloat) directive(extends) ident(RubyNumeric) operator({) + + directive(public) directive(static) ident(RubyClass) ident(createFloatClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(floatc) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Float)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNumeric)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setFloat)operator(()ident(floatc)operator(\))operator(;) + ident(floatc)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(FLOAT)operator(;) + ident(floatc)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyFloat)operator(;) + operator(}) + operator(})operator(;) + + ident(floatc)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(undefineMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + ident(floatc)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getPrecision)operator(()operator(\))operator(\))operator(;) + + comment(// Java Doubles are 64 bit long: ) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(ROUNDS)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) integer(1)operator(\))operator(\))operator(;) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(RADIX)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) integer(2)operator(\))operator(\))operator(;) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MANT_DIG)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) integer(53)operator(\))operator(\))operator(;) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(DIG)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) integer(15)operator(\))operator(\))operator(;) + comment(// Double.MAX_EXPONENT since Java 1.6) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MIN_EXP)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) operator(-)integer(1021)operator(\))operator(\))operator(;) + comment(// Double.MAX_EXPONENT since Java 1.6 ) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MAX_EXP)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) integer(1024)operator(\))operator(\))operator(;) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MIN_10_EXP)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) operator(-)integer(307)operator(\))operator(\))operator(;) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MAX_10_EXP)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) integer(308)operator(\))operator(\))operator(;) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MIN)delimiter(")>operator(,) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(runtime)operator(,) type(Double)operator(.)ident(MIN_VALUE)operator(\))operator(\))operator(;) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MAX)delimiter(")>operator(,) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(runtime)operator(,) type(Double)operator(.)ident(MAX_VALUE)operator(\))operator(\))operator(;) + ident(floatc)operator(.)ident(defineConstant)operator(()string<delimiter(")content(EPSILON)delimiter(")>operator(,) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(runtime)operator(,) float(2.2204460492503131e-16)operator(\))operator(\))operator(;) + + ident(floatc)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyFloat)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(floatc)operator(;) + operator(}) + + directive(private) directive(final) type(double) ident(value)operator(;) + + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(FLOAT)operator(;) + operator(}) + + directive(public) ident(RubyFloat)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) float(0.0)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFloat)operator(()ident(Ruby) ident(runtime)operator(,) type(double) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getFloat)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + operator(}) + + directive(public) type(Class)operator(<)operator(?)operator(>) ident(getJavaClass)operator(()operator(\)) operator({) + comment(// this needs to be thought out more along with the changes in RubyFixnum) + comment(// since "to Object" coercion will generally want to produce the same) + comment(// type every time) +comment(// if (value >= Float.MIN_VALUE && value <= Float.MAX_VALUE\) {) +comment(// return float.class;) +comment(// }) + keyword(return) type(double)operator(.)ident(class)operator(;) + operator(}) + + comment(/** Getter for property value. + * @return Value of property value. + */) + directive(public) type(double) ident(getValue)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(.)ident(value)operator(;) + operator(}) + + directive(public) type(double) ident(getDoubleValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + directive(public) type(long) ident(getLongValue)operator(()operator(\)) operator({) + keyword(return) operator(()type(long)operator(\)) ident(value)operator(;) + operator(}) + + directive(public) ident(RubyFloat) ident(convertToFloat)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(protected) type(int) ident(compareValue)operator(()ident(RubyNumeric) ident(other)operator(\)) operator({) + type(double) ident(otherVal) operator(=) ident(other)operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(getValue)operator(()operator(\)) operator(>) ident(otherVal) operator(?) integer(1) operator(:) ident(getValue)operator(()operator(\)) operator(<) ident(otherVal) operator(?) operator(-)integer(1) operator(:) integer(0)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFloat) ident(newFloat)operator(()ident(Ruby) ident(runtime)operator(,) type(double) ident(value)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyFloat)operator(()ident(runtime)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/* ================ + * Instance Methods + * ================ + */) + + comment(/** rb_flo_induced_from + * + */) + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(induced_from)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(number)operator(\)) operator({) + keyword(if) operator(()ident(number) keyword(instanceof) ident(RubyFixnum) operator(||) ident(number) keyword(instanceof) ident(RubyBignum) operator(||) ident(number) keyword(instanceof) ident(RubyRational)operator(\)) operator({) + keyword(return) ident(number)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_F)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(number) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) ident(number)operator(;) + operator(}) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(() + string<delimiter(")content(failed to convert )delimiter(")> operator(+) ident(number)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( into Float)delimiter(")>operator(\))operator(;) + operator(}) + + directive(private) directive(final) directive(static) type(DecimalFormat) ident(FORMAT) operator(=) keyword(new) type(DecimalFormat)operator(()string<delimiter(")content(##############0.0##############)delimiter(")>operator(,) + keyword(new) type(DecimalFormatSymbols)operator(()type(Locale)operator(.)ident(ENGLISH)operator(\))operator(\))operator(;) + + comment(/** flo_to_s + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(if) operator(()type(Double)operator(.)ident(isInfinite)operator(()ident(value)operator(\))operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(<) integer(0) operator(?) string<delimiter(")content(-Infinity)delimiter(")> operator(:) string<delimiter(")content(Infinity)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\))operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) string<delimiter(")content(NaN)delimiter(")>operator(\))operator(;) + operator(}) + + type(String) ident(val) operator(=) string<delimiter(")delimiter(")>operator(+)ident(value)operator(;) + + keyword(if)operator(()ident(val)operator(.)ident(indexOf)operator(()string<delimiter(')content(E)delimiter(')>operator(\)) operator(!=) operator(-)integer(1)operator(\)) operator({) + type(String) ident(v2) operator(=) ident(FORMAT)operator(.)ident(format)operator(()ident(value)operator(\))operator(;) + type(int) ident(ix) operator(=) ident(v2)operator(.)ident(length)operator(()operator(\))operator(-)integer(1)operator(;) + keyword(while)operator(()ident(v2)operator(.)ident(charAt)operator(()ident(ix)operator(\)) operator(==) string<delimiter(')content(0)delimiter(')> operator(&&) ident(v2)operator(.)ident(charAt)operator(()ident(ix)operator(-)integer(1)operator(\)) operator(!=) string<delimiter(')content(.)delimiter(')>operator(\)) operator({) + ident(ix)operator(--)operator(;) + operator(}) + keyword(if)operator(()ident(ix) operator(>) integer(15) operator(||) string<delimiter(")content(0.0)delimiter(")>operator(.)ident(equals)operator(()ident(v2)operator(.)ident(substring)operator(()integer(0)operator(,)ident(ix)operator(+)integer(1)operator(\))operator(\))operator(\)) operator({) + ident(val) operator(=) ident(val)operator(.)ident(replaceFirst)operator(()string<delimiter(")content(E()char(\\\\)content(d\))delimiter(")>operator(,)string<delimiter(")content(e+$1)delimiter(")>operator(\))operator(.)ident(replaceFirst)operator(()string<delimiter(")content(E-)delimiter(")>operator(,)string<delimiter(")content(e-)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(val) operator(=) ident(v2)operator(.)ident(substring)operator(()integer(0)operator(,)ident(ix)operator(+)integer(1)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(val)operator(\))operator(;) + operator(}) + + comment(/** flo_coerce + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(coerce)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(coerce)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(RubyKernel)operator(.)ident(new_float)operator(()local_variable(this)operator(,) ident(other)operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** flo_uminus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-@)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_uminus)operator(()operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(-)ident(value)operator(\))operator(;) + operator(}) + + comment(/** flo_plus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_plus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(+) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_minus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_minus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(-) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_mul + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(*)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_mul)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(() + ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(*) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_div + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(/)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_fdiv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) comment(// don't override Numeric#div !) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(/) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_mod + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(%)delimiter(")>operator(,) string<delimiter(")content(modulo)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_mod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + type(double) ident(y) operator(=) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + comment(// Modelled after c ruby implementation (java /,% not same as ruby\)) + type(double) ident(x) operator(=) ident(value)operator(;) + + type(double) ident(mod) operator(=) type(Math)operator(.)ident(IEEEremainder)operator(()ident(x)operator(,) ident(y)operator(\))operator(;) + keyword(if) operator(()ident(y) operator(*) ident(mod) operator(<) integer(0)operator(\)) operator({) + ident(mod) operator(+=) ident(y)operator(;) + operator(}) + + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(mod)operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_divmod + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(divmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + type(double) ident(y) operator(=) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(x) operator(=) ident(value)operator(;) + + type(double) ident(mod) operator(=) type(Math)operator(.)ident(IEEEremainder)operator(()ident(x)operator(,) ident(y)operator(\))operator(;) + comment(// MRI behavior:) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(mod)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newFloatDomainError)operator(()string<delimiter(")content(NaN)delimiter(")>operator(\))operator(;) + operator(}) + type(double) ident(div) operator(=) type(Math)operator(.)ident(floor)operator(()ident(x) operator(/) ident(y)operator(\))operator(;) + + keyword(if) operator(()ident(y) operator(*) ident(mod) operator(<) integer(0)operator(\)) operator({) + ident(mod) operator(+=) ident(y)operator(;) + operator(}) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(car) operator(=) ident(dbl2num)operator(()ident(runtime)operator(,) ident(div)operator(\))operator(;) + ident(RubyFloat) ident(cdr) operator(=) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(runtime)operator(,) ident(mod)operator(\))operator(;) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(car)operator(,) ident(cdr)operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(divmod)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_pow + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(**)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_pow)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(pow)operator(()ident(value)operator(,) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\)) + operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_eq + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(==) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\)) + operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + keyword(default)operator(:) + comment(// Numeric.equal ) + keyword(return) local_variable(super)operator(.)ident(op_num_equal)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_cmp + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + type(double) ident(b) operator(=) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(dbl_cmp)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(,) ident(b)operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceCmp)operator(()ident(context)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_gt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_gt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + type(double) ident(b) operator(=) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(!)type(Double)operator(.)ident(isNaN)operator(()ident(b)operator(\)) operator(&&) ident(value) operator(>) ident(b)operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceRelOp)operator(()ident(context)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_ge + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_ge)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + type(double) ident(b) operator(=) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(!)type(Double)operator(.)ident(isNaN)operator(()ident(b)operator(\)) operator(&&) ident(value) operator(>=) ident(b)operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceRelOp)operator(()ident(context)operator(,) string<delimiter(")content(>=)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_lt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_lt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + type(double) ident(b) operator(=) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(!)type(Double)operator(.)ident(isNaN)operator(()ident(b)operator(\)) operator(&&) ident(value) operator(<) ident(b)operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceRelOp)operator(()ident(context)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_le + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_le)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + type(double) ident(b) operator(=) operator(()operator(()ident(RubyNumeric)operator(\)) ident(other)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(!)type(Double)operator(.)ident(isNaN)operator(()ident(b)operator(\)) operator(&&) ident(value) operator(<=) ident(b)operator(\))operator(;) + keyword(default)operator(:) + keyword(return) ident(coerceRelOp)operator(()ident(context)operator(,) string<delimiter(")content(<=)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** flo_eql + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(eql_p)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + type(double) ident(b) operator(=) operator(()operator(()ident(RubyFloat)operator(\)) ident(other)operator(\))operator(.)ident(value)operator(;) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\)) operator(||) type(Double)operator(.)ident(isNaN)operator(()ident(b)operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(value) operator(==) ident(b)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** flo_hash + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(hashCode)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(final) type(int) ident(hashCode)operator(()operator(\)) operator({) + type(long) ident(l) operator(=) type(Double)operator(.)ident(doubleToLongBits)operator(()ident(value)operator(\))operator(;) + keyword(return) operator(()type(int)operator(\))operator(()ident(l) operator(^) ident(l) operator(>)operator(>)operator(>) integer(32)operator(\))operator(;) + operator(}) + + comment(/** flo_fo + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_f)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_f)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** flo_abs + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abs)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(abs)operator(()operator(\)) operator({) + keyword(if) operator(()type(Double)operator(.)ident(doubleToLongBits)operator(()ident(value)operator(\)) operator(<) integer(0)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(abs)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** flo_zero_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zero?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(zero_p)operator(()operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(==) float(0.0)operator(\))operator(;) + operator(}) + + comment(/** flo_truncate + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(truncate)delimiter(")>operator(,) string<delimiter(")content(to_i)delimiter(")>operator(,) string<delimiter(")content(to_int)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(truncate)operator(()operator(\)) operator({) + type(double) ident(f) operator(=) ident(value)operator(;) + keyword(if) operator(()ident(f) operator(>) float(0.0)operator(\)) ident(f) operator(=) type(Math)operator(.)ident(floor)operator(()ident(f)operator(\))operator(;) + keyword(if) operator(()ident(f) operator(<) float(0.0)operator(\)) ident(f) operator(=) type(Math)operator(.)ident(ceil)operator(()ident(f)operator(\))operator(;) + + keyword(return) ident(dbl2num)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(f)operator(\))operator(;) + operator(}) + + comment(/** float_to_r, float_decode + * + */) + directive(static) directive(final) type(int) ident(DBL_MANT_DIG) operator(=) integer(53)operator(;) + directive(static) directive(final) type(int) ident(FLT_RADIX) operator(=) integer(2)operator(;) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_r)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(to_r)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(long)type([])ident(exp) operator(=) keyword(new) type(long)operator([)integer(1)operator(])operator(;) + type(double) ident(f) operator(=) ident(frexp)operator(()ident(value)operator(,) ident(exp)operator(\))operator(;) + ident(f) operator(=) ident(ldexp)operator(()ident(f)operator(,) ident(DBL_MANT_DIG)operator(\))operator(;) + type(long) ident(n) operator(=) ident(exp)operator([)integer(0)operator(]) operator(-) ident(DBL_MANT_DIG)operator(;) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(x) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(f_to_i)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newFloat)operator(()ident(f)operator(\))operator(\))operator(,) + ident(f_expt)operator(()ident(context)operator(,) + ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(FLT_RADIX)operator(\))operator(,) + ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(n)operator(\))operator(\))operator(\))operator(;) + keyword(return) ident(x)operator(;) + operator(}) + + comment(/** floor + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(floor)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(floor)operator(()operator(\)) operator({) + keyword(return) ident(dbl2num)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(floor)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + comment(/** flo_ceil + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ceil)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(ceil)operator(()operator(\)) operator({) + keyword(return) ident(dbl2num)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(ceil)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + comment(/** flo_round + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(round)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(round)operator(()operator(\)) operator({) + type(double) ident(f) operator(=) ident(value)operator(;) + keyword(if) operator(()ident(f) operator(>) float(0.0)operator(\)) operator({) + ident(f) operator(=) type(Math)operator(.)ident(floor)operator(()ident(f) operator(+) float(0.5)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(f) operator(<) float(0.0)operator(\)) operator({) + ident(f) operator(=) type(Math)operator(.)ident(ceil)operator(()ident(f) operator(-) float(0.5)operator(\))operator(;) + operator(}) + keyword(return) ident(dbl2num)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(f)operator(\))operator(;) + operator(}) + + comment(/** flo_is_nan_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nan?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(nan_p)operator(()operator(\)) operator({) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + comment(/** flo_is_infinite_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(infinite?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(infinite_p)operator(()operator(\)) operator({) + keyword(if) operator(()type(Double)operator(.)ident(isInfinite)operator(()ident(value)operator(\))operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value) operator(<) integer(0) operator(?) operator(-)integer(1) operator(:) integer(1)operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** flo_is_finite_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(finite?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(finite_p)operator(()operator(\)) operator({) + keyword(if) operator(()type(Double)operator(.)ident(isInfinite)operator(()ident(value)operator(\)) operator(||) type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(marshalTo)operator(()ident(RubyFloat) ident(aFloat)operator(,) ident(MarshalStream) ident(output)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(output)operator(.)ident(registerLinkTarget)operator(()ident(aFloat)operator(\))operator(;) + + type(String) ident(strValue) operator(=) ident(aFloat)operator(.)ident(toString)operator(()operator(\))operator(;) + + keyword(if) operator(()type(Double)operator(.)ident(isInfinite)operator(()ident(aFloat)operator(.)ident(value)operator(\))operator(\)) operator({) + ident(strValue) operator(=) ident(aFloat)operator(.)ident(value) operator(<) integer(0) operator(?) string<delimiter(")content(-inf)delimiter(")> operator(:) string<delimiter(")content(inf)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(aFloat)operator(.)ident(value)operator(\))operator(\)) operator({) + ident(strValue) operator(=) string<delimiter(")content(nan)delimiter(")>operator(;) + operator(}) + ident(output)operator(.)ident(writeString)operator(()ident(strValue)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyFloat) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(RubyFloat) ident(result) operator(=) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(org)operator(.)ident(jruby)operator(.)ident(util)operator(.)ident(Convert)operator(.)ident(byteListToDouble)operator(()ident(input)operator(.)ident(unmarshalString)operator(()operator(\))operator(,)keyword(false)operator(\))operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * GC (Garbage Collection\) Module + * + * Note: Since we rely on Java's memory model we can't provide the + * kind of control over garbage collection that MRI provides. + * + * @author Anders + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(GC)delimiter(")>operator(\)) +directive(public) type(class) class(RubyGC) operator({) + directive(public) directive(static) ident(RubyModule) ident(createGCModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(result) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(GC)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setGC)operator(()ident(result)operator(\))operator(;) + + ident(result)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyGC)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(start)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + type(System)operator(.)ident(gc)operator(()operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) directive(static) ident(IRubyObject) ident(garbage_collect)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + type(System)operator(.)ident(gc)operator(()operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(enable)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(EMPTY_IMPLEMENTATION)operator(,) string<delimiter(")content(GC.enable will not work on JRuby)delimiter(")>operator(,) string<delimiter(")content(GC.enable)delimiter(")>operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(disable)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(EMPTY_IMPLEMENTATION)operator(,) string<delimiter(")content(GC.disable will not work on JRuby)delimiter(")>operator(,) string<delimiter(")content(GC.disable)delimiter(")>operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Tim Azzopardi <tim@tigerfive.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2006 Michael Studman <codehaus@michaelstudman.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.util.io.STDIO)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.Map)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.environment.OSEnvironmentReaderExcepton)operator(;) +keyword(import) include(org.jruby.environment.OSEnvironment)operator(;) +keyword(import) include(org.jruby.internal.runtime.ValueAccessor)operator(;) +keyword(import) include(org.jruby.javasupport.JavaUtil)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Constants)operator(;) +keyword(import) include(org.jruby.runtime.GlobalVariable)operator(;) +keyword(import) include(org.jruby.runtime.IAccessor)operator(;) +keyword(import) include(org.jruby.runtime.ReadonlyGlobalVariable)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.KCode)operator(;) + +comment(/** This class initializes global variables and constants. + * + * @author jpetersen + */) +directive(public) type(class) class(RubyGlobal) operator({) + + comment(/** + * Obligate string-keyed and string-valued hash, used for ENV and ENV_JAVA + * + */) + directive(public) directive(static) type(class) class(StringOnlyRubyHash) directive(extends) ident(RubyHash) operator({) + + directive(public) ident(StringOnlyRubyHash)operator(()ident(Ruby) ident(runtime)operator(,) type(Map) ident(valueMap)operator(,) ident(IRubyObject) ident(defaultValue)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(valueMap)operator(,) ident(defaultValue)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyHash) ident(to_hash)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyHash) ident(hash) operator(=) ident(RubyHash)operator(.)ident(newHash)operator(()ident(runtime)operator(\))operator(;) + ident(hash)operator(.)ident(replace)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) local_variable(this)operator(\))operator(;) + keyword(return) ident(hash)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(key)operator(\)) operator({) + keyword(return) local_variable(super)operator(.)ident(op_aref)operator(()ident(context)operator(,) ident(key)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_aset)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(key)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(key)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( into String)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(value)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\)) operator(&&) operator(!)ident(value)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(value)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( into String)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(value)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) local_variable(super)operator(.)ident(delete)operator(()ident(context)operator(,) ident(key)operator(,) ident(org)operator(.)ident(jruby)operator(.)ident(runtime)operator(.)ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + comment(//return super.aset(getRuntime(\).newString("sadfasdF"\), getRuntime(\).newString("sadfasdF"\)\);) + keyword(return) local_variable(super)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(key)operator(,) string<delimiter(")content(to_str)delimiter(")>operator(\))operator(,) + ident(value)operator(.)ident(isNil)operator(()operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(value)operator(,) string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\))operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(ENV)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(void) ident(createGlobals)operator(()ident(ThreadContext) ident(context)operator(,) ident(Ruby) ident(runtime)operator(\)) operator({) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(TOPLEVEL_BINDING)delimiter(")>operator(,) ident(runtime)operator(.)ident(newBinding)operator(()operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(TRUE)delimiter(")>operator(,) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(FALSE)delimiter(")>operator(,) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(NIL)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + + comment(// define ARGV and $* for this runtime) + ident(RubyArray) ident(argvArray) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + type(String)type([]) ident(argv) operator(=) ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getArgv)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(argv)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(argvArray)operator(.)ident(append)operator(()ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(argv)operator([)ident(i)operator(])operator(.)ident(getBytes)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(ARGV)delimiter(")>operator(,) ident(argvArray)operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(defineReadonly)operator(()string<delimiter(")content($*)delimiter(")>operator(,) keyword(new) ident(ValueAccessor)operator(()ident(argvArray)operator(\))operator(\))operator(;) + + ident(IAccessor) ident(d) operator(=) keyword(new) ident(ValueAccessor)operator(()ident(runtime)operator(.)ident(newString)operator(() + ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(displayedFileName)operator(()operator(\))operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(define)operator(()string<delimiter(")content($PROGRAM_NAME)delimiter(")>operator(,) ident(d)operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(define)operator(()string<delimiter(")content($0)delimiter(")>operator(,) ident(d)operator(\))operator(;) + + comment(// Version information:) + ident(IRubyObject) ident(version) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(Constants)operator(.)ident(RUBY_VERSION)operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(IRubyObject) ident(release) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(Constants)operator(.)ident(COMPILE_DATE)operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(IRubyObject) ident(platform) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(Constants)operator(.)ident(PLATFORM)operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(IRubyObject) ident(engine) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(Constants)operator(.)ident(ENGINE)operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(RUBY_VERSION)delimiter(")>operator(,) ident(version)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(RUBY_PATCHLEVEL)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()ident(Constants)operator(.)ident(RUBY_PATCHLEVEL)operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(RUBY_RELEASE_DATE)delimiter(")>operator(,) ident(release)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(RUBY_PLATFORM)delimiter(")>operator(,) ident(platform)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(RUBY_ENGINE)delimiter(")>operator(,) ident(engine)operator(\))operator(;) + + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(VERSION)delimiter(")>operator(,) ident(version)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(RELEASE_DATE)delimiter(")>operator(,) ident(release)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(PLATFORM)delimiter(")>operator(,) ident(platform)operator(\))operator(;) + + ident(IRubyObject) ident(jrubyVersion) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(Constants)operator(.)ident(VERSION)operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(JRUBY_VERSION)delimiter(")>operator(,) ident(jrubyVersion)operator(\))operator(;) + + ident(GlobalVariable) ident(kcodeGV) operator(=) keyword(new) ident(KCodeGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($KCODE)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(NONE)delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()ident(kcodeGV)operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(GlobalVariable)operator(.)ident(Copy)operator(()ident(runtime)operator(,) string<delimiter(")content($-K)delimiter(")>operator(,) ident(kcodeGV)operator(\))operator(\))operator(;) + ident(IRubyObject) ident(defaultRS) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getRecordSeparator)operator(()operator(\))operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(GlobalVariable) ident(rs) operator(=) keyword(new) ident(StringGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($/)delimiter(")>operator(,) ident(defaultRS)operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()ident(rs)operator(\))operator(;) + ident(runtime)operator(.)ident(setRecordSeparatorVar)operator(()ident(rs)operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(setDefaultSeparator)operator(()ident(defaultRS)operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(StringGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($)char(\\\\)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(StringGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($,)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LineNumberGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($.)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LastlineGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($_)delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LastExitStatusVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($?)delimiter(")>operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(ErrorInfoGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($!)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(NonEffectiveGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($=)delimiter(")>operator(,) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(\))operator(\))operator(;) + + keyword(if)operator(()ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getInputFieldSeparator)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(GlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($;)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(GlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($;)delimiter(")>operator(,) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getInputFieldSeparator)operator(()operator(\))operator(,) integer(0)operator(\))operator(\))operator(\))operator(;) + operator(}) + + type(Boolean) ident(verbose) operator(=) ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getVerbose)operator(()operator(\))operator(;) + ident(IRubyObject) ident(verboseValue) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(verbose) operator(==) keyword(null)operator(\)) operator({) + ident(verboseValue) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(verbose) operator(==) type(Boolean)operator(.)ident(TRUE)operator(\)) operator({) + ident(verboseValue) operator(=) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(verboseValue) operator(=) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(VerboseGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($VERBOSE)delimiter(")>operator(,) ident(verboseValue)operator(\))operator(\))operator(;) + + ident(IRubyObject) ident(debug) operator(=) ident(runtime)operator(.)ident(newBoolean)operator(()ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(isDebug)operator(()operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(DebugGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($DEBUG)delimiter(")>operator(,) ident(debug)operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(DebugGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($-d)delimiter(")>operator(,) ident(debug)operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(SafeGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($SAFE)delimiter(")>operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(BacktraceGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($@)delimiter(")>operator(\))operator(\))operator(;) + + ident(IRubyObject) ident(stdin) operator(=) keyword(new) ident(RubyIO)operator(()ident(runtime)operator(,) ident(STDIO)operator(.)ident(IN)operator(\))operator(;) + ident(IRubyObject) ident(stdout) operator(=) keyword(new) ident(RubyIO)operator(()ident(runtime)operator(,) ident(STDIO)operator(.)ident(OUT)operator(\))operator(;) + ident(IRubyObject) ident(stderr) operator(=) keyword(new) ident(RubyIO)operator(()ident(runtime)operator(,) ident(STDIO)operator(.)ident(ERR)operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(InputGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($stdin)delimiter(")>operator(,) ident(stdin)operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(OutputGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($stdout)delimiter(")>operator(,) ident(stdout)operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(alias)operator(()string<delimiter(")content($>)delimiter(")>operator(,) string<delimiter(")content($stdout)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(alias)operator(()string<delimiter(")content($defout)delimiter(")>operator(,) string<delimiter(")content($stdout)delimiter(")>operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(OutputGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($stderr)delimiter(")>operator(,) ident(stderr)operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(alias)operator(()string<delimiter(")content($deferr)delimiter(")>operator(,) string<delimiter(")content($stderr)delimiter(")>operator(\))operator(;) + + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(STDIN)delimiter(")>operator(,) ident(stdin)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(STDOUT)delimiter(")>operator(,) ident(stdout)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(STDERR)delimiter(")>operator(,) ident(stderr)operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LoadedFeatures)operator(()ident(runtime)operator(,) string<delimiter(")content($)char(\\")delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LoadedFeatures)operator(()ident(runtime)operator(,) string<delimiter(")content($LOADED_FEATURES)delimiter(")>operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LoadPath)operator(()ident(runtime)operator(,) string<delimiter(")content($:)delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LoadPath)operator(()ident(runtime)operator(,) string<delimiter(")content($-I)delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LoadPath)operator(()ident(runtime)operator(,) string<delimiter(")content($LOAD_PATH)delimiter(")>operator(\))operator(\))operator(;) + + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(MatchMatchGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($&)delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(PreMatchGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($`)delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(PostMatchGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($')delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(LastMatchGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($+)delimiter(")>operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(defineVariable)operator(()keyword(new) ident(BackRefGlobalVariable)operator(()ident(runtime)operator(,) string<delimiter(")content($~)delimiter(")>operator(\))operator(\))operator(;) + + comment(// On platforms without a c-library accessable through JNA, getpid will return hashCode ) + comment(// as $$ used to. Using $$ to kill processes could take down many runtimes, but by basing) + comment(// $$ on getpid(\) where available, we have the same semantics as MRI.) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(defineReadonly)operator(()string<delimiter(")content($$)delimiter(")>operator(,) keyword(new) ident(ValueAccessor)operator(()ident(runtime)operator(.)ident(newFixnum)operator(()ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getpid)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + + comment(// after defn of $stderr as the call may produce warnings) + ident(defineGlobalEnvConstants)operator(()ident(runtime)operator(\))operator(;) + + comment(// Fixme: Do we need the check or does Main.java not call this...they should consolidate ) + keyword(if) operator(()ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($*)delimiter(")>operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(defineReadonly)operator(()string<delimiter(")content($*)delimiter(")>operator(,) keyword(new) ident(ValueAccessor)operator(()ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(defineReadonly)operator(()string<delimiter(")content($-p)delimiter(")>operator(,) + keyword(new) ident(ValueAccessor)operator(()ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(isAssumePrinting)operator(()operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(defineReadonly)operator(()string<delimiter(")content($-n)delimiter(")>operator(,) + keyword(new) ident(ValueAccessor)operator(()ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(isAssumeLoop)operator(()operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(defineReadonly)operator(()string<delimiter(")content($-a)delimiter(")>operator(,) + keyword(new) ident(ValueAccessor)operator(()ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(isSplit)operator(()operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(defineReadonly)operator(()string<delimiter(")content($-l)delimiter(")>operator(,) + keyword(new) ident(ValueAccessor)operator(()ident(runtime)operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(isProcessLineEnds)operator(()operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + + comment(// ARGF, $< object) + ident(RubyArgsFile)operator(.)ident(initArgsFile)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(defineGlobalEnvConstants)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + + type(Map) ident(environmentVariableMap) operator(=) keyword(null)operator(;) + ident(OSEnvironment) ident(environment) operator(=) keyword(new) ident(OSEnvironment)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(environmentVariableMap) operator(=) ident(environment)operator(.)ident(getEnvironmentVariableMap)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(OSEnvironmentReaderExcepton) ident(e)operator(\)) operator({) + comment(// If the environment variables are not accessible shouldn't terminate ) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(MISCELLANEOUS)operator(,) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(environmentVariableMap) operator(==) keyword(null)operator(\)) operator({) + comment(// if the environment variables can't be obtained, define an empty ENV) + ident(environmentVariableMap) operator(=) keyword(new) type(HashMap)operator(()operator(\))operator(;) + operator(}) + + ident(StringOnlyRubyHash) ident(h1) operator(=) keyword(new) ident(StringOnlyRubyHash)operator(()ident(runtime)operator(,) + ident(environmentVariableMap)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + ident(h1)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineAnnotatedMethods)operator(()ident(StringOnlyRubyHash)operator(.)ident(class)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(ENV)delimiter(")>operator(,) ident(h1)operator(\))operator(;) + + comment(// Define System.getProperties(\) in ENV_JAVA) + type(Map) ident(systemProps) operator(=) ident(environment)operator(.)ident(getSystemPropertiesMap)operator(()ident(runtime)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(ENV_JAVA)delimiter(")>operator(,) keyword(new) ident(StringOnlyRubyHash)operator(() + ident(runtime)operator(,) ident(systemProps)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(\))operator(;) + + operator(}) + + directive(private) directive(static) type(class) class(NonEffectiveGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(NonEffectiveGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(INEFFECTIVE_GLOBAL)operator(,) string<delimiter(")content(warning: variable )delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content( is no longer effective; ignored)delimiter(")>operator(,) ident(name)operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(INEFFECTIVE_GLOBAL)operator(,) string<delimiter(")content(warning: variable )delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content( is no longer effective)delimiter(")>operator(,) ident(name)operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(LastExitStatusVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(LastExitStatusVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + ident(IRubyObject) ident(lastExitStatus) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getLastExitStatus)operator(()operator(\))operator(;) + keyword(return) ident(lastExitStatus) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(lastExitStatus)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(lastExitStatus)operator(\)) operator({) + ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(setLastExitStatus)operator(()ident(lastExitStatus)operator(\))operator(;) + + keyword(return) ident(lastExitStatus)operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(MatchMatchGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(MatchMatchGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(last_match)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(PreMatchGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(PreMatchGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(match_pre)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(PostMatchGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(PostMatchGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(match_post)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(LastMatchGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(LastMatchGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(match_last)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(BackRefGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(BackRefGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(getBackref)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + ident(RuntimeHelpers)operator(.)ident(setBackref)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + + comment(// Accessor methods.) + + directive(private) directive(static) type(class) class(LineNumberGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(LineNumberGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(RubyFixnum) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + ident(RubyArgsFile)operator(.)ident(setCurrentLineNumber)operator(()ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($<)delimiter(")>operator(\))operator(,)ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(value)operator(\))operator(\))operator(;) + keyword(return) local_variable(super)operator(.)ident(set)operator(()ident(value)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(ErrorInfoGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(ErrorInfoGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) keyword(null)operator(\))operator(;) + ident(set)operator(()ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(value)operator(.)ident(isNil)operator(()operator(\)) operator(&&) + operator(!)ident(runtime)operator(.)ident(getException)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(value)operator(\)) operator(&&) + operator(!)operator(()ident(JavaUtil)operator(.)ident(isJavaObject)operator(()ident(value)operator(\)) operator(&&) ident(JavaUtil)operator(.)ident(unwrapJavaObject)operator(()ident(value)operator(\)) keyword(instanceof) type(Exception)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(assigning non-exception to $!)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(setErrorInfo)operator(()ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getErrorInfo)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(// FIXME: move out of this class!) + directive(public) directive(static) type(class) class(StringGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(StringGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(value)operator(.)ident(isNil)operator(()operator(\)) operator(&&) operator(!) operator(()ident(value) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(value of )delimiter(")> operator(+) ident(name)operator(()operator(\)) operator(+) string<delimiter(")content( must be a String)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) local_variable(super)operator(.)ident(set)operator(()ident(value)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(class) class(KCodeGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(KCodeGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getKCode)operator(()operator(\))operator(.)ident(kcode)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + ident(runtime)operator(.)ident(setKCode)operator(()ident(KCode)operator(.)ident(create)operator(()ident(runtime)operator(,) ident(value)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(SafeGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(SafeGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) +comment(// int level = RubyNumeric.fix2int(value\);) +comment(// if (level < runtime.getSafeLevel(\)\) {) +comment(// throw runtime.newSecurityError("tried to downgrade safe level from " + ) +comment(// runtime.getSafeLevel(\) + " to " + level\);) +comment(// }) +comment(// runtime.setSafeLevel(level\);) + comment(// thread.setSafeLevel(level\);) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(SAFE_NOT_SUPPORTED)operator(,) string<delimiter(")content(SAFE levels are not supported in JRuby)delimiter(")>operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(VerboseGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(VerboseGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(initialValue)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(initialValue)operator(\))operator(;) + ident(set)operator(()ident(initialValue)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getVerbose)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(newValue)operator(\)) operator({) + keyword(if) operator(()ident(newValue)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(setVerbose)operator(()ident(newValue)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(runtime)operator(.)ident(setVerbose)operator(()ident(runtime)operator(.)ident(newBoolean)operator(()ident(newValue)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(newValue)operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(DebugGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(DebugGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(initialValue)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(initialValue)operator(\))operator(;) + ident(set)operator(()ident(initialValue)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getDebug)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(newValue)operator(\)) operator({) + keyword(if) operator(()ident(newValue)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(setDebug)operator(()ident(newValue)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(runtime)operator(.)ident(setDebug)operator(()ident(runtime)operator(.)ident(newBoolean)operator(()ident(newValue)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(newValue)operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(BacktraceGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(BacktraceGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + ident(IRubyObject) ident(errorInfo) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($!)delimiter(")>operator(\))operator(;) + ident(IRubyObject) ident(backtrace) operator(=) ident(errorInfo)operator(.)ident(isNil)operator(()operator(\)) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(errorInfo)operator(.)ident(callMethod)operator(()ident(errorInfo)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(backtrace)delimiter(")>operator(\))operator(;) + comment(//$@ returns nil if $!.backtrace is not an array) + keyword(if) operator(()operator(!)operator(()ident(backtrace) keyword(instanceof) ident(RubyArray)operator(\))operator(\)) operator({) + ident(backtrace) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(backtrace)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($!)delimiter(")>operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content($! not set.)delimiter(")>operator(\))operator(;) + operator(}) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($!)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(value)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(set_backtrace)delimiter(")>operator(,) ident(value)operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(LastlineGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(LastlineGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(getLastLine)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + ident(RuntimeHelpers)operator(.)ident(setLastLine)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(InputGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(InputGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(value) operator(==) ident(get)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + keyword(return) local_variable(super)operator(.)ident(set)operator(()ident(value)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(OutputGlobalVariable) directive(extends) ident(GlobalVariable) operator({) + directive(public) ident(OutputGlobalVariable)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(value) operator(==) ident(get)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + keyword(if) operator(()ident(value) keyword(instanceof) ident(RubyIO)operator(\)) operator({) + ident(RubyIO) ident(io) operator(=) operator(()ident(RubyIO)operator(\))ident(value)operator(;) + + comment(// HACK: in order to have stdout/err act like ttys and flush always,) + comment(// we set anything assigned to stdout/stderr to sync) + ident(io)operator(.)ident(getHandler)operator(()operator(\))operator(.)ident(setSync)operator(()keyword(true)operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(value)operator(.)ident(respondsTo)operator(()string<delimiter(")content(write)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()ident(name)operator(()operator(\)) operator(+) string<delimiter(")content( must have write method, )delimiter(")> operator(+) + ident(value)operator(.)ident(getType)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) local_variable(super)operator(.)ident(set)operator(()ident(value)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(LoadPath) directive(extends) ident(ReadonlyGlobalVariable) operator({) + directive(public) ident(LoadPath)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.GlobalVariable#get(\) + */) + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(getLoadPath)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(class) class(LoadedFeatures) directive(extends) ident(ReadonlyGlobalVariable) operator({) + directive(public) ident(LoadedFeatures)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(name)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.GlobalVariable#get(\) + */) + annotation(@Override) + directive(public) ident(IRubyObject) ident(get)operator(()operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(getLoadedFeatures)operator(()operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2006 Ola Bini <Ola.Bini@ki.se> + * Copyright (C\) 2006 Tim Azzopardi <tim@tigerfive.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2007 MenTaLguY <mental@rydia.net> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.util.AbstractCollection)operator(;) +keyword(import) include(java.util.AbstractSet)operator(;) +keyword(import) include(java.util.Collection)operator(;) +keyword(import) include(java.util.Iterator)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(java.util.NoSuchElementException)operator(;) +keyword(import) include(java.util.Set)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.javasupport.JavaUtil)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) + +comment(// Design overview:) +comment(//) +comment(// RubyHash is implemented as hash table with a singly-linked list of) +comment(// RubyHash.RubyHashEntry objects for each bucket. RubyHashEntry objects) +comment(// are also kept in a doubly-linked list which reflects their insertion) +comment(// order and is used for iteration. For simplicity, this latter list is) +comment(// circular; a dummy RubyHashEntry, RubyHash.head, is used to mark the) +comment(// ends of the list.) +comment(//) +comment(// When an entry is removed from the table, it is also removed from the) +comment(// doubly-linked list. However, while the reference to the previous) +comment(// RubyHashEntry is cleared (to mark the entry as dead\), the reference) +comment(// to the next RubyHashEntry is preserved so that iterators are not) +comment(// invalidated: any iterator with a reference to a dead entry can climb) +comment(// back up into the list of live entries by chasing next references until) +comment(// it finds a live entry (or head\).) +comment(//) +comment(// Ordinarily, this scheme would require O(N\) time to clear a hash (since) +comment(// each RubyHashEntry would need to be visited and unlinked from the) +comment(// iteration list\), but RubyHash also maintains a generation count. Every) +comment(// time the hash is cleared, the doubly-linked list is simply discarded and) +comment(// the generation count incremented. Iterators check to see whether the) +comment(// generation count has changed; if it has, they reset themselves back to) +comment(// the new start of the list.) +comment(//) +comment(// This design means that iterators are never invalidated by changes to the) +comment(// hashtable, and they do not need to modify the structure during their) +comment(// lifecycle.) +comment(//) + +comment(/** Implementation of the Hash class. + * + * Concurrency: no synchronization is required among readers, but + * all users must synchronize externally with writers. + * + */) +annotation(@JRubyClass)operator(()ident(name) operator(=) string<delimiter(")content(Hash)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Enumerable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyHash) directive(extends) ident(RubyObject) directive(implements) type(Map) operator({) + + directive(public) directive(static) ident(RubyClass) ident(createHashClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(hashc) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Hash)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(HASH_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setHash)operator(()ident(hashc)operator(\))operator(;) + ident(hashc)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(HASH)operator(;) + ident(hashc)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyHash)operator(;) + operator(}) + operator(})operator(;) + + ident(hashc)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + + ident(hashc)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyHash)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(hashc)operator(;) + operator(}) + + directive(private) directive(final) directive(static) ident(ObjectAllocator) ident(HASH_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyHash)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(HASH)operator(;) + operator(}) + + comment(/** rb_hash_s_create + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(create)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(klass) operator(=) operator(()ident(RubyClass)operator(\)) ident(recv)operator(;) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyHash) ident(hash)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(TypeConverter)operator(.)ident(convertToTypeWithCheck)operator(() + ident(args)operator([)integer(0)operator(])operator(,) ident(runtime)operator(.)ident(getHash)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_HASH)operator(,) string<delimiter(")content(to_hash)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(RubyHash) ident(otherHash) operator(=) operator(()ident(RubyHash)operator(\)) ident(tmp)operator(;) + keyword(return) keyword(new) ident(RubyHash)operator(()ident(runtime)operator(,) ident(klass)operator(,) ident(otherHash)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()operator(()ident(args)operator(.)ident(length) operator(&) integer(1)operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(odd number of args for Hash)delimiter(")>operator(\))operator(;) + operator(}) + + ident(hash) operator(=) operator(()ident(RubyHash)operator(\))ident(klass)operator(.)ident(allocate)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(+=)integer(2)operator(\)) ident(hash)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(,) ident(args)operator([)ident(i)operator(+)integer(1)operator(])operator(\))operator(;) + + keyword(return) ident(hash)operator(;) + operator(}) + + comment(/** rb_hash_new + * + */) + directive(public) directive(static) directive(final) ident(RubyHash) ident(newHash)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyHash)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_new + * + */) + directive(public) directive(static) directive(final) ident(RubyHash) ident(newHash)operator(()ident(Ruby) ident(runtime)operator(,) type(Map) ident(valueMap)operator(,) ident(IRubyObject) ident(defaultValue)operator(\)) operator({) + ident(assert) ident(defaultValue) operator(!=) keyword(null)operator(;) + + keyword(return) keyword(new) ident(RubyHash)operator(()ident(runtime)operator(,) ident(valueMap)operator(,) ident(defaultValue)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyHashEntry)type([]) ident(table)operator(;) + directive(private) type(int) ident(size) operator(=) integer(0)operator(;) + directive(private) type(int) ident(threshold)operator(;) + + directive(private) directive(static) directive(final) type(int) ident(PROCDEFAULT_HASH_F) operator(=) integer(1) operator(<)operator(<) integer(10)operator(;) + + directive(private) ident(IRubyObject) ident(ifNone)operator(;) + + directive(private) ident(RubyHash)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(,) ident(RubyHash) ident(other)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + local_variable(this)operator(.)ident(ifNone) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(threshold) operator(=) ident(INITIAL_THRESHOLD)operator(;) + ident(table) operator(=) ident(other)operator(.)ident(internalCopyTable)operator(()ident(head)operator(\))operator(;) + ident(size) operator(=) ident(other)operator(.)ident(size)operator(;) + operator(}) + + directive(public) ident(RubyHash)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + local_variable(this)operator(.)ident(ifNone) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(alloc)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(RubyHash)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RubyHash)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(defaultValue)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getHash)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(ifNone) operator(=) ident(defaultValue)operator(;) + ident(alloc)operator(()operator(\))operator(;) + operator(}) + + comment(/* + * Constructor for internal usage (mainly for Array#|, Array#&, Array#- and Array#uniq\) + * it doesn't initialize ifNone field + */) + ident(RubyHash)operator(()ident(Ruby) ident(runtime)operator(,) type(boolean) ident(objectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getHash)operator(()operator(\))operator(,) ident(objectSpace)operator(\))operator(;) + ident(alloc)operator(()operator(\))operator(;) + operator(}) + + comment(// TODO should this be deprecated ? (to be efficient, internals should deal with RubyHash directly\)) + directive(public) ident(RubyHash)operator(()ident(Ruby) ident(runtime)operator(,) type(Map) ident(valueMap)operator(,) ident(IRubyObject) ident(defaultValue)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getHash)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(ifNone) operator(=) ident(defaultValue)operator(;) + ident(alloc)operator(()operator(\))operator(;) + + keyword(for) operator(()type(Iterator) ident(iter) operator(=) ident(valueMap)operator(.)ident(entrySet)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;)ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(Map)operator(.)ident(Entry) ident(e) operator(=) operator(()type(Map)operator(.)ident(Entry)operator(\))ident(iter)operator(.)ident(next)operator(()operator(\))operator(;) + ident(internalPut)operator(()operator(()ident(IRubyObject)operator(\))ident(e)operator(.)ident(getKey)operator(()operator(\))operator(,) operator(()ident(IRubyObject)operator(\))ident(e)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(final) type(void) ident(alloc)operator(()operator(\)) operator({) + ident(threshold) operator(=) ident(INITIAL_THRESHOLD)operator(;) + ident(generation)operator(++)operator(;) + ident(head)operator(.)ident(nextAdded) operator(=) ident(head)operator(.)ident(prevAdded) operator(=) ident(head)operator(;) + ident(table) operator(=) keyword(new) ident(RubyHashEntry)operator([)ident(MRI_HASH_RESIZE) operator(?) ident(MRI_INITIAL_CAPACITY) operator(:) ident(JAVASOFT_INITIAL_CAPACITY)operator(])operator(;) + operator(}) + + comment(/* ============================ + * Here are hash internals + * (This could be extracted to a separate class but it's not too large though\) + * ============================ + */) + + directive(private) directive(static) directive(final) type(int) ident(MRI_PRIMES)type([]) operator(=) operator({) + integer(8) operator(+) integer(3)operator(,) integer(16) operator(+) integer(3)operator(,) integer(32) operator(+) integer(5)operator(,) integer(64) operator(+) integer(3)operator(,) integer(128) operator(+) integer(3)operator(,) integer(256) operator(+) integer(27)operator(,) integer(512) operator(+) integer(9)operator(,) integer(1024) operator(+) integer(9)operator(,) integer(2048) operator(+) integer(5)operator(,) integer(4096) operator(+) integer(3)operator(,) + integer(8192) operator(+) integer(27)operator(,) integer(16384) operator(+) integer(43)operator(,) integer(32768) operator(+) integer(3)operator(,) integer(65536) operator(+) integer(45)operator(,) integer(131072) operator(+) integer(29)operator(,) integer(262144) operator(+) integer(3)operator(,) integer(524288) operator(+) integer(21)operator(,) integer(1048576) operator(+) integer(7)operator(,) + integer(2097152) operator(+) integer(17)operator(,) integer(4194304) operator(+) integer(15)operator(,) integer(8388608) operator(+) integer(9)operator(,) integer(16777216) operator(+) integer(43)operator(,) integer(33554432) operator(+) integer(35)operator(,) integer(67108864) operator(+) integer(15)operator(,) + integer(134217728) operator(+) integer(29)operator(,) integer(268435456) operator(+) integer(3)operator(,) integer(536870912) operator(+) integer(11)operator(,) integer(1073741824) operator(+) integer(85)operator(,) integer(0) + operator(})operator(;) + + directive(private) directive(static) directive(final) type(int) ident(JAVASOFT_INITIAL_CAPACITY) operator(=) integer(8)operator(;) comment(// 16 ?) + directive(private) directive(static) directive(final) type(int) ident(MRI_INITIAL_CAPACITY) operator(=) ident(MRI_PRIMES)operator([)integer(0)operator(])operator(;) + + directive(private) directive(static) directive(final) type(int) ident(INITIAL_THRESHOLD) operator(=) ident(JAVASOFT_INITIAL_CAPACITY) operator(-) operator(()ident(JAVASOFT_INITIAL_CAPACITY) operator(>)operator(>) integer(2)operator(\))operator(;) + directive(private) directive(static) directive(final) type(int) ident(MAXIMUM_CAPACITY) operator(=) integer(1) operator(<)operator(<) integer(30)operator(;) + + directive(private) directive(static) directive(final) ident(RubyHashEntry) ident(NO_ENTRY) operator(=) keyword(new) ident(RubyHashEntry)operator(()operator(\))operator(;) + directive(private) type(int) ident(generation) operator(=) integer(0)operator(;) comment(// generation count for O(1\) clears) + directive(private) directive(final) ident(RubyHashEntry) ident(head) operator(=) keyword(new) ident(RubyHashEntry)operator(()operator(\))operator(;) + operator({) ident(head)operator(.)ident(prevAdded) operator(=) ident(head)operator(.)ident(nextAdded) operator(=) ident(head)operator(;) operator(}) + + directive(static) directive(final) type(class) class(RubyHashEntry) directive(implements) type(Map)operator(.)ident(Entry) operator({) + directive(private) ident(IRubyObject) ident(key)operator(;) + directive(private) ident(IRubyObject) ident(value)operator(;) + directive(private) ident(RubyHashEntry) ident(next)operator(;) + directive(private) ident(RubyHashEntry) ident(prevAdded)operator(;) + directive(private) ident(RubyHashEntry) ident(nextAdded)operator(;) + directive(private) type(int) ident(hash)operator(;) + + ident(RubyHashEntry)operator(()operator(\)) operator({) + ident(key) operator(=) ident(NEVER)operator(;) + operator(}) + + ident(RubyHashEntry)operator(()type(int) ident(h)operator(,) ident(IRubyObject) ident(k)operator(,) ident(IRubyObject) ident(v)operator(,) ident(RubyHashEntry) ident(e)operator(,) ident(RubyHashEntry) ident(head)operator(\)) operator({) + ident(key) operator(=) ident(k)operator(;) ident(value) operator(=) ident(v)operator(;) ident(next) operator(=) ident(e)operator(;) ident(hash) operator(=) ident(h)operator(;) + ident(prevAdded) operator(=) ident(head)operator(.)ident(prevAdded)operator(;) + ident(nextAdded) operator(=) ident(head)operator(;) + ident(nextAdded)operator(.)ident(prevAdded) operator(=) local_variable(this)operator(;) + ident(prevAdded)operator(.)ident(nextAdded) operator(=) local_variable(this)operator(;) + operator(}) + + directive(public) type(void) ident(detach)operator(()operator(\)) operator({) + keyword(if) operator(()ident(prevAdded) operator(!=) keyword(null)operator(\)) operator({) + ident(prevAdded)operator(.)ident(nextAdded) operator(=) ident(nextAdded)operator(;) + ident(nextAdded)operator(.)ident(prevAdded) operator(=) ident(prevAdded)operator(;) + ident(prevAdded) operator(=) keyword(null)operator(;) + operator(}) + operator(}) + + directive(public) type(boolean) ident(isLive)operator(()operator(\)) operator({) + keyword(return) ident(prevAdded) operator(!=) keyword(null)operator(;) + operator(}) + + directive(public) type(Object) ident(getKey)operator(()operator(\)) operator({) + keyword(return) ident(key)operator(;) + operator(}) + directive(public) type(Object) ident(getJavaifiedKey)operator(()operator(\))operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(key)operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(getValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + directive(public) type(Object) ident(getJavaifiedValue)operator(()operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(value)operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(setValue)operator(()type(Object) ident(value)operator(\)) operator({) + ident(IRubyObject) ident(oldValue) operator(=) local_variable(this)operator(.)ident(value)operator(;) + keyword(if) operator(()ident(value) keyword(instanceof) ident(IRubyObject)operator(\)) operator({) + local_variable(this)operator(.)ident(value) operator(=) operator(()ident(IRubyObject)operator(\))ident(value)operator(;) + operator(}) keyword(else) operator({) + keyword(throw) keyword(new) type(UnsupportedOperationException)operator(()string<delimiter(")content(directEntrySet(\) doesn't support setValue for non IRubyObject instance entries, convert them manually or use entrySet(\) instead)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(oldValue)operator(;) + operator(}) + + directive(public) type(boolean) ident(equals)operator(()type(Object) ident(other)operator(\))operator({) + keyword(if)operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyHashEntry)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + ident(RubyHashEntry) ident(otherEntry) operator(=) operator(()ident(RubyHashEntry)operator(\))ident(other)operator(;) + keyword(if)operator(()ident(key) operator(==) ident(otherEntry)operator(.)ident(key) operator(||) ident(key)operator(.)ident(eql)operator(()ident(otherEntry)operator(.)ident(key)operator(\))operator(\))operator({) + keyword(if)operator(()ident(value) operator(==) ident(otherEntry)operator(.)ident(value) operator(||) ident(value)operator(.)ident(equals)operator(()ident(otherEntry)operator(.)ident(value)operator(\))operator(\)) keyword(return) keyword(true)operator(;) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) type(int) ident(hashCode)operator(()operator(\))operator({) + keyword(return) ident(key)operator(.)ident(hashCode)operator(()operator(\)) operator(^) ident(value)operator(.)ident(hashCode)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(int) ident(JavaSoftHashValue)operator(()type(int) ident(h)operator(\)) operator({) + ident(h) operator(^=) operator(()ident(h) operator(>)operator(>)operator(>) integer(20)operator(\)) operator(^) operator(()ident(h) operator(>)operator(>)operator(>) integer(12)operator(\))operator(;) + keyword(return) ident(h) operator(^) operator(()ident(h) operator(>)operator(>)operator(>) integer(7)operator(\)) operator(^) operator(()ident(h) operator(>)operator(>)operator(>) integer(4)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(int) ident(JavaSoftBucketIndex)operator(()directive(final) type(int) ident(h)operator(,) directive(final) type(int) ident(length)operator(\)) operator({) + keyword(return) ident(h) operator(&) operator(()ident(length) operator(-) integer(1)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(int) ident(MRIHashValue)operator(()type(int) ident(h)operator(\)) operator({) + keyword(return) ident(h) operator(&) ident(HASH_SIGN_BIT_MASK)operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(int) ident(HASH_SIGN_BIT_MASK) operator(=) operator(~)operator(()integer(1) operator(<)operator(<) integer(31)operator(\))operator(;) + directive(private) directive(static) type(int) ident(MRIBucketIndex)operator(()directive(final) type(int) ident(h)operator(,) directive(final) type(int) ident(length)operator(\)) operator({) + keyword(return) operator(()ident(h) operator(%) ident(length)operator(\))operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(resize)operator(()type(int) ident(newCapacity)operator(\)) operator({) + directive(final) ident(RubyHashEntry)type([]) ident(oldTable) operator(=) ident(table)operator(;) + directive(final) ident(RubyHashEntry)type([]) ident(newTable) operator(=) keyword(new) ident(RubyHashEntry)operator([)ident(newCapacity)operator(])operator(;) + keyword(for) operator(()type(int) ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) ident(oldTable)operator(.)ident(length)operator(;) ident(j)operator(++)operator(\)) operator({) + ident(RubyHashEntry) ident(entry) operator(=) ident(oldTable)operator([)ident(j)operator(])operator(;) + ident(oldTable)operator([)ident(j)operator(]) operator(=) keyword(null)operator(;) + keyword(while) operator(()ident(entry) operator(!=) keyword(null)operator(\)) operator({) + ident(RubyHashEntry) ident(next) operator(=) ident(entry)operator(.)ident(next)operator(;) + type(int) ident(i) operator(=) ident(bucketIndex)operator(()ident(entry)operator(.)ident(hash)operator(,) ident(newCapacity)operator(\))operator(;) + ident(entry)operator(.)ident(next) operator(=) ident(newTable)operator([)ident(i)operator(])operator(;) + ident(newTable)operator([)ident(i)operator(]) operator(=) ident(entry)operator(;) + ident(entry) operator(=) ident(next)operator(;) + operator(}) + operator(}) + ident(table) operator(=) ident(newTable)operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(JavaSoftCheckResize)operator(()operator(\)) operator({) + keyword(if) operator(()ident(size) operator(>) ident(threshold)operator(\)) operator({) + type(int) ident(oldCapacity) operator(=) ident(table)operator(.)ident(length)operator(;) + keyword(if) operator(()ident(oldCapacity) operator(==) ident(MAXIMUM_CAPACITY)operator(\)) operator({) + ident(threshold) operator(=) type(Integer)operator(.)ident(MAX_VALUE)operator(;) + keyword(return)operator(;) + operator(}) + type(int) ident(newCapacity) operator(=) ident(table)operator(.)ident(length) operator(<)operator(<) integer(1)operator(;) + ident(resize)operator(()ident(newCapacity)operator(\))operator(;) + ident(threshold) operator(=) ident(newCapacity) operator(-) operator(()ident(newCapacity) operator(>)operator(>) integer(2)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) directive(final) type(int) ident(MIN_CAPA) operator(=) integer(8)operator(;) + directive(private) directive(static) directive(final) type(int) ident(ST_DEFAULT_MAX_DENSITY) operator(=) integer(5)operator(;) + directive(private) directive(final) type(void) ident(MRICheckResize)operator(()operator(\)) operator({) + keyword(if) operator(()ident(size) operator(/) ident(table)operator(.)ident(length) operator(>) ident(ST_DEFAULT_MAX_DENSITY)operator(\)) operator({) + type(int) ident(forSize) operator(=) ident(table)operator(.)ident(length) operator(+) integer(1)operator(;) comment(// size + 1;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(,) ident(newCapacity) operator(=) ident(MIN_CAPA)operator(;) ident(i) operator(<) ident(MRI_PRIMES)operator(.)ident(length)operator(;) ident(i)operator(++)operator(,) ident(newCapacity) operator(<)operator(<=) integer(1)operator(\)) operator({) + keyword(if) operator(()ident(newCapacity) operator(>) ident(forSize)operator(\)) operator({) + ident(resize)operator(()ident(MRI_PRIMES)operator([)ident(i)operator(])operator(\))operator(;) + keyword(return)operator(;) + operator(}) + operator(}) + keyword(return)operator(;) comment(// suboptimal for large hashes (> 1073741824 + 85 entries\) not very likely to happen) + operator(}) + operator(}) + comment(// ------------------------------) + directive(private) directive(static) type(boolean) ident(MRI_HASH) operator(=) keyword(true)operator(;) + directive(private) directive(static) type(boolean) ident(MRI_HASH_RESIZE) operator(=) keyword(true)operator(;) + + directive(private) directive(static) type(int) ident(hashValue)operator(()directive(final) type(int) ident(h)operator(\)) operator({) + keyword(return) ident(MRI_HASH) operator(?) ident(MRIHashValue)operator(()ident(h)operator(\)) operator(:) ident(JavaSoftHashValue)operator(()ident(h)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(int) ident(bucketIndex)operator(()directive(final) type(int) ident(h)operator(,) directive(final) type(int) ident(length)operator(\)) operator({) + keyword(return) ident(MRI_HASH) operator(?) ident(MRIBucketIndex)operator(()ident(h)operator(,) ident(length)operator(\)) operator(:) ident(JavaSoftBucketIndex)operator(()ident(h)operator(,) ident(length)operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(checkResize)operator(()operator(\)) operator({) + keyword(if) operator(()ident(MRI_HASH_RESIZE)operator(\)) ident(MRICheckResize)operator(()operator(\))operator(;) keyword(else) ident(JavaSoftCheckResize)operator(()operator(\))operator(;) + operator(}) + comment(// ------------------------------) + directive(public) directive(static) type(long) ident(collisions) operator(=) integer(0)operator(;) + + comment(// put implementation) + + directive(private) directive(final) type(void) ident(internalPut)operator(()directive(final) ident(IRubyObject) ident(key)operator(,) directive(final) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(internalPut)operator(()ident(key)operator(,) ident(value)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(internalPut)operator(()directive(final) ident(IRubyObject) ident(key)operator(,) directive(final) ident(IRubyObject) ident(value)operator(,) directive(final) type(boolean) ident(checkForExisting)operator(\)) operator({) + ident(checkResize)operator(()operator(\))operator(;) + directive(final) type(int) ident(hash) operator(=) ident(hashValue)operator(()ident(key)operator(.)ident(hashCode)operator(()operator(\))operator(\))operator(;) + directive(final) type(int) ident(i) operator(=) ident(bucketIndex)operator(()ident(hash)operator(,) ident(table)operator(.)ident(length)operator(\))operator(;) + + comment(// if (table[i] != null\) collisions++;) + + keyword(if) operator(()ident(checkForExisting)operator(\)) operator({) + keyword(for) operator(()ident(RubyHashEntry) ident(entry) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(entry) operator(!=) keyword(null)operator(;) ident(entry) operator(=) ident(entry)operator(.)ident(next)operator(\)) operator({) + ident(IRubyObject) ident(k)operator(;) + keyword(if) operator(()ident(entry)operator(.)ident(hash) operator(==) ident(hash) operator(&&) operator(()operator(()ident(k) operator(=) ident(entry)operator(.)ident(key)operator(\)) operator(==) ident(key) operator(||) ident(key)operator(.)ident(eql)operator(()ident(k)operator(\))operator(\))operator(\)) operator({) + ident(entry)operator(.)ident(value) operator(=) ident(value)operator(;) + keyword(return)operator(;) + operator(}) + operator(}) + operator(}) + + ident(table)operator([)ident(i)operator(]) operator(=) keyword(new) ident(RubyHashEntry)operator(()ident(hash)operator(,) ident(key)operator(,) ident(value)operator(,) ident(table)operator([)ident(i)operator(])operator(,) ident(head)operator(\))operator(;) + ident(size)operator(++)operator(;) + operator(}) + + comment(// get implementation) + + directive(private) directive(final) ident(IRubyObject) ident(internalGet)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) comment(// specialized for value) + keyword(return) ident(internalGetEntry)operator(()ident(key)operator(\))operator(.)ident(value)operator(;) + operator(}) + + directive(private) directive(final) ident(RubyHashEntry) ident(internalGetEntry)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) + directive(final) type(int) ident(hash) operator(=) ident(hashValue)operator(()ident(key)operator(.)ident(hashCode)operator(()operator(\))operator(\))operator(;) + keyword(for) operator(()ident(RubyHashEntry) ident(entry) operator(=) ident(table)operator([)ident(bucketIndex)operator(()ident(hash)operator(,) ident(table)operator(.)ident(length)operator(\))operator(])operator(;) ident(entry) operator(!=) keyword(null)operator(;) ident(entry) operator(=) ident(entry)operator(.)ident(next)operator(\)) operator({) + ident(IRubyObject) ident(k)operator(;) + keyword(if) operator(()ident(entry)operator(.)ident(hash) operator(==) ident(hash) operator(&&) operator(()operator(()ident(k) operator(=) ident(entry)operator(.)ident(key)operator(\)) operator(==) ident(key) operator(||) ident(key)operator(.)ident(eql)operator(()ident(k)operator(\))operator(\))operator(\)) keyword(return) ident(entry)operator(;) + operator(}) + keyword(return) ident(NO_ENTRY)operator(;) + operator(}) + + comment(// delete implementation) + + + directive(private) directive(final) ident(RubyHashEntry) ident(internalDelete)operator(()directive(final) ident(IRubyObject) ident(key)operator(\)) operator({) + keyword(return) ident(internalDelete)operator(()ident(hashValue)operator(()ident(key)operator(.)ident(hashCode)operator(()operator(\))operator(\))operator(,) ident(MATCH_KEY)operator(,) ident(key)operator(\))operator(;) + operator(}) + + directive(private) directive(final) ident(RubyHashEntry) ident(internalDeleteEntry)operator(()directive(final) ident(RubyHashEntry) ident(entry)operator(\)) operator({) + comment(// n.b. we need to recompute the hash in case the key object was modified) + keyword(return) ident(internalDelete)operator(()ident(hashValue)operator(()ident(entry)operator(.)ident(key)operator(.)ident(hashCode)operator(()operator(\))operator(\))operator(,) ident(MATCH_ENTRY)operator(,) ident(entry)operator(\))operator(;) + operator(}) + + directive(private) directive(final) ident(RubyHashEntry) ident(internalDelete)operator(()directive(final) type(int) ident(hash)operator(,) directive(final) ident(EntryMatchType) ident(matchType)operator(,) directive(final) type(Object) ident(obj)operator(\)) operator({) + directive(final) type(int) ident(i) operator(=) ident(bucketIndex)operator(()ident(hash)operator(,) ident(table)operator(.)ident(length)operator(\))operator(;) + + ident(RubyHashEntry) ident(entry) operator(=) ident(table)operator([)ident(i)operator(])operator(;) + keyword(if) operator(()ident(entry) operator(!=) keyword(null)operator(\)) operator({) + ident(RubyHashEntry) ident(prior) operator(=) keyword(null)operator(;) + keyword(for) operator(()operator(;) ident(entry) operator(!=) keyword(null)operator(;) ident(prior) operator(=) ident(entry)operator(,) ident(entry) operator(=) ident(entry)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(entry)operator(.)ident(hash) operator(==) ident(hash) operator(&&) ident(matchType)operator(.)ident(matches)operator(()ident(entry)operator(,) ident(obj)operator(\))operator(\)) operator({) + keyword(if) operator(()ident(prior) operator(!=) keyword(null)operator(\)) operator({) + ident(prior)operator(.)ident(next) operator(=) ident(entry)operator(.)ident(next)operator(;) + operator(}) keyword(else) operator({) + ident(table)operator([)ident(i)operator(]) operator(=) ident(entry)operator(.)ident(next)operator(;) + operator(}) + ident(entry)operator(.)ident(detach)operator(()operator(\))operator(;) + ident(size)operator(--)operator(;) + keyword(return) ident(entry)operator(;) + operator(}) + operator(}) + operator(}) + + keyword(return) ident(NO_ENTRY)operator(;) + operator(}) + + directive(private) directive(static) directive(abstract) type(class) class(EntryMatchType) operator({) + directive(public) directive(abstract) type(boolean) ident(matches)operator(()directive(final) ident(RubyHashEntry) ident(entry)operator(,) directive(final) type(Object) ident(obj)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) ident(EntryMatchType) ident(MATCH_KEY) operator(=) keyword(new) ident(EntryMatchType)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(matches)operator(()directive(final) ident(RubyHashEntry) ident(entry)operator(,) directive(final) type(Object) ident(obj)operator(\)) operator({) + directive(final) ident(IRubyObject) ident(key) operator(=) ident(entry)operator(.)ident(key)operator(;) + keyword(return) ident(obj) operator(==) ident(key) operator(||) operator(()operator(()operator(()ident(IRubyObject)operator(\))ident(obj)operator(\))operator(.)ident(eql)operator(()ident(key)operator(\))operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(static) directive(final) ident(EntryMatchType) ident(MATCH_ENTRY) operator(=) keyword(new) ident(EntryMatchType)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(matches)operator(()directive(final) ident(RubyHashEntry) ident(entry)operator(,) directive(final) type(Object) ident(obj)operator(\)) operator({) + keyword(return) ident(entry)operator(.)ident(equals)operator(()ident(obj)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(final) ident(RubyHashEntry)type([]) ident(internalCopyTable)operator(()ident(RubyHashEntry) ident(destHead)operator(\)) operator({) + ident(RubyHashEntry)type([])ident(newTable) operator(=) keyword(new) ident(RubyHashEntry)operator([)ident(table)operator(.)ident(length)operator(])operator(;) + + keyword(for) operator(()ident(RubyHashEntry) ident(entry) operator(=) ident(head)operator(.)ident(nextAdded)operator(;) ident(entry) operator(!=) ident(head)operator(;) ident(entry) operator(=) ident(entry)operator(.)ident(nextAdded)operator(\)) operator({) + type(int) ident(i) operator(=) ident(bucketIndex)operator(()ident(entry)operator(.)ident(hash)operator(,) ident(table)operator(.)ident(length)operator(\))operator(;) + ident(newTable)operator([)ident(i)operator(]) operator(=) keyword(new) ident(RubyHashEntry)operator(()ident(entry)operator(.)ident(hash)operator(,) ident(entry)operator(.)ident(key)operator(,) ident(entry)operator(.)ident(value)operator(,) ident(newTable)operator([)ident(i)operator(])operator(,) ident(destHead)operator(\))operator(;) + operator(}) + keyword(return) ident(newTable)operator(;) + operator(}) + + directive(public) directive(static) directive(abstract) type(class) class(Visitor) operator({) + directive(public) directive(abstract) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(visitAll)operator(()ident(Visitor) ident(visitor)operator(\)) operator({) + type(int) ident(startGeneration) operator(=) ident(generation)operator(;) + keyword(for) operator(()ident(RubyHashEntry) ident(entry) operator(=) ident(head)operator(.)ident(nextAdded)operator(;) ident(entry) operator(!=) ident(head)operator(;) ident(entry) operator(=) ident(entry)operator(.)ident(nextAdded)operator(\)) operator({) + keyword(if) operator(()ident(startGeneration) operator(!=) ident(generation)operator(\)) operator({) + ident(startGeneration) operator(=) ident(generation)operator(;) + ident(entry) operator(=) ident(head)operator(.)ident(nextAdded)operator(;) + keyword(if) operator(()ident(entry) operator(==) ident(head)operator(\)) keyword(break)operator(;) + operator(}) + keyword(if) operator(()ident(entry)operator(.)ident(isLive)operator(()operator(\))operator(\)) ident(visitor)operator(.)ident(visit)operator(()ident(entry)operator(.)ident(key)operator(,) ident(entry)operator(.)ident(value)operator(\))operator(;) + operator(}) + operator(}) + + comment(/* ============================ + * End of hash internals + * ============================ + */) + + comment(/* ================ + * Instance Methods + * ================ + */) + + comment(/** rb_hash_initialize + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\))operator(;) + ident(ifNone) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newProc)operator(()ident(Block)operator(.)ident(Type)operator(.)ident(PROC)operator(,) ident(block)operator(\))operator(;) + ident(flags) operator(|=) ident(PROCDEFAULT_HASH_F)operator(;) + operator(}) keyword(else) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) ident(ifNone) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_default + * + */) + annotation(@Deprecated) + directive(public) ident(IRubyObject) ident(default_value_get)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) keyword(return) ident(default_value_get)operator(()ident(context)operator(\))operator(;) + keyword(case) integer(1)operator(:) keyword(return) ident(default_value_get)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(1)operator(\))operator(;) + operator(}) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(default)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(default_value_get)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()operator(()ident(flags) operator(&) ident(PROCDEFAULT_HASH_F)operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(ifNone)operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(default)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(default_value_get)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()operator(()ident(flags) operator(&) ident(PROCDEFAULT_HASH_F)operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(ifNone)operator(,) string<delimiter(")content(call)delimiter(")>operator(,) local_variable(this)operator(,) ident(arg)operator(\))operator(;) + operator(}) + keyword(return) ident(ifNone)operator(;) + operator(}) + + comment(/** rb_hash_set_default + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(default=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(default_value_set)operator(()directive(final) ident(IRubyObject) ident(defaultValue)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + ident(ifNone) operator(=) ident(defaultValue)operator(;) + ident(flags) operator(&=) operator(~)ident(PROCDEFAULT_HASH_F)operator(;) + + keyword(return) ident(ifNone)operator(;) + operator(}) + + comment(/** rb_hash_default_proc + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(default_proc)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(default_proc)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(PROCDEFAULT_HASH_F)operator(\)) operator(!=) integer(0) operator(?) ident(ifNone) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_hash_modify + * + */) + directive(public) type(void) ident(modify)operator(()operator(\)) operator({) + ident(testFrozen)operator(()string<delimiter(")content(hash)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\)) operator(&&) ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't modify hash)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** inspect_hash + * + */) + directive(private) ident(IRubyObject) ident(inspectHash)operator(()directive(final) ident(ThreadContext) ident(context)operator(\)) operator({) + directive(final) ident(ByteList) ident(buffer) operator(=) keyword(new) ident(ByteList)operator(()operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content({)delimiter(')>operator(\))operator(;) + directive(final) type(boolean)type([]) ident(firstEntry) operator(=) keyword(new) type(boolean)operator([)integer(1)operator(])operator(;) + + ident(firstEntry)operator([)integer(0)operator(]) operator(=) keyword(true)operator(;) + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(firstEntry)operator([)integer(0)operator(])operator(\)) ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content(,)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content( )delimiter(')>operator(\))operator(;) + + ident(buffer)operator(.)ident(append)operator(()ident(inspect)operator(()ident(context)operator(,) ident(key)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content(=)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(>)delimiter(')>operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()ident(inspect)operator(()ident(context)operator(,) ident(value)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(firstEntry)operator([)integer(0)operator(]) operator(=) keyword(false)operator(;) + operator(}) + operator(})operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content(})delimiter(')>operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buffer)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_inspect + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(size) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content({})delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(isInspecting)operator(()local_variable(this)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content({...})delimiter(")>operator(\))operator(;) + + keyword(try) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(registerInspecting)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(inspectHash)operator(()ident(context)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(unregisterInspecting)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_hash_size + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(size)delimiter(")>operator(,) string<delimiter(")content(length)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyFixnum) ident(rb_size)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(size)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_empty_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(empty?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(empty_p)operator(()operator(\)) operator({) + keyword(return) ident(size) operator(==) integer(0) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_hash_to_a + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_a)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(to_a)operator(()operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(result) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(size)operator(\))operator(;) + + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(key)operator(,) ident(value)operator(\))operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + ident(result)operator(.)ident(setTaint)operator(()ident(isTaint)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_hash_to_s & to_s_hash + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(isInspecting)operator(()local_variable(this)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content({...})delimiter(")>operator(\))operator(;) + keyword(try) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(registerInspecting)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(to_a)operator(()operator(\))operator(.)ident(to_s)operator(()operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(unregisterInspecting)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_hash_rehash + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rehash)delimiter(")>operator(\)) + directive(public) ident(RubyHash) ident(rehash)operator(()operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + directive(final) ident(RubyHashEntry)type([]) ident(oldTable) operator(=) ident(table)operator(;) + directive(final) ident(RubyHashEntry)type([]) ident(newTable) operator(=) keyword(new) ident(RubyHashEntry)operator([)ident(oldTable)operator(.)ident(length)operator(])operator(;) + keyword(for) operator(()type(int) ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) ident(oldTable)operator(.)ident(length)operator(;) ident(j)operator(++)operator(\)) operator({) + ident(RubyHashEntry) ident(entry) operator(=) ident(oldTable)operator([)ident(j)operator(])operator(;) + ident(oldTable)operator([)ident(j)operator(]) operator(=) keyword(null)operator(;) + keyword(while) operator(()ident(entry) operator(!=) keyword(null)operator(\)) operator({) + ident(RubyHashEntry) ident(next) operator(=) ident(entry)operator(.)ident(next)operator(;) + ident(entry)operator(.)ident(hash) operator(=) ident(entry)operator(.)ident(key)operator(.)ident(hashCode)operator(()operator(\))operator(;) comment(// update the hash value) + type(int) ident(i) operator(=) ident(bucketIndex)operator(()ident(entry)operator(.)ident(hash)operator(,) ident(newTable)operator(.)ident(length)operator(\))operator(;) + ident(entry)operator(.)ident(next) operator(=) ident(newTable)operator([)ident(i)operator(])operator(;) + ident(newTable)operator([)ident(i)operator(]) operator(=) ident(entry)operator(;) + ident(entry) operator(=) ident(next)operator(;) + operator(}) + operator(}) + ident(table) operator(=) ident(newTable)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_to_hash + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_hash)delimiter(")>operator(\)) + directive(public) ident(RubyHash) ident(to_hash)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) ident(RubyHash) ident(convertToHash)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) directive(final) type(void) ident(fastASet)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(internalPut)operator(()ident(key)operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) ident(IRubyObject) ident(op_aset)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(return) ident(op_aset)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(key)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_aset + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content([]=)delimiter(")>operator(,) string<delimiter(")content(store)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(op_aset)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)operator(()ident(key) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + ident(internalPut)operator(()ident(key)operator(,) ident(value)operator(\))operator(;) + operator(}) keyword(else) operator({) + directive(final) ident(RubyHashEntry) ident(entry) operator(=) ident(internalGetEntry)operator(()ident(key)operator(\))operator(;) + keyword(if) operator(()ident(entry) operator(!=) ident(NO_ENTRY)operator(\)) operator({) + ident(entry)operator(.)ident(value) operator(=) ident(value)operator(;) + operator(}) keyword(else) operator({) + ident(RubyString) ident(realKey) operator(=) operator(()ident(RubyString)operator(\))ident(key)operator(;) + + keyword(if) operator(()operator(!)ident(realKey)operator(.)ident(isFrozen)operator(()operator(\))operator(\)) operator({) + ident(realKey) operator(=) ident(realKey)operator(.)ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(realKey)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(\))operator(;)operator(;) + ident(realKey)operator(.)ident(setFrozen)operator(()keyword(true)operator(\))operator(;) + operator(}) + + ident(internalPut)operator(()ident(realKey)operator(,) ident(value)operator(,) keyword(false)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(value)operator(;) + operator(}) + + comment(/** + * Note: this is included as a compatibility measure for AR-JDBC + * @deprecated use RubyHash.op_aset instead + */) + directive(public) ident(IRubyObject) ident(aset)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(return) ident(op_aset)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(key)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** + * Note: this is included as a compatibility measure for Mongrel+JRuby + * @deprecated use RubyHash.op_aref instead + */) + directive(public) ident(IRubyObject) ident(aref)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) + keyword(return) ident(op_aref)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(key)operator(\))operator(;) + operator(}) + + directive(public) directive(final) ident(IRubyObject) ident(fastARef)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) comment(// retuns null when not found to avoid unnecessary getRuntime(\).getNil(\) call) + keyword(return) ident(internalGet)operator(()ident(key)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_aref + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(key)operator(\)) operator({) + ident(IRubyObject) ident(value)operator(;) + keyword(return) operator(()operator(()ident(value) operator(=) ident(internalGet)operator(()ident(key)operator(\))operator(\)) operator(==) keyword(null)operator(\)) operator(?) ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(DEFAULT)operator(,) string<delimiter(")content(default)delimiter(")>operator(,) ident(key)operator(\)) operator(:) ident(value)operator(;) + operator(}) + + comment(/** rb_hash_fetch + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fetch)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(fetch)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(2) operator(&&) ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(BLOCK_BEATS_DEFAULT_VALUE)operator(,) string<delimiter(")content(block supersedes default value argument)delimiter(")>operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(internalGet)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(key not found)delimiter(")>operator(\))operator(;) + keyword(return) ident(args)operator([)integer(1)operator(])operator(;) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + comment(/** rb_hash_has_key + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(has_key?)delimiter(")>operator(,) string<delimiter(")content(key?)delimiter(")>operator(,) string<delimiter(")content(include?)delimiter(")>operator(,) string<delimiter(")content(member?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(has_key_p)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) + keyword(return) ident(internalGetEntry)operator(()ident(key)operator(\)) operator(==) ident(NO_ENTRY) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(class) class(Found) directive(extends) type(RuntimeException) operator({)operator(}) + + directive(private) type(boolean) ident(hasValue)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(IRubyObject) ident(expected)operator(\)) operator({) + keyword(try) operator({) + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(value)operator(,) ident(expected)operator(\))operator(\)) operator({) + keyword(throw) keyword(new) ident(Found)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(})operator(\))operator(;) + keyword(return) keyword(false)operator(;) + operator(}) keyword(catch) operator(()ident(Found) ident(found)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + + comment(/** rb_hash_has_value + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(has_value?)delimiter(")>operator(,) string<delimiter(")content(value?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(has_value_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(expected)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(hasValue)operator(()ident(context)operator(,) ident(expected)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_hash_each + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyHash) ident(each)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + comment(// rb_assoc_new equivalent) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(key)operator(,) ident(value)operator(\))operator(,) keyword(null)operator(,) keyword(null)operator(,) keyword(false)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_each_pair + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_pair)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyHash) ident(each_pair)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + comment(// rb_yield_values(2,...\) equivalent) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(key)operator(,) ident(value)operator(\))operator(,) keyword(null)operator(,) keyword(null)operator(,) keyword(true)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_each_value + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_value)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyHash) ident(each_value)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(value)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_each_key + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_key)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyHash) ident(each_key)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(key)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_sort + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sort)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(sort)operator(()ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(to_a)operator(()operator(\))operator(.)ident(sort_bang)operator(()ident(block)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(class) class(FoundKey) directive(extends) type(RuntimeException) operator({) + directive(public) ident(IRubyObject) ident(key)operator(;) + ident(FoundKey)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) + local_variable(super)operator(()operator(\))operator(;) + local_variable(this)operator(.)ident(key) operator(=) ident(key)operator(;) + operator(}) + operator(}) + + comment(/** rb_hash_index + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(index)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(index)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(expected)operator(\)) operator({) + ident(IRubyObject) ident(key) operator(=) ident(internalIndex)operator(()ident(context)operator(,) ident(expected)operator(\))operator(;) + keyword(if) operator(()ident(key) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(key)operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(IRubyObject) ident(internalIndex)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(IRubyObject) ident(expected)operator(\)) operator({) + keyword(try) operator({) + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(value)operator(,) ident(expected)operator(\))operator(\)) operator({) + keyword(throw) keyword(new) ident(FoundKey)operator(()ident(key)operator(\))operator(;) + operator(}) + operator(}) + operator(})operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) keyword(catch) operator(()ident(FoundKey) ident(found)operator(\)) operator({) + keyword(return) ident(found)operator(.)ident(key)operator(;) + operator(}) + operator(}) + + comment(/** rb_hash_indexes + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(indexes)delimiter(")>operator(,) string<delimiter(")content(indices)delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(indices)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(indices)operator(\)) operator({) + keyword(return) ident(values_at)operator(()ident(context)operator(,) ident(indices)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_keys + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(keys)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(keys)operator(()operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyArray) ident(keys) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(size)operator(\))operator(;) + + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(keys)operator(.)ident(append)operator(()ident(key)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(keys)operator(;) + operator(}) + + comment(/** rb_hash_values + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(values)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(rb_values)operator(()operator(\)) operator({) + directive(final) ident(RubyArray) ident(values) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(size)operator(\))operator(;) + + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(values)operator(.)ident(append)operator(()ident(value)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(values)operator(;) + operator(}) + + comment(/** rb_hash_equal + * + */) + + directive(private) directive(static) directive(final) type(boolean) ident(EQUAL_CHECK_DEFAULT_VALUE) operator(=) keyword(false)operator(;) + + directive(private) directive(static) type(class) class(Mismatch) directive(extends) type(RuntimeException) operator({)operator(}) + + annotation(@Override) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyHash)operator(\))operator(\)) operator({) + keyword(if) operator(()ident(other)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_hash)delimiter(")>operator(\)) operator(&&) ident(equalInternal)operator(()ident(context)operator(,) ident(other)operator(,) local_variable(this)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + directive(final) ident(RubyHash) ident(otherHash) operator(=) operator(()ident(RubyHash)operator(\))ident(other)operator(;) + keyword(if) operator(()ident(size) operator(!=) ident(otherHash)operator(.)ident(size)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(EQUAL_CHECK_DEFAULT_VALUE)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(equalInternal)operator(()ident(context)operator(,) ident(ifNone)operator(,) ident(otherHash)operator(.)ident(ifNone)operator(\)) operator(&&) + operator(()ident(flags) operator(&) ident(PROCDEFAULT_HASH_F)operator(\)) operator(!=) operator(()ident(otherHash)operator(.)ident(flags) operator(&) ident(PROCDEFAULT_HASH_F)operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(IRubyObject) ident(otherValue) operator(=) ident(otherHash)operator(.)ident(internalGet)operator(()ident(key)operator(\))operator(;) + keyword(if) operator(()ident(otherValue) operator(==) keyword(null) operator(||) operator(!)ident(equalInternal)operator(()ident(context)operator(,) ident(value)operator(,) ident(otherValue)operator(\))operator(\)) keyword(throw) keyword(new) ident(Mismatch)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(Mismatch) ident(e)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_hash_shift + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(shift)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(shift)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + ident(RubyHashEntry) ident(entry) operator(=) ident(head)operator(.)ident(nextAdded)operator(;) + keyword(if) operator(()ident(entry) operator(!=) ident(head)operator(\)) operator({) + ident(RubyArray) ident(result) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(entry)operator(.)ident(key)operator(,) ident(entry)operator(.)ident(value)operator(\))operator(;) + ident(internalDeleteEntry)operator(()ident(entry)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + keyword(if) operator(()operator(()ident(flags) operator(&) ident(PROCDEFAULT_HASH_F)operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(ifNone)operator(,) string<delimiter(")content(call)delimiter(")>operator(,) local_variable(this)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(ifNone)operator(;) + operator(}) + operator(}) + + directive(public) directive(final) type(boolean) ident(fastDelete)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) + keyword(return) ident(internalDelete)operator(()ident(key)operator(\)) operator(!=) ident(NO_ENTRY)operator(;) + operator(}) + + comment(/** rb_hash_delete + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(delete)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(delete)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(key)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + directive(final) ident(RubyHashEntry) ident(entry) operator(=) ident(internalDelete)operator(()ident(key)operator(\))operator(;) + keyword(if) operator(()ident(entry) operator(!=) ident(NO_ENTRY)operator(\)) keyword(return) ident(entry)operator(.)ident(value)operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(key)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_hash_select + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(select)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(select)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(RubyArray) ident(result) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()operator(\))operator(;) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newArray)operator(()ident(key)operator(,) ident(value)operator(\))operator(,) keyword(null)operator(,) keyword(null)operator(,) keyword(true)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newArray)operator(()ident(key)operator(,) ident(value)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_hash_delete_if + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(delete_if)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyHash) ident(delete_if)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyHash) ident(self) operator(=) local_variable(this)operator(;) + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(key)operator(,) ident(value)operator(\))operator(,) keyword(null)operator(,) keyword(null)operator(,) keyword(true)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(self)operator(.)ident(delete)operator(()ident(context)operator(,) ident(key)operator(,) ident(block)operator(\))operator(;) + operator(}) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_reject + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reject)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyHash) ident(reject)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyHash)operator(\))ident(dup)operator(()operator(\))operator(\))operator(.)ident(delete_if)operator(()ident(context)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_reject_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reject!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(reject_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(int) ident(n) operator(=) ident(size)operator(;) + ident(delete_if)operator(()ident(context)operator(,) ident(block)operator(\))operator(;) + keyword(if) operator(()ident(n) operator(==) ident(size)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_clear + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(clear)delimiter(")>operator(\)) + directive(public) ident(RubyHash) ident(rb_clear)operator(()operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(size) operator(>) integer(0)operator(\)) operator({) + ident(alloc)operator(()operator(\))operator(;) + ident(size) operator(=) integer(0)operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_invert + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(invert)delimiter(")>operator(\)) + directive(public) ident(RubyHash) ident(invert)operator(()directive(final) ident(ThreadContext) ident(context)operator(\)) operator({) + directive(final) ident(RubyHash) ident(result) operator(=) ident(newHash)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(result)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(value)operator(,) ident(key)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_hash_update + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(merge!)delimiter(")>operator(,) string<delimiter(")content(update)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyHash) ident(merge_bang)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(IRubyObject) ident(other)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyHash) ident(otherHash) operator(=) ident(other)operator(.)ident(convertToHash)operator(()operator(\))operator(;) + directive(final) ident(RubyHash) ident(self) operator(=) local_variable(this)operator(;) + ident(otherHash)operator(.)ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(existing) operator(=) ident(self)operator(.)ident(internalGet)operator(()ident(key)operator(\))operator(;) + keyword(if) operator(()ident(existing) operator(!=) keyword(null)operator(\)) + ident(value) operator(=) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyArray)operator(.)ident(newArrayNoCopy)operator(()ident(runtime)operator(,) keyword(new) ident(IRubyObject)type([])operator({)ident(key)operator(,) ident(existing)operator(,) ident(value)operator(})operator(\))operator(\))operator(;) + operator(}) + ident(self)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(key)operator(,) ident(value)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_merge + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(merge)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyHash) ident(merge)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyHash)operator(\))ident(dup)operator(()operator(\))operator(\))operator(.)ident(merge_bang)operator(()ident(context)operator(,) ident(other)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_replace + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(RubyHash) ident(initialize_copy)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(replace)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_hash_replace + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(replace)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyHash) ident(replace)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + directive(final) ident(RubyHash) ident(otherHash) operator(=) ident(other)operator(.)ident(convertToHash)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(otherHash)operator(\)) keyword(return) local_variable(this)operator(;) + + ident(rb_clear)operator(()operator(\))operator(;) + + directive(final) ident(RubyHash) ident(self) operator(=) local_variable(this)operator(;) + ident(otherHash)operator(.)ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(self)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(key)operator(,) ident(value)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + ident(ifNone) operator(=) ident(otherHash)operator(.)ident(ifNone)operator(;) + + keyword(if) operator(()operator(()ident(otherHash)operator(.)ident(flags) operator(&) ident(PROCDEFAULT_HASH_F)operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(flags) operator(|=) ident(PROCDEFAULT_HASH_F)operator(;) + operator(}) keyword(else) operator({) + ident(flags) operator(&=) operator(~)ident(PROCDEFAULT_HASH_F)operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_hash_values_at + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(values_at)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyArray) ident(values_at)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyArray) ident(result) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(op_aref)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + directive(public) type(boolean) ident(hasDefaultProc)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(PROCDEFAULT_HASH_F)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getIfNone)operator(()operator(\))operator({) + keyword(return) ident(ifNone)operator(;) + operator(}) + + directive(private) directive(static) type(class) class(VisitorIOException) directive(extends) type(RuntimeException) operator({) + ident(VisitorIOException)operator(()type(Throwable) ident(cause)operator(\)) operator({) + local_variable(super)operator(()ident(cause)operator(\))operator(;) + operator(}) + operator(}) + + comment(// FIXME: Total hack to get flash in Rails marshalling/unmarshalling in session ok...We need) + comment(// to totally change marshalling to work with overridden core classes.) + directive(public) directive(static) type(void) ident(marshalTo)operator(()directive(final) ident(RubyHash) ident(hash)operator(,) directive(final) ident(MarshalStream) ident(output)operator(\)) directive(throws) type(IOException) operator({) + ident(output)operator(.)ident(registerLinkTarget)operator(()ident(hash)operator(\))operator(;) + ident(output)operator(.)ident(writeInt)operator(()ident(hash)operator(.)ident(size)operator(\))operator(;) + keyword(try) operator({) + ident(hash)operator(.)ident(visitAll)operator(()keyword(new) ident(Visitor)operator(()operator(\)) operator({) + directive(public) type(void) ident(visit)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(try) operator({) + ident(output)operator(.)ident(dumpObject)operator(()ident(key)operator(\))operator(;) + ident(output)operator(.)ident(dumpObject)operator(()ident(value)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) keyword(new) ident(VisitorIOException)operator(()ident(e)operator(\))operator(;) + operator(}) + operator(}) + operator(})operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(VisitorIOException) ident(e)operator(\)) operator({) + keyword(throw) operator(()type(IOException)operator(\))ident(e)operator(.)ident(getCause)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(hash)operator(.)ident(ifNone)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(output)operator(.)ident(dumpObject)operator(()ident(hash)operator(.)ident(ifNone)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyHash) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(,) type(boolean) ident(defaultValue)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyHash) ident(result) operator(=) ident(newHash)operator(()ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + type(int) ident(size) operator(=) ident(input)operator(.)ident(unmarshalInt)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(size)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(input)operator(.)ident(unmarshalObject)operator(()operator(\))operator(,) ident(input)operator(.)ident(unmarshalObject)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(defaultValue)operator(\)) ident(result)operator(.)ident(default_value_set)operator(()ident(input)operator(.)ident(unmarshalObject)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + directive(public) type(Class) ident(getJavaClass)operator(()operator(\)) operator({) + keyword(return) type(Map)operator(.)ident(class)operator(;) + operator(}) + + comment(// Satisfy java.util.Set interface (for Java integration\)) + + directive(public) type(int) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(size)operator(;) + operator(}) + + directive(public) type(boolean) ident(isEmpty)operator(()operator(\)) operator({) + keyword(return) ident(size) operator(==) integer(0)operator(;) + operator(}) + + directive(public) type(boolean) ident(containsKey)operator(()type(Object) ident(key)operator(\)) operator({) + keyword(return) ident(internalGet)operator(()ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(key)operator(\))operator(\)) operator(!=) keyword(null)operator(;) + operator(}) + + directive(public) type(boolean) ident(containsValue)operator(()type(Object) ident(value)operator(\)) operator({) + keyword(return) ident(hasValue)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(get)operator(()type(Object) ident(key)operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(internalGet)operator(()ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(key)operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(put)operator(()type(Object) ident(key)operator(,) type(Object) ident(value)operator(\)) operator({) + ident(internalPut)operator(()ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(key)operator(\))operator(,) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(\))operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) + + directive(public) type(Object) ident(remove)operator(()type(Object) ident(key)operator(\)) operator({) + ident(IRubyObject) ident(rubyKey) operator(=) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(key)operator(\))operator(;) + keyword(return) ident(internalDelete)operator(()ident(rubyKey)operator(\))operator(.)ident(value)operator(;) + operator(}) + + directive(public) type(void) ident(putAll)operator(()type(Map) ident(map)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(for) operator(()type(Iterator) ident(iter) operator(=) ident(map)operator(.)ident(keySet)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(Object) ident(key) operator(=) ident(iter)operator(.)ident(next)operator(()operator(\))operator(;) + ident(internalPut)operator(()ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(runtime)operator(,) ident(key)operator(\))operator(,) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(runtime)operator(,) ident(map)operator(.)ident(get)operator(()ident(key)operator(\))operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(clear)operator(()operator(\)) operator({) + ident(rb_clear)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(equals)operator(()type(Object) ident(other)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyHash)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) keyword(true)operator(;) + keyword(return) ident(op_equal)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) operator(()ident(RubyHash)operator(\))ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(?) keyword(true) operator(:) keyword(false)operator(;) + operator(}) + + directive(public) type(Set) ident(keySet)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(BaseSet)operator(()ident(KEY_VIEW)operator(\))operator(;) + operator(}) + + directive(public) type(Set) ident(directKeySet)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(BaseSet)operator(()ident(DIRECT_KEY_VIEW)operator(\))operator(;) + operator(}) + + directive(public) type(Collection) ident(values)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(BaseCollection)operator(()ident(VALUE_VIEW)operator(\))operator(;) + operator(}) + + directive(public) type(Collection) ident(directValues)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(BaseCollection)operator(()ident(DIRECT_VALUE_VIEW)operator(\))operator(;) + operator(}) + + directive(public) type(Set) ident(entrySet)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(BaseSet)operator(()ident(ENTRY_VIEW)operator(\))operator(;) + operator(}) + + directive(public) type(Set) ident(directEntrySet)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(BaseSet)operator(()ident(DIRECT_ENTRY_VIEW)operator(\))operator(;) + operator(}) + + directive(private) type(class) class(BaseSet) directive(extends) type(AbstractSet) operator({) + directive(final) ident(EntryView) ident(view)operator(;) + + directive(public) ident(BaseSet)operator(()ident(EntryView) ident(view)operator(\)) operator({) + local_variable(this)operator(.)ident(view) operator(=) ident(view)operator(;) + operator(}) + + directive(public) type(Iterator) ident(iterator)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(BaseIterator)operator(()ident(view)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(contains)operator(()type(Object) ident(o)operator(\)) operator({) + keyword(return) ident(view)operator(.)ident(contains)operator(()ident(RubyHash)operator(.)ident(this)operator(,) ident(o)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(clear)operator(()operator(\)) operator({) + ident(RubyHash)operator(.)ident(this)operator(.)ident(clear)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(int) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(RubyHash)operator(.)ident(this)operator(.)ident(size)operator(;) + operator(}) + + directive(public) type(boolean) ident(remove)operator(()type(Object) ident(o)operator(\)) operator({) + keyword(return) ident(view)operator(.)ident(remove)operator(()ident(RubyHash)operator(.)ident(this)operator(,) ident(o)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(class) class(BaseCollection) directive(extends) type(AbstractCollection) operator({) + directive(final) ident(EntryView) ident(view)operator(;) + + directive(public) ident(BaseCollection)operator(()ident(EntryView) ident(view)operator(\)) operator({) + local_variable(this)operator(.)ident(view) operator(=) ident(view)operator(;) + operator(}) + + directive(public) type(Iterator) ident(iterator)operator(()operator(\)) operator({) + keyword(return) keyword(new) ident(BaseIterator)operator(()ident(view)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(contains)operator(()type(Object) ident(o)operator(\)) operator({) + keyword(return) ident(view)operator(.)ident(contains)operator(()ident(RubyHash)operator(.)ident(this)operator(,) ident(o)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(clear)operator(()operator(\)) operator({) + ident(RubyHash)operator(.)ident(this)operator(.)ident(clear)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(int) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(RubyHash)operator(.)ident(this)operator(.)ident(size)operator(;) + operator(}) + + directive(public) type(boolean) ident(remove)operator(()type(Object) ident(o)operator(\)) operator({) + keyword(return) ident(view)operator(.)ident(remove)operator(()ident(RubyHash)operator(.)ident(this)operator(,) ident(o)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(class) class(BaseIterator) directive(implements) type(Iterator) operator({) + directive(final) directive(private) ident(EntryView) ident(view)operator(;) + directive(private) ident(RubyHashEntry) ident(entry)operator(;) + directive(private) type(boolean) ident(peeking)operator(;) + directive(private) type(int) ident(startGeneration)operator(;) + + directive(public) ident(BaseIterator)operator(()ident(EntryView) ident(view)operator(\)) operator({) + local_variable(this)operator(.)ident(view) operator(=) ident(view)operator(;) + local_variable(this)operator(.)ident(entry) operator(=) ident(head)operator(;) + local_variable(this)operator(.)ident(startGeneration) operator(=) ident(generation)operator(;) + operator(}) + + directive(private) type(void) ident(advance)operator(()type(boolean) ident(consume)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(peeking)operator(\)) operator({) + keyword(do) operator({) + keyword(if) operator(()ident(startGeneration) operator(!=) ident(generation)operator(\)) operator({) + ident(startGeneration) operator(=) ident(generation)operator(;) + ident(entry) operator(=) ident(head)operator(;) + operator(}) + ident(entry) operator(=) ident(entry)operator(.)ident(nextAdded)operator(;) + operator(}) keyword(while) operator(()ident(entry) operator(!=) ident(head) operator(&&) operator(!)ident(entry)operator(.)ident(isLive)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(peeking) operator(=) operator(!)ident(consume)operator(;) + operator(}) + + directive(public) type(Object) ident(next)operator(()operator(\)) operator({) + ident(advance)operator(()keyword(true)operator(\))operator(;) + keyword(if) operator(()ident(entry) operator(==) ident(head)operator(\)) operator({) + ident(peeking) operator(=) keyword(true)operator(;) comment(// remain where we are) + keyword(throw) keyword(new) type(NoSuchElementException)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(view)operator(.)ident(convertEntry)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(entry)operator(\))operator(;) + operator(}) + + comment(// once hasNext has been called, we commit to next(\) returning) + comment(// the entry it found, even if it were subsequently deleted) + directive(public) type(boolean) ident(hasNext)operator(()operator(\)) operator({) + ident(advance)operator(()keyword(false)operator(\))operator(;) + keyword(return) ident(entry) operator(!=) ident(head)operator(;) + operator(}) + + directive(public) type(void) ident(remove)operator(()operator(\)) operator({) + keyword(if) operator(()ident(entry) operator(==) ident(head)operator(\)) operator({) + keyword(throw) keyword(new) type(IllegalStateException)operator(()string<delimiter(")content(Iterator out of range)delimiter(")>operator(\))operator(;) + operator(}) + ident(internalDeleteEntry)operator(()ident(entry)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) directive(abstract) type(class) class(EntryView) operator({) + directive(public) directive(abstract) type(Object) ident(convertEntry)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyHashEntry) ident(value)operator(\))operator(;) + directive(public) directive(abstract) type(boolean) ident(contains)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\))operator(;) + directive(public) directive(abstract) type(boolean) ident(remove)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) ident(EntryView) ident(DIRECT_KEY_VIEW) operator(=) keyword(new) ident(EntryView)operator(()operator(\)) operator({) + directive(public) type(Object) ident(convertEntry)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyHashEntry) ident(entry)operator(\)) operator({) + keyword(return) ident(entry)operator(.)ident(key)operator(;) + operator(}) + directive(public) type(boolean) ident(contains)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(IRubyObject)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + keyword(return) ident(hash)operator(.)ident(internalGet)operator(()operator(()ident(IRubyObject)operator(\))ident(o)operator(\)) operator(!=) keyword(null)operator(;) + operator(}) + directive(public) type(boolean) ident(remove)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(IRubyObject)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + keyword(return) ident(hash)operator(.)ident(internalDelete)operator(()operator(()ident(IRubyObject)operator(\))ident(o)operator(\)) operator(!=) ident(NO_ENTRY)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(static) directive(final) ident(EntryView) ident(KEY_VIEW) operator(=) keyword(new) ident(EntryView)operator(()operator(\)) operator({) + directive(public) type(Object) ident(convertEntry)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyHashEntry) ident(entry)operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(entry)operator(.)ident(key)operator(,) type(Object)operator(.)ident(class)operator(\))operator(;) + operator(}) + directive(public) type(boolean) ident(contains)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(return) ident(hash)operator(.)ident(containsKey)operator(()ident(o)operator(\))operator(;) + operator(}) + directive(public) type(boolean) ident(remove)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(return) ident(hash)operator(.)ident(remove)operator(()ident(o)operator(\)) operator(!=) keyword(null)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(static) directive(final) ident(EntryView) ident(DIRECT_VALUE_VIEW) operator(=) keyword(new) ident(EntryView)operator(()operator(\)) operator({) + directive(public) type(Object) ident(convertEntry)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyHashEntry) ident(entry)operator(\)) operator({) + keyword(return) ident(entry)operator(.)ident(value)operator(;) + operator(}) + directive(public) type(boolean) ident(contains)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(IRubyObject)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + ident(IRubyObject) ident(obj) operator(=) operator(()ident(IRubyObject)operator(\))ident(o)operator(;) + keyword(return) ident(hash)operator(.)ident(hasValue)operator(()ident(obj)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(obj)operator(\))operator(;) + operator(}) + directive(public) type(boolean) ident(remove)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(IRubyObject)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + ident(IRubyObject) ident(obj) operator(=) operator(()ident(IRubyObject)operator(\)) ident(o)operator(;) + ident(IRubyObject) ident(key) operator(=) ident(hash)operator(.)ident(internalIndex)operator(()ident(obj)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(obj)operator(\))operator(;) + keyword(if) operator(()ident(key) operator(==) keyword(null)operator(\)) keyword(return) keyword(false)operator(;) + keyword(return) ident(hash)operator(.)ident(internalDelete)operator(()ident(key)operator(\)) operator(!=) ident(NO_ENTRY)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(final) ident(EntryView) ident(VALUE_VIEW) operator(=) keyword(new) ident(EntryView)operator(()operator(\)) operator({) + directive(public) type(Object) ident(convertEntry)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyHashEntry) ident(entry)operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(entry)operator(.)ident(value)operator(,) type(Object)operator(.)ident(class)operator(\))operator(;) + operator(}) + directive(public) type(boolean) ident(contains)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(return) ident(hash)operator(.)ident(containsValue)operator(()ident(o)operator(\))operator(;) + operator(}) + directive(public) type(boolean) ident(remove)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + ident(IRubyObject) ident(value) operator(=) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(hash)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(o)operator(\))operator(;) + ident(IRubyObject) ident(key) operator(=) ident(hash)operator(.)ident(internalIndex)operator(()ident(hash)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + keyword(if) operator(()ident(key) operator(==) keyword(null)operator(\)) keyword(return) keyword(false)operator(;) + keyword(return) ident(hash)operator(.)ident(internalDelete)operator(()ident(key)operator(\)) operator(!=) ident(NO_ENTRY)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(final) ident(EntryView) ident(DIRECT_ENTRY_VIEW) operator(=) keyword(new) ident(EntryView)operator(()operator(\)) operator({) + directive(public) type(Object) ident(convertEntry)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyHashEntry) ident(entry)operator(\)) operator({) + keyword(return) ident(entry)operator(;) + operator(}) + directive(public) type(boolean) ident(contains)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(RubyHashEntry)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + ident(RubyHashEntry) ident(entry) operator(=) operator(()ident(RubyHashEntry)operator(\))ident(o)operator(;) + ident(RubyHashEntry) ident(candidate) operator(=) ident(internalGetEntry)operator(()ident(entry)operator(.)ident(key)operator(\))operator(;) + keyword(return) ident(candidate) operator(!=) ident(NO_ENTRY) operator(&&) ident(entry)operator(.)ident(equals)operator(()ident(candidate)operator(\))operator(;) + operator(}) + directive(public) type(boolean) ident(remove)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(RubyHashEntry)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + keyword(return) ident(hash)operator(.)ident(internalDeleteEntry)operator(()operator(()ident(RubyHashEntry)operator(\))ident(o)operator(\)) operator(!=) ident(NO_ENTRY)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(final) ident(EntryView) ident(ENTRY_VIEW) operator(=) keyword(new) ident(EntryView)operator(()operator(\)) operator({) + directive(public) type(Object) ident(convertEntry)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyHashEntry) ident(entry)operator(\)) operator({) + keyword(return) keyword(new) ident(ConvertingEntry)operator(()ident(runtime)operator(,) ident(entry)operator(\))operator(;) + operator(}) + directive(public) type(boolean) ident(contains)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(ConvertingEntry)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + ident(ConvertingEntry) ident(entry) operator(=) operator(()ident(ConvertingEntry)operator(\))ident(o)operator(;) + ident(RubyHashEntry) ident(candidate) operator(=) ident(hash)operator(.)ident(internalGetEntry)operator(()ident(entry)operator(.)ident(entry)operator(.)ident(key)operator(\))operator(;) + keyword(return) ident(candidate) operator(!=) ident(NO_ENTRY) operator(&&) ident(entry)operator(.)ident(entry)operator(.)ident(equals)operator(()ident(candidate)operator(\))operator(;) + operator(}) + directive(public) type(boolean) ident(remove)operator(()ident(RubyHash) ident(hash)operator(,) type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(ConvertingEntry)operator(\))operator(\)) keyword(return) keyword(false)operator(;) + ident(ConvertingEntry) ident(entry) operator(=) operator(()ident(ConvertingEntry)operator(\))ident(o)operator(;) + keyword(return) ident(hash)operator(.)ident(internalDeleteEntry)operator(()ident(entry)operator(.)ident(entry)operator(\)) operator(!=) ident(NO_ENTRY)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(static) type(class) class(ConvertingEntry) directive(implements) type(Map)operator(.)ident(Entry) operator({) + directive(private) directive(final) ident(RubyHashEntry) ident(entry)operator(;) + directive(private) directive(final) ident(Ruby) ident(runtime)operator(;) + + directive(public) ident(ConvertingEntry)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyHashEntry) ident(entry)operator(\)) operator({) + local_variable(this)operator(.)ident(entry) operator(=) ident(entry)operator(;) + local_variable(this)operator(.)ident(runtime) operator(=) ident(runtime)operator(;) + operator(}) + + directive(public) type(Object) ident(getKey)operator(()operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(entry)operator(.)ident(key)operator(,) type(Object)operator(.)ident(class)operator(\))operator(;) + operator(}) + directive(public) type(Object) ident(getValue)operator(()operator(\)) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(entry)operator(.)ident(value)operator(,) type(Object)operator(.)ident(class)operator(\))operator(;) + operator(}) + directive(public) type(Object) ident(setValue)operator(()type(Object) ident(o)operator(\)) operator({) + keyword(return) ident(entry)operator(.)ident(setValue)operator(()ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(runtime)operator(,) ident(o)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(equals)operator(()type(Object) ident(o)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(o) keyword(instanceof) ident(ConvertingEntry)operator(\))operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + ident(ConvertingEntry) ident(other) operator(=) operator(()ident(ConvertingEntry)operator(\))ident(o)operator(;) + keyword(return) ident(entry)operator(.)ident(equals)operator(()ident(other)operator(.)ident(entry)operator(\))operator(;) + operator(}) + directive(public) type(int) ident(hashCode)operator(()operator(\)) operator({) + keyword(return) ident(entry)operator(.)ident(hashCode)operator(()operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2007 Koichiro Ohba <koichiro@meadowy.org> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.nio.ByteBuffer)operator(;) +keyword(import) include(java.nio.CharBuffer)operator(;) +keyword(import) include(java.nio.charset.CharacterCodingException)operator(;) +keyword(import) include(java.nio.charset.Charset)operator(;) +keyword(import) include(java.nio.charset.CharsetDecoder)operator(;) +keyword(import) include(java.nio.charset.CharsetEncoder)operator(;) +keyword(import) include(java.nio.charset.CodingErrorAction)operator(;) +keyword(import) include(java.nio.charset.IllegalCharsetNameException)operator(;) +keyword(import) include(java.nio.charset.MalformedInputException)operator(;) +keyword(import) include(java.nio.charset.UnmappableCharacterException)operator(;) +keyword(import) include(java.nio.charset.UnsupportedCharsetException)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) + +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +keyword(import) include(org.jruby.util.ByteList)operator(;) + +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Iconv)delimiter(")>operator(\)) +directive(public) type(class) class(RubyIconv) directive(extends) ident(RubyObject) operator({) + comment(//static private final String TRANSLIT = "//translit";) + directive(static) directive(private) directive(final) type(String) ident(IGNORE) operator(=) string<delimiter(")content(//ignore)delimiter(")>operator(;) + + directive(private) type(CharsetDecoder) ident(fromEncoding)operator(;) + directive(private) type(CharsetEncoder) ident(toEncoding)operator(;) + + directive(public) ident(RubyIconv)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) ident(ObjectAllocator) ident(ICONV_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyIconv)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Iconv::Failure)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Failure) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Iconv::IllegalSequence)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(ArgumentError)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Iconv::Failure)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(IllegalSequence) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Iconv::InvalidCharacter)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(ArgumentError)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Iconv::Failure)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(InvalidCharacter) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Iconv::InvalidEncoding)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(ArgumentError)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Iconv::Failure)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(InvalidEncoding) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Iconv::OutOfRange)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(ArgumentError)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Iconv::Failure)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(OutOfRange) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Iconv::BrokenLibrary)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(ArgumentError)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Iconv::Failure)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(BrokenLibrary) operator({)operator(}) + + directive(public) directive(static) type(void) ident(createIconv)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(iconvClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Iconv)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ICONV_ALLOCATOR)operator(\))operator(;) + + ident(iconvClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyIconv)operator(.)ident(class)operator(\))operator(;) + + ident(RubyModule) ident(failure) operator(=) ident(iconvClass)operator(.)ident(defineModuleUnder)operator(()string<delimiter(")content(Failure)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(argumentError) operator(=) ident(runtime)operator(.)ident(getArgumentError)operator(()operator(\))operator(;) + + type(String)type([]) ident(iconvErrors) operator(=) operator({)string<delimiter(")content(IllegalSequence)delimiter(")>operator(,) string<delimiter(")content(InvalidCharacter)delimiter(")>operator(,) string<delimiter(")content(InvalidEncoding)delimiter(")>operator(,) + string<delimiter(")content(OutOfRange)delimiter(")>operator(,) string<delimiter(")content(BrokenLibrary)delimiter(")>operator(})operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(iconvErrors)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyClass) ident(subClass) operator(=) ident(iconvClass)operator(.)ident(defineClassUnder)operator(()ident(iconvErrors)operator([)ident(i)operator(])operator(,) ident(argumentError)operator(,) ident(RubyFailure)operator(.)ident(ICONV_FAILURE_ALLOCATOR)operator(\))operator(;) + ident(subClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyFailure)operator(.)ident(class)operator(\))operator(;) + ident(subClass)operator(.)ident(includeModule)operator(()ident(failure)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(class) class(RubyFailure) directive(extends) ident(RubyException) operator({) + directive(private) ident(IRubyObject) ident(success)operator(;) + directive(private) ident(IRubyObject) ident(failed)operator(;) + + directive(public) directive(static) ident(RubyFailure) ident(newInstance)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(excptnClass)operator(,) type(String) ident(msg)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyFailure)operator(()ident(runtime)operator(,) ident(excptnClass)operator(,) ident(msg)operator(\))operator(;) + operator(}) + + directive(protected) directive(static) directive(final) ident(ObjectAllocator) ident(ICONV_FAILURE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyFailure)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(protected) ident(RubyFailure)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) ident(rubyClass)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyFailure)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) type(String) ident(message)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(,) ident(message)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + local_variable(super)operator(.)ident(initialize)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + ident(success) operator(=) ident(args)operator(.)ident(length) operator(>=) integer(2) operator(?) ident(args)operator([)integer(1)operator(]) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(failed) operator(=) ident(args)operator(.)ident(length) operator(==) integer(3) operator(?) ident(args)operator([)integer(2)operator(]) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(success)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(success)operator(()operator(\)) operator({) + keyword(return) ident(success)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(failed)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(failed)operator(()operator(\)) operator({) + keyword(return) ident(failed)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + ident(RubyModule) ident(rubyClass) operator(=) ident(getMetaClass)operator(()operator(\))operator(;) + type(StringBuilder) ident(buffer) operator(=) keyword(new) type(StringBuilder)operator(()string<delimiter(")content(#<)delimiter(")>operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()ident(rubyClass)operator(.)ident(getName)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(: )delimiter(")>operator(\))operator(.)ident(append)operator(()ident(success)operator(.)ident(inspect)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(")content(, )delimiter(")>operator(\))operator(.)ident(append)operator(()ident(failed)operator(.)ident(inspect)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buffer)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(String) ident(getCharset)operator(()type(String) ident(encoding)operator(\)) operator({) + type(int) ident(index) operator(=) ident(encoding)operator(.)ident(indexOf)operator(()string<delimiter(")content(//)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(index) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(encoding)operator(;) + keyword(return) ident(encoding)operator(.)ident(substring)operator(()integer(0)operator(,) ident(index)operator(\))operator(;) + operator(}) + + comment(/* Currently dead code, but useful when we figure out how to actually perform translit. + private static boolean isTranslit(String encoding\) { + return encoding.toLowerCase(\).indexOf(TRANSLIT\) != -1 ? true : false; + }*/) + + directive(private) directive(static) type(boolean) ident(isIgnore)operator(()type(String) ident(encoding)operator(\)) operator({) + keyword(return) ident(encoding)operator(.)ident(toLowerCase)operator(()operator(\))operator(.)ident(indexOf)operator(()ident(IGNORE)operator(\)) operator(!=) operator(-)integer(1) operator(?) keyword(true) operator(:) keyword(false)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(open)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(open)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(to)operator(,) ident(IRubyObject) ident(from)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(RubyIconv) ident(iconv) operator(=) ident(newIconv)operator(()ident(context)operator(,) ident(recv)operator(,) ident(to)operator(,) ident(from)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(return) ident(iconv)operator(;) + + ident(IRubyObject) ident(result) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(result) operator(=) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(iconv)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(iconv)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) directive(static) ident(RubyIconv) ident(newIconv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) + ident(IRubyObject) ident(to)operator(,) ident(IRubyObject) ident(from)operator(\)) operator({) + ident(RubyClass) ident(klazz) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + + keyword(return) operator(()ident(RubyIconv)operator(\)) ident(klazz)operator(.)ident(newInstance)operator(() + ident(context)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(to)operator(,) ident(from)operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(arg1)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(arg1)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( into String)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(arg2)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(arg2)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( into String)delimiter(")>operator(\))operator(;) + operator(}) + + type(String) ident(to) operator(=) ident(arg1)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + type(String) ident(from) operator(=) ident(arg2)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + + keyword(try) operator({) + + ident(fromEncoding) operator(=) type(Charset)operator(.)ident(forName)operator(()ident(getCharset)operator(()ident(from)operator(\))operator(\))operator(.)ident(newDecoder)operator(()operator(\))operator(;) + ident(toEncoding) operator(=) type(Charset)operator(.)ident(forName)operator(()ident(getCharset)operator(()ident(to)operator(\))operator(\))operator(.)ident(newEncoder)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isIgnore)operator(()ident(from)operator(\))operator(\)) ident(fromEncoding)operator(.)ident(onUnmappableCharacter)operator(()type(CodingErrorAction)operator(.)ident(REPORT)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isIgnore)operator(()ident(to)operator(\))operator(\)) ident(toEncoding)operator(.)ident(onUnmappableCharacter)operator(()type(CodingErrorAction)operator(.)ident(REPORT)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IllegalCharsetNameException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newInvalidEncoding)operator(()string<delimiter(")content(invalid encoding)delimiter(")>operator(\))operator(;) + operator(}) keyword(catch) operator(()type(UnsupportedCharsetException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newInvalidEncoding)operator(()string<delimiter(")content(invalid encoding)delimiter(")>operator(\))operator(;) + operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSystemCallError)operator(()ident(e)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) operator({) + ident(toEncoding) operator(=) keyword(null)operator(;) + ident(fromEncoding) operator(=) keyword(null)operator(;) + keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(iconv)operator(()ident(IRubyObject) ident(str)operator(\)) operator({) + keyword(return) ident(iconv)operator(()ident(str)operator(,) integer(0)operator(,) operator(-)integer(1)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(iconv)operator(()ident(IRubyObject) ident(str)operator(,) ident(IRubyObject) ident(startArg)operator(\)) operator({) + type(int) ident(start) operator(=) integer(0)operator(;) + keyword(if) operator(()operator(!)ident(startArg)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(start) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(startArg)operator(\))operator(;) + keyword(return) ident(iconv)operator(()ident(str)operator(,) ident(start)operator(,) operator(-)integer(1)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(iconv)operator(()ident(IRubyObject) ident(str)operator(,) ident(IRubyObject) ident(startArg)operator(,) ident(IRubyObject) ident(endArg)operator(\)) operator({) + type(int) ident(start) operator(=) integer(0)operator(;) + type(int) ident(end) operator(=) operator(-)integer(1)operator(;) + + keyword(if) operator(()operator(!)ident(startArg)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(start) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(startArg)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(endArg)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(end) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(endArg)operator(\))operator(;) + + keyword(return) ident(iconv)operator(()ident(str)operator(,) ident(start)operator(,) ident(end)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(iconv)operator(()ident(IRubyObject) ident(str)operator(,) type(int) ident(start)operator(,) type(int) ident(end)operator(\)) operator({) + keyword(if) operator(()ident(str)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(fromEncoding)operator(.)ident(reset)operator(()operator(\))operator(;) + ident(toEncoding)operator(.)ident(reset)operator(()operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(_iconv)operator(()ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(,) ident(start)operator(,) ident(end)operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one, two or three arguments. + */) + directive(public) ident(IRubyObject) ident(iconv)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(iconv)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(iconv)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) integer(3)operator(:) + keyword(return) ident(iconv)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(args)operator([)integer(2)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(// FIXME: We are assuming that original string will be raw bytes. If -Ku is provided) + comment(// this will not be true, but that is ok for now. Deal with that when someone needs it.) + directive(private) ident(IRubyObject) ident(_iconv)operator(()ident(RubyString) ident(str)operator(,) type(int) ident(start)operator(,) type(int) ident(end)operator(\)) operator({) + keyword(if) operator(()ident(fromEncoding) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(closed iconv)delimiter(")>operator(\))operator(;) + operator(}) + + ident(ByteList) ident(bytes) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + + comment(// treat start and end as start...end for end >= 0, start..end for end < 0) + keyword(if) operator(()ident(start) operator(<) integer(0)operator(\)) operator({) + ident(start) operator(+=) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(end) operator(<) integer(0)operator(\)) operator({) + ident(end) operator(+=) integer(1) operator(+) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(end) operator(>) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + ident(end) operator(=) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(start) operator(<) integer(0) operator(||) ident(end) operator(<) ident(start)operator(\)) operator({) comment(// invalid ranges result in an empty string) + keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + type(ByteBuffer) ident(buf) operator(=) type(ByteBuffer)operator(.)ident(wrap)operator(()ident(bytes)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(begin)operator(()operator(\)) operator(+) ident(start)operator(,) ident(end) operator(-) ident(start)operator(\))operator(;) + + keyword(try) operator({) + type(CharBuffer) ident(cbuf) operator(=) ident(fromEncoding)operator(.)ident(decode)operator(()ident(buf)operator(\))operator(;) + ident(buf) operator(=) ident(toEncoding)operator(.)ident(encode)operator(()ident(cbuf)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(MalformedInputException) ident(e)operator(\)) operator({) + operator(}) keyword(catch) operator(()type(UnmappableCharacterException) ident(e)operator(\)) operator({) + operator(}) keyword(catch) operator(()type(CharacterCodingException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newInvalidEncoding)operator(()string<delimiter(")content(invalid sequence)delimiter(")>operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IllegalStateException) ident(e)operator(\)) operator({) + operator(}) + type(byte)type([]) ident(arr) operator(=) ident(buf)operator(.)ident(array)operator(()operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()keyword(new) ident(ByteList)operator(()ident(arr)operator(,) integer(0)operator(,) ident(buf)operator(.)ident(limit)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(iconv)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(iconv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) ident(convertWithArgs)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(,) string<delimiter(")content(iconv)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(conv)delimiter(")>operator(,) ident(required) operator(=) integer(3)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(conv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) ident(convertWithArgs)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(,) string<delimiter(")content(conv)delimiter(")>operator(\))operator(.)ident(join)operator(()ident(context)operator(,) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(charset_map)delimiter(")>operator(,) ident(meta)operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(charset_map_get)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCharsetMap)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(String) ident(mapCharset)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(val)operator(\)) operator({) + ident(RubyHash) ident(charset) operator(=) ident(val)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCharsetMap)operator(()operator(\))operator(;) + keyword(if) operator(()ident(charset)operator(.)ident(size)operator(()operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(RubyString) ident(key) operator(=) ident(val)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(downcase)delimiter(")>operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(IRubyObject) ident(tryVal) operator(=) ident(charset)operator(.)ident(fastARef)operator(()ident(key)operator(\))operator(;) + keyword(if) operator(()ident(tryVal) operator(!=) keyword(null)operator(\)) ident(val) operator(=) ident(tryVal)operator(;) + operator(}) + + keyword(return) ident(val)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(convertWithArgs)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) type(String) ident(function)operator(\)) operator({) + ident(assert) ident(args)operator(.)ident(length) operator(>=) integer(2)operator(;) + + ident(RubyArray) ident(array) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(args)operator(.)ident(length) operator(-) integer(2)operator(\))operator(;) + ident(RubyIconv) ident(iconv) operator(=) ident(newIconv)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + + keyword(try) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(2)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()ident(iconv)operator(.)ident(iconv)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(finally) operator({) + ident(iconv)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(array)operator(;) + operator(}) + + comment(/* + private static IRubyObject convert(String fromEncoding, String toEncoding, RubyString original\) + throws UnsupportedEncodingException { + // Get all bytes from PLAIN string pretend they are not encoded in any way. + byte[] string = original.getBytes(\); + // Now create a string pretending it is from fromEncoding + string = new String(string, fromEncoding\).getBytes(toEncoding\); + // Finally recode back to PLAIN + return RubyString.newString(original.getRuntime(\), string\); + } + */) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Nick Sieger <nicksieger@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.BufferedInputStream)operator(;) +keyword(import) include(java.io.ByteArrayInputStream)operator(;) +keyword(import) include(java.io.File)operator(;) +keyword(import) include(java.io.FileInputStream)operator(;) +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.InputStream)operator(;) +keyword(import) include(java.io.PrintStream)operator(;) +keyword(import) include(java.io.UnsupportedEncodingException)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.HashSet)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.Map)operator(;) + +keyword(import) include(java.util.Set)operator(;) +keyword(import) include(java.util.StringTokenizer)operator(;) +keyword(import) include(org.jruby.ast.executable.Script)operator(;) +keyword(import) include(org.jruby.exceptions.MainExitException)operator(;) +keyword(import) include(org.jruby.runtime.Constants)operator(;) +keyword(import) include(org.jruby.runtime.load.LoadService)operator(;) +keyword(import) include(org.jruby.util.ClassCache)operator(;) +keyword(import) include(org.jruby.util.JRubyFile)operator(;) +keyword(import) include(org.jruby.util.KCode)operator(;) +keyword(import) include(org.jruby.util.NormalizedFile)operator(;) +keyword(import) include(org.jruby.util.SafePropertyAccessor)operator(;) +keyword(import) include(org.objectweb.asm.Opcodes)operator(;) + +directive(public) type(class) class(RubyInstanceConfig) operator({) + + comment(/** + * The max count of active methods eligible for JIT-compilation. + */) + directive(private) directive(static) directive(final) type(int) ident(JIT_MAX_METHODS_LIMIT) operator(=) integer(4096)operator(;) + + comment(/** + * The max size of JIT-compiled methods (full class size\) allowed. + */) + directive(private) directive(static) directive(final) type(int) ident(JIT_MAX_SIZE_LIMIT) operator(=) type(Integer)operator(.)ident(MAX_VALUE)operator(;) + + comment(/** + * The JIT threshold to the specified method invocation count. + */) + directive(private) directive(static) directive(final) type(int) ident(JIT_THRESHOLD) operator(=) integer(50)operator(;) + + comment(/** The version to use for generated classes. Set to current JVM version by default */) + directive(public) directive(static) directive(final) type(int) ident(JAVA_VERSION)operator(;) + + comment(/** + * Default size for chained compilation. + */) + directive(private) directive(static) directive(final) type(int) ident(CHAINED_COMPILE_LINE_COUNT_DEFAULT) operator(=) integer(500)operator(;) + + comment(/** + * The number of lines at which a method, class, or block body is split into + * chained methods (to dodge 64k method-size limit in JVM\). + */) + directive(public) directive(static) directive(final) type(int) ident(CHAINED_COMPILE_LINE_COUNT) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getInt)operator(()string<delimiter(")content(jruby.compile.chainsize)delimiter(")>operator(,) ident(CHAINED_COMPILE_LINE_COUNT_DEFAULT)operator(\))operator(;) + + directive(public) type(enum) ident(CompileMode) operator({) + ident(JIT)operator(,) ident(FORCE)operator(,) ident(OFF)operator(;) + + directive(public) type(boolean) ident(shouldPrecompileCLI)operator(()operator(\)) operator({) + keyword(switch) operator(()local_variable(this)operator(\)) operator({) + keyword(case) ident(JIT)operator(:) keyword(case) ident(FORCE)operator(:) + keyword(return) keyword(true)operator(;) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) type(boolean) ident(shouldJIT)operator(()operator(\)) operator({) + keyword(switch) operator(()local_variable(this)operator(\)) operator({) + keyword(case) ident(JIT)operator(:) keyword(case) ident(FORCE)operator(:) + keyword(return) keyword(true)operator(;) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) type(boolean) ident(shouldPrecompileAll)operator(()operator(\)) operator({) + keyword(return) local_variable(this) operator(==) ident(FORCE)operator(;) + operator(}) + operator(}) + directive(private) type(InputStream) ident(input) operator(=) type(System)operator(.)ident(in)operator(;) + directive(private) type(PrintStream) ident(output) operator(=) type(System)operator(.)ident(out)operator(;) + directive(private) type(PrintStream) ident(error) operator(=) type(System)operator(.)ident(err)operator(;) + directive(private) ident(Profile) ident(profile) operator(=) ident(Profile)operator(.)ident(DEFAULT)operator(;) + directive(private) type(boolean) ident(objectSpaceEnabled) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.objectspace.enabled)delimiter(")>operator(,) keyword(false)operator(\))operator(;) + + directive(private) ident(CompileMode) ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(JIT)operator(;) + directive(private) type(boolean) ident(runRubyInProcess) operator(=) keyword(true)operator(;) + directive(private) type(String) ident(currentDirectory)operator(;) + directive(private) type(Map) ident(environment)operator(;) + directive(private) type(String)type([]) ident(argv) operator(=) operator({)operator(})operator(;) + + directive(private) directive(final) type(boolean) ident(jitLogging)operator(;) + directive(private) directive(final) type(boolean) ident(jitLoggingVerbose)operator(;) + directive(private) directive(final) type(int) ident(jitLogEvery)operator(;) + directive(private) directive(final) type(int) ident(jitThreshold)operator(;) + directive(private) directive(final) type(int) ident(jitMax)operator(;) + directive(private) directive(final) type(int) ident(jitMaxSize)operator(;) + directive(private) directive(final) type(boolean) ident(samplingEnabled)operator(;) + directive(private) ident(CompatVersion) ident(compatVersion)operator(;) + + directive(private) type(ClassLoader) ident(contextLoader) operator(=) type(Thread)operator(.)ident(currentThread)operator(()operator(\))operator(.)ident(getContextClassLoader)operator(()operator(\))operator(;) + directive(private) type(ClassLoader) ident(loader) operator(=) ident(contextLoader) operator(==) keyword(null) operator(?) ident(RubyInstanceConfig)operator(.)ident(class)operator(.)ident(getClassLoader)operator(()operator(\)) operator(:) ident(contextLoader)operator(;) + + directive(private) ident(ClassCache)operator(<)ident(Script)operator(>) ident(classCache)operator(;) + + comment(// from CommandlineParser) + directive(private) type(List)operator(<)type(String)operator(>) ident(loadPaths) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + directive(private) type(Set)operator(<)type(String)operator(>) ident(excludedMethods) operator(=) keyword(new) type(HashSet)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + directive(private) type(StringBuffer) ident(inlineScript) operator(=) keyword(new) type(StringBuffer)operator(()operator(\))operator(;) + directive(private) type(boolean) ident(hasInlineScript) operator(=) keyword(false)operator(;) + directive(private) type(String) ident(scriptFileName) operator(=) keyword(null)operator(;) + directive(private) type(List)operator(<)type(String)operator(>) ident(requiredLibraries) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + directive(private) type(boolean) ident(benchmarking) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(argvGlobalsOn) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(assumeLoop) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(assumePrinting) operator(=) keyword(false)operator(;) + directive(private) type(Map) ident(optionGlobals) operator(=) keyword(new) type(HashMap)operator(()operator(\))operator(;) + directive(private) type(boolean) ident(processLineEnds) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(split) operator(=) keyword(false)operator(;) + comment(// This property is a Boolean, to allow three values, so it can match MRI's nil, false and true) + directive(private) type(Boolean) ident(verbose) operator(=) type(Boolean)operator(.)ident(FALSE)operator(;) + directive(private) type(boolean) ident(debug) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(showVersion) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(showBytecode) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(showCopyright) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(endOfArguments) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(shouldRunInterpreter) operator(=) keyword(true)operator(;) + directive(private) type(boolean) ident(shouldPrintUsage) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(shouldPrintProperties)operator(=)keyword(false)operator(;) + directive(private) type(boolean) ident(yarv) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(rubinius) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(yarvCompile) operator(=) keyword(false)operator(;) + directive(private) ident(KCode) ident(kcode) operator(=) ident(KCode)operator(.)ident(NONE)operator(;) + directive(private) type(String) ident(recordSeparator) operator(=) string<delimiter(")char(\\n)delimiter(")>operator(;) + directive(private) type(boolean) ident(shouldCheckSyntax) operator(=) keyword(false)operator(;) + directive(private) type(String) ident(inputFieldSeparator) operator(=) keyword(null)operator(;) + directive(private) type(boolean) ident(managementEnabled) operator(=) keyword(true)operator(;) + + directive(private) type(int) ident(safeLevel) operator(=) integer(0)operator(;) + + directive(private) type(String) ident(jrubyHome)operator(;) + + directive(public) directive(static) directive(final) type(boolean) ident(FASTEST_COMPILE_ENABLED) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.compile.fastest)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) type(boolean) ident(BOXED_COMPILE_ENABLED) + operator(=) ident(FASTEST_COMPILE_ENABLED) + operator(||) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.compile.boxed)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) type(boolean) ident(FASTOPS_COMPILE_ENABLED) + operator(=) ident(FASTEST_COMPILE_ENABLED) + operator(||) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.compile.fastops)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) type(boolean) ident(FRAMELESS_COMPILE_ENABLED) + operator(=) ident(FASTEST_COMPILE_ENABLED) + operator(||) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.compile.frameless)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) type(boolean) ident(POSITIONLESS_COMPILE_ENABLED) + operator(=) ident(FASTEST_COMPILE_ENABLED) + operator(||) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.compile.positionless)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) type(boolean) ident(THREADLESS_COMPILE_ENABLED) + operator(=) ident(FASTEST_COMPILE_ENABLED) + operator(||) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.compile.threadless)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) type(boolean) ident(LAZYHANDLES_COMPILE) operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.compile.lazyHandles)delimiter(")>operator(,) keyword(false)operator(\))operator(;) + directive(public) directive(static) directive(final) type(boolean) ident(FORK_ENABLED) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.fork.enabled)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) type(boolean) ident(POOLING_ENABLED) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.thread.pool.enabled)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(POOL_MAX) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getInt)operator(()string<delimiter(")content(jruby.thread.pool.max)delimiter(")>operator(,) type(Integer)operator(.)ident(MAX_VALUE)operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(POOL_MIN) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getInt)operator(()string<delimiter(")content(jruby.thread.pool.min)delimiter(")>operator(,) integer(0)operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(POOL_TTL) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getInt)operator(()string<delimiter(")content(jruby.thread.pool.ttl)delimiter(")>operator(,) integer(60)operator(\))operator(;) + + directive(public) directive(static) directive(final) type(boolean) ident(NATIVE_NET_PROTOCOL) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.native.net.protocol)delimiter(")>operator(,) keyword(false)operator(\))operator(;) + + directive(public) directive(static) type(boolean) ident(FULL_TRACE_ENABLED) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.debug.fullTrace)delimiter(")>operator(,) keyword(false)operator(\))operator(;) + + directive(public) directive(static) directive(final) type(String) ident(COMPILE_EXCLUDE) + operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.jit.exclude)delimiter(")>operator(\))operator(;) + directive(public) directive(static) type(boolean) ident(nativeEnabled) operator(=) keyword(true)operator(;) + + + directive(public) directive(static) type(interface) ident(LoadServiceCreator) operator({) + ident(LoadService) ident(create)operator(()ident(Ruby) ident(runtime)operator(\))operator(;) + + ident(LoadServiceCreator) ident(DEFAULT) operator(=) keyword(new) ident(LoadServiceCreator)operator(()operator(\)) operator({) + directive(public) ident(LoadService) ident(create)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) keyword(new) ident(LoadService)operator(()ident(runtime)operator(\))operator(;) + operator(}) + operator(})operator(;) + operator(}) + + directive(private) ident(LoadServiceCreator) ident(creator) operator(=) ident(LoadServiceCreator)operator(.)ident(DEFAULT)operator(;) + + + directive(static) operator({) + type(String) ident(specVersion) operator(=) keyword(null)operator(;) + keyword(try) operator({) + ident(specVersion) operator(=) type(System)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.bytecode.version)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(specVersion) operator(==) keyword(null)operator(\)) operator({) + ident(specVersion) operator(=) type(System)operator(.)ident(getProperty)operator(()string<delimiter(")content(java.specification.version)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()type(System)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.native.enabled)delimiter(")>operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(nativeEnabled) operator(=) type(Boolean)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.native.enabled)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()type(SecurityException) ident(se)operator(\)) operator({) + ident(nativeEnabled) operator(=) keyword(false)operator(;) + ident(specVersion) operator(=) string<delimiter(")content(1.5)delimiter(")>operator(;) + operator(}) + + keyword(if) operator(()ident(specVersion)operator(.)ident(equals)operator(()string<delimiter(")content(1.5)delimiter(")>operator(\))operator(\)) operator({) + ident(JAVA_VERSION) operator(=) ident(Opcodes)operator(.)ident(V1_5)operator(;) + operator(}) keyword(else) operator({) + ident(JAVA_VERSION) operator(=) ident(Opcodes)operator(.)ident(V1_6)operator(;) + operator(}) + operator(}) + + directive(public) type(int) ident(characterIndex) operator(=) integer(0)operator(;) + + directive(public) ident(RubyInstanceConfig)operator(()operator(\)) operator({) + keyword(if) operator(()ident(Ruby)operator(.)ident(isSecurityRestricted)operator(()operator(\))operator(\)) + ident(currentDirectory) operator(=) string<delimiter(")content(/)delimiter(")>operator(;) + keyword(else) operator({) + ident(currentDirectory) operator(=) ident(JRubyFile)operator(.)ident(getFileProperty)operator(()string<delimiter(")content(user.dir)delimiter(")>operator(\))operator(;) + operator(}) + + ident(samplingEnabled) operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.sampling.enabled)delimiter(")>operator(,) keyword(false)operator(\))operator(;) + type(String) ident(compatString) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.compat.version)delimiter(")>operator(,) string<delimiter(")content(RUBY1_8)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(compatString)operator(.)ident(equalsIgnoreCase)operator(()string<delimiter(")content(RUBY1_8)delimiter(")>operator(\))operator(\)) operator({) + ident(compatVersion) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_8)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(compatString)operator(.)ident(equalsIgnoreCase)operator(()string<delimiter(")content(RUBY1_9)delimiter(")>operator(\))operator(\)) operator({) + ident(compatVersion) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(;) + operator(}) keyword(else) operator({) + type(System)operator(.)ident(err)operator(.)ident(println)operator(()string<delimiter(")content(Compatibility version `)delimiter(")> operator(+) ident(compatString) operator(+) string<delimiter(")content(' invalid; use RUBY1_8 or RUBY1_9. Using RUBY1_8.)delimiter(")>operator(\))operator(;) + ident(compatVersion) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_8)operator(;) + operator(}) + + keyword(if) operator(()ident(Ruby)operator(.)ident(isSecurityRestricted)operator(()operator(\))operator(\)) operator({) + ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(OFF)operator(;) + ident(jitLogging) operator(=) keyword(false)operator(;) + ident(jitLoggingVerbose) operator(=) keyword(false)operator(;) + ident(jitLogEvery) operator(=) integer(0)operator(;) + ident(jitThreshold) operator(=) operator(-)integer(1)operator(;) + ident(jitMax) operator(=) integer(0)operator(;) + ident(jitMaxSize) operator(=) operator(-)integer(1)operator(;) + ident(managementEnabled) operator(=) keyword(false)operator(;) + operator(}) keyword(else) operator({) + type(String) ident(threshold) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.jit.threshold)delimiter(")>operator(\))operator(;) + type(String) ident(max) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.jit.max)delimiter(")>operator(\))operator(;) + type(String) ident(maxSize) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.jit.maxsize)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(COMPILE_EXCLUDE) operator(!=) keyword(null)operator(\)) operator({) + type(String)type([]) ident(elements) operator(=) ident(COMPILE_EXCLUDE)operator(.)ident(split)operator(()string<delimiter(")content(,)delimiter(")>operator(\))operator(;) + keyword(for) operator(()type(String) ident(element) operator(:) ident(elements)operator(\)) ident(excludedMethods)operator(.)ident(add)operator(()ident(element)operator(\))operator(;) + operator(}) + + ident(managementEnabled) operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.management.enabled)delimiter(")>operator(,) keyword(true)operator(\))operator(;) + ident(runRubyInProcess) operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.launch.inproc)delimiter(")>operator(,) keyword(true)operator(\))operator(;) + type(boolean) ident(jitProperty) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.jit.enabled)delimiter(")>operator(\)) operator(!=) keyword(null)operator(;) + keyword(if) operator(()ident(jitProperty)operator(\)) operator({) + ident(error)operator(.)ident(print)operator(()string<delimiter(")content(jruby.jit.enabled property is deprecated; use jruby.compile.mode=(OFF|JIT|FORCE\) for -C, default, and +C flags)delimiter(")>operator(\))operator(;) + ident(compileMode) operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.jit.enabled)delimiter(")>operator(\)) operator(?) ident(CompileMode)operator(.)ident(JIT) operator(:) ident(CompileMode)operator(.)ident(OFF)operator(;) + operator(}) keyword(else) operator({) + type(String) ident(jitModeProperty) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.compile.mode)delimiter(")>operator(,) string<delimiter(")content(JIT)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(jitModeProperty)operator(.)ident(equals)operator(()string<delimiter(")content(OFF)delimiter(")>operator(\))operator(\)) operator({) + ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(OFF)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(jitModeProperty)operator(.)ident(equals)operator(()string<delimiter(")content(JIT)delimiter(")>operator(\))operator(\)) operator({) + ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(JIT)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(jitModeProperty)operator(.)ident(equals)operator(()string<delimiter(")content(FORCE)delimiter(")>operator(\))operator(\)) operator({) + ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(FORCE)operator(;) + operator(}) keyword(else) operator({) + ident(error)operator(.)ident(print)operator(()string<delimiter(")content(jruby.compile.mode property must be OFF, JIT, FORCE, or unset; defaulting to JIT)delimiter(")>operator(\))operator(;) + ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(JIT)operator(;) + operator(}) + operator(}) + ident(jitLogging) operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.jit.logging)delimiter(")>operator(\))operator(;) + ident(jitLoggingVerbose) operator(=) ident(SafePropertyAccessor)operator(.)ident(getBoolean)operator(()string<delimiter(")content(jruby.jit.logging.verbose)delimiter(")>operator(\))operator(;) + type(String) ident(logEvery) operator(=) ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.jit.logEvery)delimiter(")>operator(\))operator(;) + ident(jitLogEvery) operator(=) ident(logEvery) operator(==) keyword(null) operator(?) integer(0) operator(:) type(Integer)operator(.)ident(parseInt)operator(()ident(logEvery)operator(\))operator(;) + ident(jitThreshold) operator(=) ident(threshold) operator(==) keyword(null) operator(?) + ident(JIT_THRESHOLD) operator(:) type(Integer)operator(.)ident(parseInt)operator(()ident(threshold)operator(\))operator(;) + ident(jitMax) operator(=) ident(max) operator(==) keyword(null) operator(?) + ident(JIT_MAX_METHODS_LIMIT) operator(:) type(Integer)operator(.)ident(parseInt)operator(()ident(max)operator(\))operator(;) + ident(jitMaxSize) operator(=) ident(maxSize) operator(==) keyword(null) operator(?) + ident(JIT_MAX_SIZE_LIMIT) operator(:) type(Integer)operator(.)ident(parseInt)operator(()ident(maxSize)operator(\))operator(;) + operator(}) + + comment(// default ClassCache using jitMax as a soft upper bound) + ident(classCache) operator(=) keyword(new) ident(ClassCache)operator(<)ident(Script)operator(>)operator(()ident(loader)operator(,) ident(jitMax)operator(\))operator(;) + + keyword(if) operator(()ident(FORK_ENABLED)operator(\)) operator({) + ident(error)operator(.)ident(print)operator(()string<delimiter(")content(WARNING: fork is highly unlikely to be safe or stable on the JVM. Have fun!)char(\\n)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(public) ident(LoadServiceCreator) ident(getLoadServiceCreator)operator(()operator(\)) operator({) + keyword(return) ident(creator)operator(;) + operator(}) + + directive(public) type(void) ident(setLoadServiceCreator)operator(()ident(LoadServiceCreator) ident(creator)operator(\)) operator({) + local_variable(this)operator(.)ident(creator) operator(=) ident(creator)operator(;) + operator(}) + + directive(public) ident(LoadService) ident(createLoadService)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) local_variable(this)operator(.)ident(creator)operator(.)ident(create)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + directive(public) type(String) ident(getBasicUsageHelp)operator(()operator(\)) operator({) + type(StringBuilder) ident(sb) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + ident(sb) + operator(.)ident(append)operator(()string<delimiter(")content(Usage: jruby [switches] [--] [programfile] [arguments])char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -0[octal] specify record separator ()char(\\0)content(, if no argument\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -a autosplit mode with -n or -p (splits $_ into $F\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -b benchmark mode, times the script execution)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -c check syntax only)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -Cdirectory cd to directory, before executing your script)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -d set debugging flags (set $DEBUG to true\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -e 'command' one line of script. Several -e's allowed. Omit [programfile])char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -Fpattern split(\) pattern for autosplit (-a\))char(\\n)delimiter(")>operator(\)) + comment(//.append(" -i[extension] edit ARGV files in place (make backup if extension supplied\)\\n"\)) + operator(.)ident(append)operator(()string<delimiter(")content( -Idirectory specify $LOAD_PATH directory (may be used more than once\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -J[java option] pass an option on to the JVM (e.g. -J-Xmx512m\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( use --properties to list JRuby properties)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( run 'java -help' for a list of other Java options)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -Kkcode specifies code-set (e.g. -Ku for Unicode)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -l enable line ending processing)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -n assume 'while gets(\); ... end' loop around your script)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -p assume loop like -n but print line also like sed)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -rlibrary require the library, before executing your script)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -s enable some switch parsing for switches after script name)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -S look for the script in bin or using PATH environment variable)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -T[level] turn on tainting checks)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -v print version number, then turn on verbose mode)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -w turn warnings on for your script)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -W[level] set warning level; 0=silence, 1=medium, 2=verbose (default\))char(\\n)delimiter(")>operator(\)) + comment(//.append(" -x[directory] strip off text before #!ruby line and perhaps cd to directory\\n"\)) + operator(.)ident(append)operator(()string<delimiter(")content( -X[option] enable extended option (omit option to list\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --copyright print the copyright)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --debug sets the execution mode most suitable for debugger functionality)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --jdb runs JRuby process under JDB)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --properties List all configuration Java properties (pass -J-Dproperty=value\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --sample run with profiling using the JVM's sampling profiler)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --client use the non-optimizing )char(\\")content(client)char(\\")content( JVM (improves startup; default\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --server use the optimizing )char(\\")content(server)char(\\")content( JVM (improves perf\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --manage enable remote JMX management and monitoring of the VM and JRuby)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --1.8 specify Ruby 1.8.x compatibility (default\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --1.9 specify Ruby 1.9.x compatibility)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --bytecode show the JVM bytecode produced by compiling specified code)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( --version print the version)char(\\n)delimiter(")>operator(\))operator(;) + + keyword(return) ident(sb)operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(String) ident(getExtendedHelp)operator(()operator(\)) operator({) + type(StringBuilder) ident(sb) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + ident(sb) + operator(.)ident(append)operator(()string<delimiter(")content(These flags are for extended JRuby options.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content(Specify them by passing -X<option>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -O run with ObjectSpace disabled (default; improves performance\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( +O run with ObjectSpace enabled (reduces performance\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -C disable all compilation)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( +C force compilation of all scripts before they are run (except eval\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -y read a YARV-compiled Ruby script and run that (EXPERIMENTAL\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -Y compile a Ruby script into YARV bytecodes and run this (EXPERIMENTAL\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( -R read a Rubinius-compiled Ruby script and run that (EXPERIMENTAL\))char(\\n)delimiter(")>operator(\))operator(;) + + keyword(return) ident(sb)operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(String) ident(getPropertyHelp)operator(()operator(\)) operator({) + type(StringBuilder) ident(sb) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + ident(sb) + operator(.)ident(append)operator(()string<delimiter(")content(These properties can be used to alter runtime behavior for perf or compatibility.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content(Specify them by passing -J-D<property>=<value>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")char(\\n)content(COMPILER SETTINGS:)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.mode=JIT|FORCE|OFF)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set compilation mode. JIT is default; FORCE compiles all, OFF disables)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.fastest=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( (EXPERIMENTAL\) Turn on all experimental compiler optimizations)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.boxed=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( (EXPERIMENTAL\) Use boxed variables; this can speed up some methods. Default is false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.frameless=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( (EXPERIMENTAL\) Turn on frameless compilation where possible)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.positionless=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( (EXPERIMENTAL\) Turn on compilation that avoids updating Ruby position info. Default is false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.threadless=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( (EXPERIMENTAL\) Turn on compilation without polling for )char(\\")content(unsafe)char(\\")content( thread events. Default is false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.fastops=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( (EXPERIMENTAL\) Turn on fast operators for Fixnum. Default is false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.chainsize=<line count>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set the number of lines at which compiled bodies are )char(\\")content(chained)char(\\")content(. Default is )delimiter(")> operator(+) ident(CHAINED_COMPILE_LINE_COUNT_DEFAULT) operator(+) string<delimiter(")char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compile.lazyHandles=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Generate method bindings (handles\) for compiled methods lazily. Default is false.)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")char(\\n)content(JIT SETTINGS:)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.jit.threshold=<invocation count>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set the JIT threshold to the specified method invocation count. Default is )delimiter(")> operator(+) ident(JIT_THRESHOLD) operator(+) string<delimiter(")content(.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.jit.max=<method count>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set the max count of active methods eligible for JIT-compilation.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Default is )delimiter(")> operator(+) ident(JIT_MAX_METHODS_LIMIT) operator(+) string<delimiter(")content( per runtime. A value of 0 disables JIT, -1 disables max.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.jit.maxsize=<jitted method size (full .class\)>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set the maximum full-class byte size allowed for jitted methods. Default is Integer.MAX_VALUE)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.jit.logging=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Enable JIT logging (reports successful compilation\). Default is false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.jit.logging.verbose=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Enable verbose JIT logging (reports failed compilation\). Default is false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.jit.logEvery=<method count>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Log a message every n methods JIT compiled. Default is 0 (off\).)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.jit.exclude=<ClsOrMod,ClsOrMod::method_name,-::method_name>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Exclude methods from JIT by class/module short name, c/m::method_name,)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( or -::method_name for anon/singleton classes/modules. Comma-delimited.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")char(\\n)content(NATIVE SUPPORT:)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.native.enabled=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Enable/disable native extensions (like JNA for non-Java APIs; Default is true)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( (This affects all JRuby instances in a given JVM\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.native.verbose=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Enable verbose logging of native extension loading. Default is false.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.fork.enabled=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( (EXPERIMENTAL, maybe dangerous\) Enable fork(2\) on platforms that support it.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")char(\\n)content(THREAD POOLING:)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.thread.pool.enabled=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Enable reuse of native backing threads via a thread pool. Default is false.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.thread.pool.min=<min thread count>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( The minimum number of threads to keep alive in the pool. Default is 0.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.thread.pool.max=<max thread count>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( The maximum number of threads to allow in the pool. Default is unlimited.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.thread.pool.ttl=<time to live, in seconds>)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( The maximum number of seconds to keep alive an idle thread. Default is 60.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")char(\\n)content(MISCELLANY:)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.compat.version=RUBY1_8|RUBY1_9)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Specify the major Ruby version to be compatible with; Default is RUBY1_8)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.objectspace.enabled=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Enable or disable ObjectSpace.each_object (default is disabled\))char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.launch.inproc=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set in-process launching of e.g. system('ruby ...'\). Default is true)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.bytecode.version=1.5|1.6)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set bytecode version for JRuby to generate. Default is current JVM version.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.management.enabled=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set whether JMX management is enabled. Default is true.)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( jruby.debug.fullTrace=true|false)char(\\n)delimiter(")>operator(\)) + operator(.)ident(append)operator(()string<delimiter(")content( Set whether full traces are enabled (c-call/c-return\). Default is false.)char(\\n)delimiter(")>operator(\))operator(;) + + keyword(return) ident(sb)operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(String) ident(getVersionString)operator(()operator(\)) operator({) + type(String) ident(ver) operator(=) ident(Constants)operator(.)ident(RUBY_VERSION)operator(;) + keyword(switch) operator(()ident(compatVersion)operator(\)) operator({) + keyword(case) ident(RUBY1_8)operator(:) + ident(ver) operator(=) ident(Constants)operator(.)ident(RUBY_VERSION)operator(;) + keyword(break)operator(;) + keyword(case) ident(RUBY1_9)operator(:) + ident(ver) operator(=) ident(Constants)operator(.)ident(RUBY1_9_VERSION)operator(;) + keyword(break)operator(;) + operator(}) + + type(String) ident(fullVersion) operator(=) type(String)operator(.)ident(format)operator(() + string<delimiter(")content(jruby %s (ruby %s patchlevel %s\) (%s rev %s\) [%s-java])char(\\n)delimiter(")>operator(,) + ident(Constants)operator(.)ident(VERSION)operator(,) ident(ver)operator(,) ident(Constants)operator(.)ident(RUBY_PATCHLEVEL)operator(,) + ident(Constants)operator(.)ident(COMPILE_DATE)operator(,) ident(Constants)operator(.)ident(REVISION)operator(,) + ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(os.arch)delimiter(")>operator(,) string<delimiter(")content(unknown)delimiter(")>operator(\)) + operator(\))operator(;) + + keyword(return) ident(fullVersion)operator(;) + operator(}) + + directive(public) type(String) ident(getCopyrightString)operator(()operator(\)) operator({) + keyword(return) string<delimiter(")content(JRuby - Copyright (C\) 2001-2008 The JRuby Community (and contribs\))char(\\n)delimiter(")>operator(;) + operator(}) + + directive(public) type(void) ident(processArguments)operator(()type(String)type([]) ident(arguments)operator(\)) operator({) + keyword(new) ident(ArgumentProcessor)operator(()ident(arguments)operator(\))operator(.)ident(processArguments)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(CompileMode) ident(getCompileMode)operator(()operator(\)) operator({) + keyword(return) ident(compileMode)operator(;) + operator(}) + + directive(public) type(void) ident(setCompileMode)operator(()ident(CompileMode) ident(compileMode)operator(\)) operator({) + local_variable(this)operator(.)ident(compileMode) operator(=) ident(compileMode)operator(;) + operator(}) + + directive(public) type(boolean) ident(isJitLogging)operator(()operator(\)) operator({) + keyword(return) ident(jitLogging)operator(;) + operator(}) + + directive(public) type(boolean) ident(isJitLoggingVerbose)operator(()operator(\)) operator({) + keyword(return) ident(jitLoggingVerbose)operator(;) + operator(}) + + directive(public) type(int) ident(getJitLogEvery)operator(()operator(\)) operator({) + keyword(return) ident(jitLogEvery)operator(;) + operator(}) + + directive(public) type(boolean) ident(isSamplingEnabled)operator(()operator(\)) operator({) + keyword(return) ident(samplingEnabled)operator(;) + operator(}) + + directive(public) type(int) ident(getJitThreshold)operator(()operator(\)) operator({) + keyword(return) ident(jitThreshold)operator(;) + operator(}) + + directive(public) type(int) ident(getJitMax)operator(()operator(\)) operator({) + keyword(return) ident(jitMax)operator(;) + operator(}) + + directive(public) type(int) ident(getJitMaxSize)operator(()operator(\)) operator({) + keyword(return) ident(jitMaxSize)operator(;) + operator(}) + + directive(public) type(boolean) ident(isRunRubyInProcess)operator(()operator(\)) operator({) + keyword(return) ident(runRubyInProcess)operator(;) + operator(}) + + directive(public) type(void) ident(setRunRubyInProcess)operator(()type(boolean) ident(flag)operator(\)) operator({) + local_variable(this)operator(.)ident(runRubyInProcess) operator(=) ident(flag)operator(;) + operator(}) + + directive(public) type(void) ident(setInput)operator(()type(InputStream) ident(newInput)operator(\)) operator({) + ident(input) operator(=) ident(newInput)operator(;) + operator(}) + + directive(public) type(InputStream) ident(getInput)operator(()operator(\)) operator({) + keyword(return) ident(input)operator(;) + operator(}) + + directive(public) ident(CompatVersion) ident(getCompatVersion)operator(()operator(\)) operator({) + keyword(return) ident(compatVersion)operator(;) + operator(}) + + directive(public) type(void) ident(setOutput)operator(()type(PrintStream) ident(newOutput)operator(\)) operator({) + ident(output) operator(=) ident(newOutput)operator(;) + operator(}) + + directive(public) type(PrintStream) ident(getOutput)operator(()operator(\)) operator({) + keyword(return) ident(output)operator(;) + operator(}) + + directive(public) type(void) ident(setError)operator(()type(PrintStream) ident(newError)operator(\)) operator({) + ident(error) operator(=) ident(newError)operator(;) + operator(}) + + directive(public) type(PrintStream) ident(getError)operator(()operator(\)) operator({) + keyword(return) ident(error)operator(;) + operator(}) + + directive(public) type(void) ident(setCurrentDirectory)operator(()type(String) ident(newCurrentDirectory)operator(\)) operator({) + ident(currentDirectory) operator(=) ident(newCurrentDirectory)operator(;) + operator(}) + + directive(public) type(String) ident(getCurrentDirectory)operator(()operator(\)) operator({) + keyword(return) ident(currentDirectory)operator(;) + operator(}) + + directive(public) type(void) ident(setProfile)operator(()ident(Profile) ident(newProfile)operator(\)) operator({) + ident(profile) operator(=) ident(newProfile)operator(;) + operator(}) + + directive(public) ident(Profile) ident(getProfile)operator(()operator(\)) operator({) + keyword(return) ident(profile)operator(;) + operator(}) + + directive(public) type(void) ident(setObjectSpaceEnabled)operator(()type(boolean) ident(newObjectSpaceEnabled)operator(\)) operator({) + ident(objectSpaceEnabled) operator(=) ident(newObjectSpaceEnabled)operator(;) + operator(}) + + directive(public) type(boolean) ident(isObjectSpaceEnabled)operator(()operator(\)) operator({) + keyword(return) ident(objectSpaceEnabled)operator(;) + operator(}) + + directive(public) type(void) ident(setEnvironment)operator(()type(Map) ident(newEnvironment)operator(\)) operator({) + ident(environment) operator(=) ident(newEnvironment)operator(;) + operator(}) + + directive(public) type(Map) ident(getEnvironment)operator(()operator(\)) operator({) + keyword(return) ident(environment)operator(;) + operator(}) + + directive(public) type(ClassLoader) ident(getLoader)operator(()operator(\)) operator({) + keyword(return) ident(loader)operator(;) + operator(}) + + directive(public) type(void) ident(setLoader)operator(()type(ClassLoader) ident(loader)operator(\)) operator({) + comment(// Setting the loader needs to reset the class cache) + keyword(if)operator(()local_variable(this)operator(.)ident(loader) operator(!=) ident(loader)operator(\)) operator({) + local_variable(this)operator(.)ident(classCache) operator(=) keyword(new) ident(ClassCache)operator(<)ident(Script)operator(>)operator(()ident(loader)operator(,) local_variable(this)operator(.)ident(classCache)operator(.)ident(getMax)operator(()operator(\))operator(\))operator(;) + operator(}) + local_variable(this)operator(.)ident(loader) operator(=) ident(loader)operator(;) + operator(}) + + directive(public) type(String)type([]) ident(getArgv)operator(()operator(\)) operator({) + keyword(return) ident(argv)operator(;) + operator(}) + + directive(public) type(void) ident(setArgv)operator(()type(String)type([]) ident(argv)operator(\)) operator({) + local_variable(this)operator(.)ident(argv) operator(=) ident(argv)operator(;) + operator(}) + + directive(public) type(String) ident(getJRubyHome)operator(()operator(\)) operator({) + keyword(if) operator(()ident(jrubyHome) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(Ruby)operator(.)ident(isSecurityRestricted)operator(()operator(\))operator(\)) operator({) + keyword(return) string<delimiter(")content(SECURITY RESTRICTED)delimiter(")>operator(;) + operator(}) + ident(jrubyHome) operator(=) ident(verifyHome)operator(()ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(jruby.home)delimiter(")>operator(,) + ident(SafePropertyAccessor)operator(.)ident(getProperty)operator(()string<delimiter(")content(user.home)delimiter(")>operator(\)) operator(+) string<delimiter(")content(/.jruby)delimiter(")>operator(\))operator(\))operator(;) + + keyword(try) operator({) + comment(// This comment also in rbConfigLibrary) + comment(// Our shell scripts pass in non-canonicalized paths, but even if we didn't) + comment(// anyone who did would become unhappy because Ruby apps expect no relative) + comment(// operators in the pathname (rubygems, for example\).) + ident(jrubyHome) operator(=) keyword(new) ident(NormalizedFile)operator(()ident(jrubyHome)operator(\))operator(.)ident(getCanonicalPath)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) operator(}) + + ident(jrubyHome) operator(=) keyword(new) ident(NormalizedFile)operator(()ident(jrubyHome)operator(\))operator(.)ident(getAbsolutePath)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(jrubyHome)operator(;) + operator(}) + + directive(public) type(void) ident(setJRubyHome)operator(()type(String) ident(home)operator(\)) operator({) + ident(jrubyHome) operator(=) ident(verifyHome)operator(()ident(home)operator(\))operator(;) + operator(}) + + comment(// We require the home directory to be absolute) + directive(private) type(String) ident(verifyHome)operator(()type(String) ident(home)operator(\)) operator({) + keyword(if) operator(()ident(home)operator(.)ident(equals)operator(()string<delimiter(")content(.)delimiter(")>operator(\))operator(\)) operator({) + ident(home) operator(=) type(System)operator(.)ident(getProperty)operator(()string<delimiter(")content(user.dir)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(home)operator(.)ident(startsWith)operator(()string<delimiter(")content(file:)delimiter(")>operator(\))operator(\)) operator({) + ident(NormalizedFile) ident(f) operator(=) keyword(new) ident(NormalizedFile)operator(()ident(home)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(f)operator(.)ident(isAbsolute)operator(()operator(\))operator(\)) operator({) + ident(home) operator(=) ident(f)operator(.)ident(getAbsolutePath)operator(()operator(\))operator(;) + operator(}) + ident(f)operator(.)ident(mkdirs)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(home)operator(;) + operator(}) + + directive(private) type(class) class(ArgumentProcessor) operator({) + directive(private) type(String)type([]) ident(arguments)operator(;) + directive(private) type(int) ident(argumentIndex) operator(=) integer(0)operator(;) + + directive(public) ident(ArgumentProcessor)operator(()type(String)type([]) ident(arguments)operator(\)) operator({) + local_variable(this)operator(.)ident(arguments) operator(=) ident(arguments)operator(;) + operator(}) + + directive(public) type(void) ident(processArguments)operator(()operator(\)) operator({) + keyword(while) operator(()ident(argumentIndex) operator(<) ident(arguments)operator(.)ident(length) operator(&&) ident(isInterpreterArgument)operator(()ident(arguments)operator([)ident(argumentIndex)operator(])operator(\))operator(\)) operator({) + ident(processArgument)operator(()operator(\))operator(;) + ident(argumentIndex)operator(++)operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(hasInlineScript) operator(&&) ident(scriptFileName) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(argumentIndex) operator(<) ident(arguments)operator(.)ident(length)operator(\)) operator({) + ident(setScriptFileName)operator(()ident(arguments)operator([)ident(argumentIndex)operator(])operator(\))operator(;) comment(//consume the file name) + ident(argumentIndex)operator(++)operator(;) + operator(}) + operator(}) + + ident(processArgv)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(processArgv)operator(()operator(\)) operator({) + type(List)operator(<)type(String)operator(>) ident(arglist) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + keyword(for) operator(()operator(;) ident(argumentIndex) operator(<) ident(arguments)operator(.)ident(length)operator(;) ident(argumentIndex)operator(++)operator(\)) operator({) + type(String) ident(arg) operator(=) ident(arguments)operator([)ident(argumentIndex)operator(])operator(;) + keyword(if) operator(()ident(argvGlobalsOn) operator(&&) ident(arg)operator(.)ident(startsWith)operator(()string<delimiter(")content(-)delimiter(")>operator(\))operator(\)) operator({) + ident(arg) operator(=) ident(arg)operator(.)ident(substring)operator(()integer(1)operator(\))operator(;) + keyword(if) operator(()ident(arg)operator(.)ident(indexOf)operator(()string<delimiter(')content(=)delimiter(')>operator(\)) operator(>) integer(0)operator(\)) operator({) + type(String)type([]) ident(keyvalue) operator(=) ident(arg)operator(.)ident(split)operator(()string<delimiter(")content(=)delimiter(")>operator(,) integer(2)operator(\))operator(;) + ident(optionGlobals)operator(.)ident(put)operator(()ident(keyvalue)operator([)integer(0)operator(])operator(,) ident(keyvalue)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(optionGlobals)operator(.)ident(put)operator(()ident(arg)operator(,) keyword(null)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(argvGlobalsOn) operator(=) keyword(false)operator(;) + ident(arglist)operator(.)ident(add)operator(()ident(arg)operator(\))operator(;) + operator(}) + operator(}) + + comment(// Remaining arguments are for the script itself) + ident(argv) operator(=) ident(arglist)operator(.)ident(toArray)operator(()keyword(new) type(String)operator([)ident(arglist)operator(.)ident(size)operator(()operator(\))operator(])operator(\))operator(;) + operator(}) + + directive(private) type(boolean) ident(isInterpreterArgument)operator(()type(String) ident(argument)operator(\)) operator({) + keyword(return) operator(()ident(argument)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(-)delimiter(')> operator(||) ident(argument)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(+)delimiter(')>operator(\)) operator(&&) operator(!)ident(endOfArguments)operator(;) + operator(}) + + directive(private) type(String) ident(getArgumentError)operator(()type(String) ident(additionalError)operator(\)) operator({) + keyword(return) string<delimiter(")content(jruby: invalid argument)char(\\n)delimiter(")> operator(+) ident(additionalError) operator(+) string<delimiter(")char(\\n)delimiter(")>operator(;) + operator(}) + + directive(private) type(void) ident(processArgument)operator(()operator(\)) operator({) + type(String) ident(argument) operator(=) ident(arguments)operator([)ident(argumentIndex)operator(])operator(;) + ident(FOR) operator(:) keyword(for) operator(()ident(characterIndex) operator(=) integer(1)operator(;) ident(characterIndex) operator(<) ident(argument)operator(.)ident(length)operator(()operator(\))operator(;) ident(characterIndex)operator(++)operator(\)) operator({) + keyword(switch) operator(()ident(argument)operator(.)ident(charAt)operator(()ident(characterIndex)operator(\))operator(\)) operator({) + keyword(case) string<delimiter(')content(0)delimiter(')>operator(:) operator({) + type(String) ident(temp) operator(=) ident(grabOptionalValue)operator(()operator(\))operator(;) + keyword(if) operator(()keyword(null) operator(==) ident(temp)operator(\)) operator({) + ident(recordSeparator) operator(=) string<delimiter(")char(\\u0000)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(temp)operator(.)ident(equals)operator(()string<delimiter(")content(0)delimiter(")>operator(\))operator(\)) operator({) + ident(recordSeparator) operator(=) string<delimiter(")char(\\n)char(\\n)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(temp)operator(.)ident(equals)operator(()string<delimiter(")content(777)delimiter(")>operator(\))operator(\)) operator({) + ident(recordSeparator) operator(=) string<delimiter(")char(\\uFFFF)delimiter(")>operator(;) comment(// Specify something that can't separate) + operator(}) keyword(else) operator({) + keyword(try) operator({) + type(int) ident(val) operator(=) type(Integer)operator(.)ident(parseInt)operator(()ident(temp)operator(,) integer(8)operator(\))operator(;) + ident(recordSeparator) operator(=) string<delimiter(")delimiter(")> operator(+) operator(()type(char)operator(\)) ident(val)operator(;) + operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({) + ident(MainExitException) ident(mee) operator(=) keyword(new) ident(MainExitException)operator(()integer(1)operator(,) ident(getArgumentError)operator(()string<delimiter(")content( -0 must be followed by either 0, 777, or a valid octal value)delimiter(")>operator(\))operator(\))operator(;) + ident(mee)operator(.)ident(setUsageError)operator(()keyword(true)operator(\))operator(;) + keyword(throw) ident(mee)operator(;) + operator(}) + operator(}) + keyword(break) ident(FOR)operator(;) + operator(}) + keyword(case) string<delimiter(')content(a)delimiter(')>operator(:) + ident(split) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(b)delimiter(')>operator(:) + ident(benchmarking) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(c)delimiter(')>operator(:) + ident(shouldCheckSyntax) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(C)delimiter(')>operator(:) + keyword(try) operator({) + type(String) ident(saved) operator(=) ident(grabValue)operator(()ident(getArgumentError)operator(()string<delimiter(")content( -C must be followed by a directory expression)delimiter(")>operator(\))operator(\))operator(;) + type(File) ident(base) operator(=) keyword(new) type(File)operator(()ident(currentDirectory)operator(\))operator(;) + type(File) ident(newDir) operator(=) keyword(new) type(File)operator(()ident(saved)operator(\))operator(;) + keyword(if) operator(()ident(newDir)operator(.)ident(isAbsolute)operator(()operator(\))operator(\)) operator({) + ident(currentDirectory) operator(=) ident(newDir)operator(.)ident(getCanonicalPath)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(currentDirectory) operator(=) keyword(new) type(File)operator(()ident(base)operator(,) ident(newDir)operator(.)ident(getPath)operator(()operator(\))operator(\))operator(.)ident(getCanonicalPath)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)operator(()keyword(new) type(File)operator(()ident(currentDirectory)operator(\))operator(.)ident(isDirectory)operator(()operator(\))operator(\))operator(\)) operator({) + ident(MainExitException) ident(mee) operator(=) keyword(new) ident(MainExitException)operator(()integer(1)operator(,) string<delimiter(")content(jruby: Can't chdir to )delimiter(")> operator(+) ident(saved) operator(+) string<delimiter(")content( (fatal\))delimiter(")>operator(\))operator(;) + ident(mee)operator(.)ident(setUsageError)operator(()keyword(true)operator(\))operator(;) + keyword(throw) ident(mee)operator(;) + operator(}) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + ident(MainExitException) ident(mee) operator(=) keyword(new) ident(MainExitException)operator(()integer(1)operator(,) ident(getArgumentError)operator(()string<delimiter(")content( -C must be followed by a valid directory)delimiter(")>operator(\))operator(\))operator(;) + ident(mee)operator(.)ident(setUsageError)operator(()keyword(true)operator(\))operator(;) + keyword(throw) ident(mee)operator(;) + operator(}) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(d)delimiter(')>operator(:) + ident(debug) operator(=) keyword(true)operator(;) + ident(verbose) operator(=) type(Boolean)operator(.)ident(TRUE)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(e)delimiter(')>operator(:) + ident(inlineScript)operator(.)ident(append)operator(()ident(grabValue)operator(()ident(getArgumentError)operator(()string<delimiter(")content( -e must be followed by an expression to evaluate)delimiter(")>operator(\))operator(\))operator(\))operator(;) + ident(inlineScript)operator(.)ident(append)operator(()string<delimiter(')content(\\n)delimiter(')>operator(\))operator(;) + ident(hasInlineScript) operator(=) keyword(true)operator(;) + keyword(break) ident(FOR)operator(;) + keyword(case) string<delimiter(')content(F)delimiter(')>operator(:) + ident(inputFieldSeparator) operator(=) ident(grabValue)operator(()ident(getArgumentError)operator(()string<delimiter(")content( -F must be followed by a pattern for input field separation)delimiter(")>operator(\))operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(h)delimiter(')>operator(:) + ident(shouldPrintUsage) operator(=) keyword(true)operator(;) + ident(shouldRunInterpreter) operator(=) keyword(false)operator(;) + keyword(break)operator(;) + comment(// FIXME: -i flag not supported) +comment(// case 'i' :) +comment(// break;) + keyword(case) string<delimiter(')content(I)delimiter(')>operator(:) + type(String) ident(s) operator(=) ident(grabValue)operator(()ident(getArgumentError)operator(()string<delimiter(")content(-I must be followed by a directory name to add to lib path)delimiter(")>operator(\))operator(\))operator(;) + type(String)type([]) ident(ls) operator(=) ident(s)operator(.)ident(split)operator(()ident(java)operator(.)ident(io)operator(.)ident(File)operator(.)ident(pathSeparator)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(ls)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(loadPaths)operator(.)ident(add)operator(()ident(ls)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + keyword(break) ident(FOR)operator(;) + keyword(case) string<delimiter(')content(K)delimiter(')>operator(:) + comment(// FIXME: No argument seems to work for -K in MRI plus this should not) + comment(// siphon off additional args 'jruby -K ~/scripts/foo'. Also better error) + comment(// processing.) + type(String) ident(eArg) operator(=) ident(grabValue)operator(()ident(getArgumentError)operator(()string<delimiter(")content(provide a value for -K)delimiter(")>operator(\))operator(\))operator(;) + ident(kcode) operator(=) ident(KCode)operator(.)ident(create)operator(()keyword(null)operator(,) ident(eArg)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(l)delimiter(')>operator(:) + ident(processLineEnds) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(n)delimiter(')>operator(:) + ident(assumeLoop) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(p)delimiter(')>operator(:) + ident(assumePrinting) operator(=) keyword(true)operator(;) + ident(assumeLoop) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(r)delimiter(')>operator(:) + ident(requiredLibraries)operator(.)ident(add)operator(()ident(grabValue)operator(()ident(getArgumentError)operator(()string<delimiter(")content(-r must be followed by a package to require)delimiter(")>operator(\))operator(\))operator(\))operator(;) + keyword(break) ident(FOR)operator(;) + keyword(case) string<delimiter(')content(s)delimiter(')> operator(:) + ident(argvGlobalsOn) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(S)delimiter(')>operator(:) + ident(runBinScript)operator(()operator(\))operator(;) + keyword(break) ident(FOR)operator(;) + keyword(case) string<delimiter(')content(T)delimiter(')> operator(:)operator({) + type(String) ident(temp) operator(=) ident(grabOptionalValue)operator(()operator(\))operator(;) + type(int) ident(value) operator(=) integer(1)operator(;) + + keyword(if)operator(()ident(temp)operator(!=)keyword(null)operator(\)) operator({) + keyword(try) operator({) + ident(value) operator(=) type(Integer)operator(.)ident(parseInt)operator(()ident(temp)operator(,) integer(8)operator(\))operator(;) + operator(}) keyword(catch)operator(()type(Exception) ident(e)operator(\)) operator({) + ident(value) operator(=) integer(1)operator(;) + operator(}) + operator(}) + + ident(safeLevel) operator(=) ident(value)operator(;) + + keyword(break) ident(FOR)operator(;) + operator(}) + keyword(case) string<delimiter(')content(v)delimiter(')>operator(:) + ident(verbose) operator(=) type(Boolean)operator(.)ident(TRUE)operator(;) + ident(setShowVersion)operator(()keyword(true)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(w)delimiter(')>operator(:) + ident(verbose) operator(=) type(Boolean)operator(.)ident(TRUE)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(W)delimiter(')>operator(:) operator({) + type(String) ident(temp) operator(=) ident(grabOptionalValue)operator(()operator(\))operator(;) + type(int) ident(value) operator(=) integer(2)operator(;) + keyword(if) operator(()keyword(null) operator(!=) ident(temp)operator(\)) operator({) + keyword(if) operator(()ident(temp)operator(.)ident(equals)operator(()string<delimiter(")content(2)delimiter(")>operator(\))operator(\)) operator({) + ident(value) operator(=) integer(2)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(temp)operator(.)ident(equals)operator(()string<delimiter(")content(1)delimiter(")>operator(\))operator(\)) operator({) + ident(value) operator(=) integer(1)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(temp)operator(.)ident(equals)operator(()string<delimiter(")content(0)delimiter(")>operator(\))operator(\)) operator({) + ident(value) operator(=) integer(0)operator(;) + operator(}) keyword(else) operator({) + ident(MainExitException) ident(mee) operator(=) keyword(new) ident(MainExitException)operator(()integer(1)operator(,) ident(getArgumentError)operator(()string<delimiter(")content( -W must be followed by either 0, 1, 2 or nothing)delimiter(")>operator(\))operator(\))operator(;) + ident(mee)operator(.)ident(setUsageError)operator(()keyword(true)operator(\))operator(;) + keyword(throw) ident(mee)operator(;) + operator(}) + operator(}) + keyword(switch) operator(()ident(value)operator(\)) operator({) + keyword(case) integer(0)operator(:) + ident(verbose) operator(=) keyword(null)operator(;) + keyword(break)operator(;) + keyword(case) integer(1)operator(:) + ident(verbose) operator(=) type(Boolean)operator(.)ident(FALSE)operator(;) + keyword(break)operator(;) + keyword(case) integer(2)operator(:) + ident(verbose) operator(=) type(Boolean)operator(.)ident(TRUE)operator(;) + keyword(break)operator(;) + operator(}) + + + keyword(break) ident(FOR)operator(;) + operator(}) + comment(// FIXME: -x flag not supported) +comment(// case 'x' :) +comment(// break;) + keyword(case) string<delimiter(')content(X)delimiter(')>operator(:) + type(String) ident(extendedOption) operator(=) ident(grabOptionalValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(extendedOption) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) keyword(new) ident(MainExitException)operator(()integer(0)operator(,) string<delimiter(")content(jruby: missing extended option, listing available options)char(\\n)delimiter(")> operator(+) ident(getExtendedHelp)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(extendedOption)operator(.)ident(equals)operator(()string<delimiter(")content(-O)delimiter(")>operator(\))operator(\)) operator({) + ident(objectSpaceEnabled) operator(=) keyword(false)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(extendedOption)operator(.)ident(equals)operator(()string<delimiter(")content(+O)delimiter(")>operator(\))operator(\)) operator({) + ident(objectSpaceEnabled) operator(=) keyword(true)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(extendedOption)operator(.)ident(equals)operator(()string<delimiter(")content(-C)delimiter(")>operator(\))operator(\)) operator({) + ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(OFF)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(extendedOption)operator(.)ident(equals)operator(()string<delimiter(")content(+C)delimiter(")>operator(\))operator(\)) operator({) + ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(FORCE)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(extendedOption)operator(.)ident(equals)operator(()string<delimiter(")content(-y)delimiter(")>operator(\))operator(\)) operator({) + ident(yarv) operator(=) keyword(true)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(extendedOption)operator(.)ident(equals)operator(()string<delimiter(")content(-Y)delimiter(")>operator(\))operator(\)) operator({) + ident(yarvCompile) operator(=) keyword(true)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(extendedOption)operator(.)ident(equals)operator(()string<delimiter(")content(-R)delimiter(")>operator(\))operator(\)) operator({) + ident(rubinius) operator(=) keyword(true)operator(;) + operator(}) keyword(else) operator({) + ident(MainExitException) ident(mee) operator(=) + keyword(new) ident(MainExitException)operator(()integer(1)operator(,) string<delimiter(")content(jruby: invalid extended option )delimiter(")> operator(+) ident(extendedOption) operator(+) string<delimiter(")content( (-X will list valid options\))char(\\n)delimiter(")>operator(\))operator(;) + ident(mee)operator(.)ident(setUsageError)operator(()keyword(true)operator(\))operator(;) + + keyword(throw) ident(mee)operator(;) + operator(}) + keyword(break) ident(FOR)operator(;) + keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) + keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--command)delimiter(")>operator(\)) operator(||) ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--bin)delimiter(")>operator(\))operator(\)) operator({) + ident(characterIndex) operator(=) ident(argument)operator(.)ident(length)operator(()operator(\))operator(;) + ident(runBinScript)operator(()operator(\))operator(;) + keyword(break)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--compat)delimiter(")>operator(\))operator(\)) operator({) + ident(characterIndex) operator(=) ident(argument)operator(.)ident(length)operator(()operator(\))operator(;) + ident(compatVersion) operator(=) ident(CompatVersion)operator(.)ident(getVersionFromString)operator(()ident(grabValue)operator(()ident(getArgumentError)operator(()string<delimiter(")content(--compat must be RUBY1_8 or RUBY1_9)delimiter(")>operator(\))operator(\))operator(\))operator(;) + keyword(if) operator(()ident(compatVersion) operator(==) keyword(null)operator(\)) operator({) + ident(compatVersion) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_8)operator(;) + operator(}) + keyword(break) ident(FOR)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--copyright)delimiter(")>operator(\))operator(\)) operator({) + ident(setShowCopyright)operator(()keyword(true)operator(\))operator(;) + ident(shouldRunInterpreter) operator(=) keyword(false)operator(;) + keyword(break) ident(FOR)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--debug)delimiter(")>operator(\))operator(\)) operator({) + ident(compileMode) operator(=) ident(CompileMode)operator(.)ident(OFF)operator(;) + ident(FULL_TRACE_ENABLED) operator(=) keyword(true)operator(;) + type(System)operator(.)ident(setProperty)operator(()string<delimiter(")content(jruby.reflection)delimiter(")>operator(,) string<delimiter(")content(true)delimiter(")>operator(\))operator(;) + keyword(break) ident(FOR)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--jdb)delimiter(")>operator(\))operator(\)) operator({) + ident(debug) operator(=) keyword(true)operator(;) + ident(verbose) operator(=) type(Boolean)operator(.)ident(TRUE)operator(;) + keyword(break)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--help)delimiter(")>operator(\))operator(\)) operator({) + ident(shouldPrintUsage) operator(=) keyword(true)operator(;) + ident(shouldRunInterpreter) operator(=) keyword(false)operator(;) + keyword(break)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--properties)delimiter(")>operator(\))operator(\)) operator({) + ident(shouldPrintProperties) operator(=) keyword(true)operator(;) + ident(shouldRunInterpreter) operator(=) keyword(false)operator(;) + keyword(break)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--version)delimiter(")>operator(\))operator(\)) operator({) + ident(setShowVersion)operator(()keyword(true)operator(\))operator(;) + keyword(break) ident(FOR)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--bytecode)delimiter(")>operator(\))operator(\)) operator({) + ident(setShowBytecode)operator(()keyword(true)operator(\))operator(;) + keyword(break) ident(FOR)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(argument)operator(.)ident(equals)operator(()string<delimiter(")content(--)delimiter(")>operator(\))operator(\)) operator({) + comment(// ruby interpreter compatibilty) + comment(// Usage: ruby [switches] [--] [programfile] [arguments]\)) + ident(endOfArguments) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + operator(}) + operator(}) + keyword(default)operator(:) + keyword(throw) keyword(new) ident(MainExitException)operator(()integer(1)operator(,) string<delimiter(")content(jruby: unknown option )delimiter(")> operator(+) ident(argument)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + directive(private) type(void) ident(runBinScript)operator(()operator(\)) operator({) + type(String) ident(scriptName) operator(=) ident(grabValue)operator(()string<delimiter(")content(jruby: provide a bin script to execute)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(scriptName)operator(.)ident(equals)operator(()string<delimiter(")content(irb)delimiter(")>operator(\))operator(\)) operator({) + ident(scriptName) operator(=) string<delimiter(")content(jirb)delimiter(")>operator(;) + operator(}) + + ident(scriptFileName) operator(=) ident(scriptName)operator(;) + + keyword(if) operator(()operator(!)keyword(new) type(File)operator(()ident(scriptFileName)operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + type(String) ident(jrubyHome) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()type(System)operator(.)ident(getProperty)operator(()string<delimiter(")content(user.dir)delimiter(")>operator(\))operator(,) ident(JRubyFile)operator(.)ident(getFileProperty)operator(()string<delimiter(")content(jruby.home)delimiter(")>operator(\))operator(\))operator(.)ident(getCanonicalPath)operator(()operator(\))operator(;) + ident(scriptFileName) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(jrubyHome) operator(+) ident(JRubyFile)operator(.)ident(separator) operator(+) string<delimiter(")content(bin)delimiter(")>operator(,) ident(scriptName)operator(\))operator(.)ident(getCanonicalPath)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(io)operator(\)) operator({) + ident(MainExitException) ident(mee) operator(=) keyword(new) ident(MainExitException)operator(()integer(1)operator(,) string<delimiter(")content(jruby: Can't determine script filename)delimiter(")>operator(\))operator(;) + ident(mee)operator(.)ident(setUsageError)operator(()keyword(true)operator(\))operator(;) + keyword(throw) ident(mee)operator(;) + operator(}) + operator(}) + + comment(// route 'gem' through ruby code in case we're running out of the complete jar) + keyword(if) operator(()ident(scriptName)operator(.)ident(equals)operator(()string<delimiter(")content(gem)delimiter(")>operator(\)) operator(||) operator(!)keyword(new) type(File)operator(()ident(scriptFileName)operator(\))operator(.)ident(exists)operator(()operator(\))operator(\)) operator({) + ident(requiredLibraries)operator(.)ident(add)operator(()string<delimiter(")content(jruby/commands)delimiter(")>operator(\))operator(;) + ident(inlineScript)operator(.)ident(append)operator(()string<delimiter(")content(JRuby::Commands.)delimiter(")> operator(+) ident(scriptName)operator(\))operator(;) + ident(inlineScript)operator(.)ident(append)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))operator(;) + ident(hasInlineScript) operator(=) keyword(true)operator(;) + operator(}) + ident(endOfArguments) operator(=) keyword(true)operator(;) + operator(}) + + directive(private) type(String) ident(grabValue)operator(()type(String) ident(errorMessage)operator(\)) operator({) + ident(characterIndex)operator(++)operator(;) + keyword(if) operator(()ident(characterIndex) operator(<) ident(arguments)operator([)ident(argumentIndex)operator(])operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(arguments)operator([)ident(argumentIndex)operator(])operator(.)ident(substring)operator(()ident(characterIndex)operator(\))operator(;) + operator(}) + ident(argumentIndex)operator(++)operator(;) + keyword(if) operator(()ident(argumentIndex) operator(<) ident(arguments)operator(.)ident(length)operator(\)) operator({) + keyword(return) ident(arguments)operator([)ident(argumentIndex)operator(])operator(;) + operator(}) + + ident(MainExitException) ident(mee) operator(=) keyword(new) ident(MainExitException)operator(()integer(1)operator(,) ident(errorMessage)operator(\))operator(;) + ident(mee)operator(.)ident(setUsageError)operator(()keyword(true)operator(\))operator(;) + + keyword(throw) ident(mee)operator(;) + operator(}) + + directive(private) type(String) ident(grabOptionalValue)operator(()operator(\)) operator({) + ident(characterIndex)operator(++)operator(;) + keyword(if) operator(()ident(characterIndex) operator(<) ident(arguments)operator([)ident(argumentIndex)operator(])operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(arguments)operator([)ident(argumentIndex)operator(])operator(.)ident(substring)operator(()ident(characterIndex)operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + operator(}) + + directive(public) type(byte)type([]) ident(inlineScript)operator(()operator(\)) operator({) + keyword(return) ident(inlineScript)operator(.)ident(toString)operator(()operator(\))operator(.)ident(getBytes)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(List)operator(<)type(String)operator(>) ident(requiredLibraries)operator(()operator(\)) operator({) + keyword(return) ident(requiredLibraries)operator(;) + operator(}) + + directive(public) type(List)operator(<)type(String)operator(>) ident(loadPaths)operator(()operator(\)) operator({) + keyword(return) ident(loadPaths)operator(;) + operator(}) + + directive(public) type(boolean) ident(shouldRunInterpreter)operator(()operator(\)) operator({) + keyword(if)operator(()ident(isShowVersion)operator(()operator(\)) operator(&&) operator(()ident(hasInlineScript) operator(||) ident(scriptFileName) operator(!=) keyword(null)operator(\))operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + keyword(return) ident(isShouldRunInterpreter)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(shouldPrintUsage)operator(()operator(\)) operator({) + keyword(return) ident(shouldPrintUsage)operator(;) + operator(}) + + directive(public) type(boolean) ident(shouldPrintProperties)operator(()operator(\)) operator({) + keyword(return) ident(shouldPrintProperties)operator(;) + operator(}) + + directive(private) type(boolean) ident(isSourceFromStdin)operator(()operator(\)) operator({) + keyword(return) ident(getScriptFileName)operator(()operator(\)) operator(==) keyword(null)operator(;) + operator(}) + + directive(public) type(boolean) ident(isInlineScript)operator(()operator(\)) operator({) + keyword(return) ident(hasInlineScript)operator(;) + operator(}) + + directive(public) type(InputStream) ident(getScriptSource)operator(()operator(\)) operator({) + keyword(try) operator({) + comment(// KCode.NONE is used because KCODE does not affect parse in Ruby 1.8) + comment(// if Ruby 2.0 encoding pragmas are implemented, this will need to change) + keyword(if) operator(()ident(hasInlineScript)operator(\)) operator({) + keyword(return) keyword(new) type(ByteArrayInputStream)operator(()ident(inlineScript)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(isSourceFromStdin)operator(()operator(\))operator(\)) operator({) + comment(// can't use -v and stdin) + keyword(if) operator(()ident(isShowVersion)operator(()operator(\))operator(\)) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + keyword(return) ident(getInput)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + type(File) ident(file) operator(=) ident(JRubyFile)operator(.)ident(create)operator(()ident(getCurrentDirectory)operator(()operator(\))operator(,) ident(getScriptFileName)operator(()operator(\))operator(\))operator(;) + keyword(return) keyword(new) type(BufferedInputStream)operator(()keyword(new) type(FileInputStream)operator(()ident(file)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) keyword(new) ident(MainExitException)operator(()integer(1)operator(,) string<delimiter(")content(Error opening script file: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(String) ident(displayedFileName)operator(()operator(\)) operator({) + keyword(if) operator(()ident(hasInlineScript)operator(\)) operator({) + keyword(if) operator(()ident(scriptFileName) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(scriptFileName)operator(;) + operator(}) keyword(else) operator({) + keyword(return) string<delimiter(")content(-e)delimiter(")>operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(isSourceFromStdin)operator(()operator(\))operator(\)) operator({) + keyword(return) string<delimiter(")content(-)delimiter(")>operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(getScriptFileName)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(setScriptFileName)operator(()type(String) ident(scriptFileName)operator(\)) operator({) + local_variable(this)operator(.)ident(scriptFileName) operator(=) ident(scriptFileName)operator(;) + operator(}) + + directive(public) type(String) ident(getScriptFileName)operator(()operator(\)) operator({) + keyword(return) ident(scriptFileName)operator(;) + operator(}) + + directive(public) type(boolean) ident(isBenchmarking)operator(()operator(\)) operator({) + keyword(return) ident(benchmarking)operator(;) + operator(}) + + directive(public) type(boolean) ident(isAssumeLoop)operator(()operator(\)) operator({) + keyword(return) ident(assumeLoop)operator(;) + operator(}) + + directive(public) type(boolean) ident(isAssumePrinting)operator(()operator(\)) operator({) + keyword(return) ident(assumePrinting)operator(;) + operator(}) + + directive(public) type(boolean) ident(isProcessLineEnds)operator(()operator(\)) operator({) + keyword(return) ident(processLineEnds)operator(;) + operator(}) + + directive(public) type(boolean) ident(isSplit)operator(()operator(\)) operator({) + keyword(return) ident(split)operator(;) + operator(}) + + directive(public) type(boolean) ident(isVerbose)operator(()operator(\)) operator({) + keyword(return) ident(verbose) operator(==) type(Boolean)operator(.)ident(TRUE)operator(;) + operator(}) + + directive(public) type(Boolean) ident(getVerbose)operator(()operator(\)) operator({) + keyword(return) ident(verbose)operator(;) + operator(}) + + directive(public) type(boolean) ident(isDebug)operator(()operator(\)) operator({) + keyword(return) ident(debug)operator(;) + operator(}) + + directive(public) type(boolean) ident(isShowVersion)operator(()operator(\)) operator({) + keyword(return) ident(showVersion)operator(;) + operator(}) + + directive(public) type(boolean) ident(isShowBytecode)operator(()operator(\)) operator({) + keyword(return) ident(showBytecode)operator(;) + operator(}) + + directive(public) type(boolean) ident(isShowCopyright)operator(()operator(\)) operator({) + keyword(return) ident(showCopyright)operator(;) + operator(}) + + directive(protected) type(void) ident(setShowVersion)operator(()type(boolean) ident(showVersion)operator(\)) operator({) + local_variable(this)operator(.)ident(showVersion) operator(=) ident(showVersion)operator(;) + operator(}) + + directive(protected) type(void) ident(setShowBytecode)operator(()type(boolean) ident(showBytecode)operator(\)) operator({) + local_variable(this)operator(.)ident(showBytecode) operator(=) ident(showBytecode)operator(;) + operator(}) + + directive(protected) type(void) ident(setShowCopyright)operator(()type(boolean) ident(showCopyright)operator(\)) operator({) + local_variable(this)operator(.)ident(showCopyright) operator(=) ident(showCopyright)operator(;) + operator(}) + + directive(public) type(boolean) ident(isShouldRunInterpreter)operator(()operator(\)) operator({) + keyword(return) ident(shouldRunInterpreter)operator(;) + operator(}) + + directive(public) type(boolean) ident(isShouldCheckSyntax)operator(()operator(\)) operator({) + keyword(return) ident(shouldCheckSyntax)operator(;) + operator(}) + + directive(public) type(boolean) ident(isYARVEnabled)operator(()operator(\)) operator({) + keyword(return) ident(yarv)operator(;) + operator(}) + + directive(public) type(String) ident(getInputFieldSeparator)operator(()operator(\)) operator({) + keyword(return) ident(inputFieldSeparator)operator(;) + operator(}) + + directive(public) type(boolean) ident(isRubiniusEnabled)operator(()operator(\)) operator({) + keyword(return) ident(rubinius)operator(;) + operator(}) + + directive(public) type(boolean) ident(isYARVCompileEnabled)operator(()operator(\)) operator({) + keyword(return) ident(yarvCompile)operator(;) + operator(}) + + directive(public) ident(KCode) ident(getKCode)operator(()operator(\)) operator({) + keyword(return) ident(kcode)operator(;) + operator(}) + + directive(public) type(String) ident(getRecordSeparator)operator(()operator(\)) operator({) + keyword(return) ident(recordSeparator)operator(;) + operator(}) + + directive(public) type(int) ident(getSafeLevel)operator(()operator(\)) operator({) + keyword(return) ident(safeLevel)operator(;) + operator(}) + + directive(public) type(void) ident(setRecordSeparator)operator(()type(String) ident(recordSeparator)operator(\)) operator({) + local_variable(this)operator(.)ident(recordSeparator) operator(=) ident(recordSeparator)operator(;) + operator(}) + + directive(public) ident(ClassCache) ident(getClassCache)operator(()operator(\)) operator({) + keyword(return) ident(classCache)operator(;) + operator(}) + + directive(public) type(void) ident(setClassCache)operator(()ident(ClassCache) ident(classCache)operator(\)) operator({) + local_variable(this)operator(.)ident(classCache) operator(=) ident(classCache)operator(;) + operator(}) + + directive(public) type(Map) ident(getOptionGlobals)operator(()operator(\)) operator({) + keyword(return) ident(optionGlobals)operator(;) + operator(}) + + directive(public) type(boolean) ident(isManagementEnabled)operator(()operator(\)) operator({) + keyword(return) ident(managementEnabled)operator(;) + operator(}) + + directive(public) type(Set) ident(getExcludedMethods)operator(()operator(\)) operator({) + keyword(return) ident(excludedMethods)operator(;) + operator(}) + +operator(}) +comment(/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Charles O Nutter <headius@headius.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.BlockBody)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) + +comment(/** Implementation of the Integer class. + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Integer)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Numeric)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Precision)delimiter(")>operator(\)) +directive(public) directive(abstract) type(class) class(RubyInteger) directive(extends) ident(RubyNumeric) operator({) + + directive(public) directive(static) ident(RubyClass) ident(createIntegerClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(integer) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Integer)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNumeric)operator(()operator(\))operator(,) + ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setInteger)operator(()ident(integer)operator(\))operator(;) + ident(integer)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyInteger)operator(;) + operator(}) + operator(})operator(;) + + ident(integer)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(undefineMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + + ident(integer)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getPrecision)operator(()operator(\))operator(\))operator(;) + + ident(integer)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyInteger)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(integer)operator(;) + operator(}) + + directive(public) ident(RubyInteger)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyInteger)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) type(boolean) ident(useObjectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(,) ident(useObjectSpace)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyInteger) ident(convertToInteger)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(// conversion) + directive(protected) ident(RubyFloat) ident(toFloat)operator(()operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/* ================ + * Instance Methods + * ================ + */) + + comment(/** int_int_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(integer?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(integer_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** int_upto + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(upto)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(upto)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(to)operator(,) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(to) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(RubyFixnum) ident(toFixnum) operator(=) operator(()ident(RubyFixnum)operator(\)) ident(to)operator(;) + directive(final) type(long) ident(toValue) operator(=) ident(toFixnum)operator(.)ident(getLongValue)operator(()operator(\))operator(;) + directive(final) type(long) ident(fromValue) operator(=) ident(getLongValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(getBody)operator(()operator(\))operator(.)ident(getArgumentType)operator(()operator(\)) operator(==) ident(BlockBody)operator(.)ident(ZERO_ARGS)operator(\)) operator({) + directive(final) ident(IRubyObject) ident(nil) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(for) operator(()type(long) ident(i) operator(=) ident(fromValue)operator(;) ident(i) operator(<=) ident(toValue)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(nil)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(for) operator(()type(long) ident(i) operator(=) ident(fromValue)operator(;) ident(i) operator(<=) ident(toValue)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + ident(RubyNumeric) ident(i) operator(=) local_variable(this)operator(;) + + keyword(while) operator(()keyword(true)operator(\)) operator({) + keyword(if) operator(()ident(i)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_GT)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(to)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(i)operator(\))operator(;) + ident(i) operator(=) operator(()ident(RubyNumeric)operator(\)) ident(i)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_PLUS)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** int_downto + * + */) + comment(// TODO: Make callCoerced work in block context...then fix downto, step, and upto.) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(downto)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(downto)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(to)operator(,) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(to) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(RubyFixnum) ident(toFixnum) operator(=) operator(()ident(RubyFixnum)operator(\)) ident(to)operator(;) + directive(final) type(long) ident(toValue) operator(=) ident(toFixnum)operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(block)operator(.)ident(getBody)operator(()operator(\))operator(.)ident(getArgumentType)operator(()operator(\)) operator(==) ident(BlockBody)operator(.)ident(ZERO_ARGS)operator(\)) operator({) + directive(final) ident(IRubyObject) ident(nil) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(for) operator(()type(long) ident(i) operator(=) ident(getLongValue)operator(()operator(\))operator(;) ident(i) operator(>=) ident(toValue)operator(;) ident(i)operator(--)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(nil)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(for) operator(()type(long) ident(i) operator(=) ident(getLongValue)operator(()operator(\))operator(;) ident(i) operator(>=) ident(toValue)operator(;) ident(i)operator(--)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + ident(RubyNumeric) ident(i) operator(=) local_variable(this)operator(;) + + keyword(while) operator(()keyword(true)operator(\)) operator({) + keyword(if) operator(()ident(i)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_LT)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(to)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(i)operator(\))operator(;) + ident(i) operator(=) operator(()ident(RubyNumeric)operator(\)) ident(i)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_MINUS)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(times)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(times)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + directive(final) type(long) ident(value) operator(=) ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(block)operator(.)ident(getBody)operator(()operator(\))operator(.)ident(getArgumentType)operator(()operator(\)) operator(==) ident(BlockBody)operator(.)ident(ZERO_ARGS)operator(\)) operator({) + directive(final) ident(IRubyObject) ident(nil) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(for) operator(()type(long) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(value)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(nil)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(for) operator(()type(long) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(value)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + ident(RubyNumeric) ident(i) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + keyword(while) operator(()keyword(true)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(i)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_LT)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) local_variable(this)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(i)operator(\))operator(;) + ident(i) operator(=) operator(()ident(RubyNumeric)operator(\)) ident(i)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_PLUS)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** int_succ + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(succ)delimiter(")>operator(,) string<delimiter(")content(next)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(succ)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getLongValue)operator(()operator(\)) operator(+) integer(1L)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_PLUS)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** int_chr + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chr)delimiter(")>operator(\)) + directive(public) ident(RubyString) ident(chr)operator(()operator(\)) operator({) + keyword(if) operator(()ident(getLongValue)operator(()operator(\)) operator(<) integer(0) operator(||) ident(getLongValue)operator(()operator(\)) operator(>) hex(0xff)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()local_variable(this)operator(.)ident(toString)operator(()operator(\)) operator(+) string<delimiter(")content( out of char range)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) keyword(new) ident(ByteList)operator(()keyword(new) type(byte)type([])operator({)operator(()type(byte)operator(\))ident(getLongValue)operator(()operator(\))operator(})operator(,) keyword(false)operator(\))operator(\))operator(;) + operator(}) + + comment(/** int_to_i + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_i)delimiter(")>operator(,) string<delimiter(")content(to_int)delimiter(")>operator(,) string<delimiter(")content(floor)delimiter(")>operator(,) string<delimiter(")content(ceil)delimiter(")>operator(,) string<delimiter(")content(round)delimiter(")>operator(,) string<delimiter(")content(truncate)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyInteger) ident(to_i)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** integer_to_r + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_r)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(to_r)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalCanonicalize)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(odd?)delimiter(")>operator(})operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(odd_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(if)operator(()ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(2)operator(\))operator(\)) operator(!=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(even?)delimiter(")>operator(})operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(even_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(if)operator(()ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(2)operator(\))operator(\)) operator(==) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) directive(static) ident(IRubyObject) ident(pred)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(\))operator(;) + operator(}) + + + comment(/* ================ + * Singleton Methods + * ================ + */) + + comment(/** rb_int_induced_from + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(induced_from)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum) operator(||) ident(other) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(other)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFloat) operator(||) ident(other) keyword(instanceof) ident(RubyRational)operator(\)) operator({) + keyword(return) ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_I)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(() + string<delimiter(")content(failed to convert )delimiter(")> operator(+) ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( into Integer)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2006 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Evan Buswell <ebuswell@gmail.com> + * Copyright (C\) 2007 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.EOFException)operator(;) +keyword(import) include(java.io.FileDescriptor)operator(;) +keyword(import) include(java.io.FilterInputStream)operator(;) +keyword(import) include(java.io.FilterOutputStream)operator(;) +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.InputStream)operator(;) +keyword(import) include(java.io.OutputStream)operator(;) +keyword(import) include(java.lang.ref.Reference)operator(;) +keyword(import) include(java.lang.ref.WeakReference)operator(;) +keyword(import) include(java.nio.channels.Channel)operator(;) +keyword(import) include(java.nio.channels.Channels)operator(;) +keyword(import) include(java.nio.channels.FileChannel)operator(;) +keyword(import) include(java.nio.channels.Pipe)operator(;) +keyword(import) include(java.nio.channels.SelectableChannel)operator(;) +keyword(import) include(java.nio.channels.SelectionKey)operator(;) +keyword(import) include(java.nio.channels.Selector)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.HashSet)operator(;) +keyword(import) include(java.util.Iterator)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.Set)operator(;) + +keyword(import) include(java.util.concurrent.atomic.AtomicInteger)operator(;) +keyword(import) include(org.jruby.anno.FrameField)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.ext.posix.util.FieldAccess)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallType)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.io.Stream)operator(;) +keyword(import) include(org.jruby.util.io.ModeFlags)operator(;) +keyword(import) include(org.jruby.util.ShellLauncher)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) +keyword(import) include(org.jruby.util.io.BadDescriptorException)operator(;) +keyword(import) include(org.jruby.util.io.ChannelStream)operator(;) +keyword(import) include(org.jruby.util.io.InvalidValueException)operator(;) +keyword(import) include(org.jruby.util.io.PipeException)operator(;) +keyword(import) include(org.jruby.util.io.FileExistsException)operator(;) +keyword(import) include(org.jruby.util.io.STDIO)operator(;) +keyword(import) include(org.jruby.util.io.OpenFile)operator(;) +keyword(import) include(org.jruby.util.io.ChannelDescriptor)operator(;) + +keyword(import) include(static) include(org.jruby.CompatVersion)operator(.)operator(*)operator(;) + +comment(/** + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(IO)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Enumerable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyIO) directive(extends) ident(RubyObject) operator({) + directive(protected) ident(OpenFile) ident(openFile)operator(;) + directive(protected) type(List)operator(<)ident(RubyThread)operator(>) ident(blockingThreads)operator(;) + + directive(public) type(void) ident(registerDescriptor)operator(()ident(ChannelDescriptor) ident(descriptor)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getDescriptors)operator(()operator(\))operator(.)ident(put)operator(()keyword(new) type(Integer)operator(()ident(descriptor)operator(.)ident(getFileno)operator(()operator(\))operator(\))operator(,) keyword(new) type(WeakReference)operator(<)ident(ChannelDescriptor)operator(>)operator(()ident(descriptor)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(unregisterDescriptor)operator(()type(int) ident(aFileno)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getDescriptors)operator(()operator(\))operator(.)ident(remove)operator(()keyword(new) type(Integer)operator(()ident(aFileno)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(ChannelDescriptor) ident(getDescriptorByFileno)operator(()type(int) ident(aFileno)operator(\)) operator({) + type(Reference)operator(<)ident(ChannelDescriptor)operator(>) ident(reference) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getDescriptors)operator(()operator(\))operator(.)ident(get)operator(()keyword(new) type(Integer)operator(()ident(aFileno)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(reference) operator(==) keyword(null)operator(\)) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + keyword(return) ident(reference)operator(.)ident(get)operator(()operator(\))operator(;) + operator(}) + + comment(// FIXME can't use static; would interfere with other runtimes in the same JVM) + directive(protected) directive(static) type(AtomicInteger) ident(filenoIndex) operator(=) keyword(new) type(AtomicInteger)operator(()integer(2)operator(\))operator(;) + + directive(public) directive(static) type(int) ident(getNewFileno)operator(()operator(\)) operator({) + keyword(return) ident(filenoIndex)operator(.)ident(incrementAndGet)operator(()operator(\))operator(;) + operator(}) + + comment(// This should only be called by this and RubyFile.) + comment(// It allows this object to be created without a IOHandler.) + directive(public) ident(RubyIO)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(RubyIO)operator(()ident(Ruby) ident(runtime)operator(,) type(OutputStream) ident(outputStream)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(\))operator(;) + + comment(// We only want IO objects with valid streams (better to error now\). ) + keyword(if) operator(()ident(outputStream) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(Opening invalid stream)delimiter(")>operator(\))operator(;) + operator(}) + + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(openFile)operator(.)ident(setMainStream)operator(()keyword(new) ident(ChannelStream)operator(()ident(runtime)operator(,) keyword(new) ident(ChannelDescriptor)operator(()type(Channels)operator(.)ident(newChannel)operator(()ident(outputStream)operator(\))operator(,) ident(getNewFileno)operator(()operator(\))operator(,) keyword(new) type(FileDescriptor)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + + ident(openFile)operator(.)ident(setMode)operator(()ident(OpenFile)operator(.)ident(WRITABLE) operator(|) ident(OpenFile)operator(.)ident(APPEND)operator(\))operator(;) + + ident(registerDescriptor)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RubyIO)operator(()ident(Ruby) ident(runtime)operator(,) type(InputStream) ident(inputStream)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(inputStream) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(Opening invalid stream)delimiter(")>operator(\))operator(;) + operator(}) + + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(openFile)operator(.)ident(setMainStream)operator(()keyword(new) ident(ChannelStream)operator(()ident(runtime)operator(,) keyword(new) ident(ChannelDescriptor)operator(()type(Channels)operator(.)ident(newChannel)operator(()ident(inputStream)operator(\))operator(,) ident(getNewFileno)operator(()operator(\))operator(,) keyword(new) type(FileDescriptor)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + + ident(openFile)operator(.)ident(setMode)operator(()ident(OpenFile)operator(.)ident(READABLE)operator(\))operator(;) + + ident(registerDescriptor)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RubyIO)operator(()ident(Ruby) ident(runtime)operator(,) type(Channel) ident(channel)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(\))operator(;) + + comment(// We only want IO objects with valid streams (better to error now\). ) + keyword(if) operator(()ident(channel) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(Opening invalid stream)delimiter(")>operator(\))operator(;) + operator(}) + + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(openFile)operator(.)ident(setMainStream)operator(()keyword(new) ident(ChannelStream)operator(()ident(runtime)operator(,) keyword(new) ident(ChannelDescriptor)operator(()ident(channel)operator(,) ident(getNewFileno)operator(()operator(\))operator(,) keyword(new) type(FileDescriptor)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + + ident(openFile)operator(.)ident(setMode)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getModes)operator(()operator(\))operator(.)ident(getOpenFileFlags)operator(()operator(\))operator(\))operator(;) + + ident(registerDescriptor)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RubyIO)operator(()ident(Ruby) ident(runtime)operator(,) ident(ShellLauncher)operator(.)ident(POpenProcess) ident(process)operator(,) ident(ModeFlags) ident(modes)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(\))operator(;) + + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + + ident(openFile)operator(.)ident(setMode)operator(()ident(modes)operator(.)ident(getOpenFileFlags)operator(()operator(\)) operator(|) ident(OpenFile)operator(.)ident(SYNC)operator(\))operator(;) + ident(openFile)operator(.)ident(setProcess)operator(()ident(process)operator(\))operator(;) + + keyword(try) operator({) + keyword(if) operator(()ident(openFile)operator(.)ident(isReadable)operator(()operator(\))operator(\)) operator({) + type(Channel) ident(inChannel)operator(;) + keyword(if) operator(()ident(process)operator(.)ident(getInput)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + comment(// NIO-based) + ident(inChannel) operator(=) ident(process)operator(.)ident(getInput)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + comment(// Stream-based) + ident(inChannel) operator(=) type(Channels)operator(.)ident(newChannel)operator(()ident(process)operator(.)ident(getInputStream)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(ChannelDescriptor) ident(main) operator(=) keyword(new) ident(ChannelDescriptor)operator(() + ident(inChannel)operator(,) + ident(getNewFileno)operator(()operator(\))operator(,) + keyword(new) type(FileDescriptor)operator(()operator(\))operator(\))operator(;) + ident(main)operator(.)ident(setCanBeSeekable)operator(()keyword(false)operator(\))operator(;) + + ident(openFile)operator(.)ident(setMainStream)operator(()keyword(new) ident(ChannelStream)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(main)operator(\))operator(\))operator(;) + ident(registerDescriptor)operator(()ident(main)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(openFile)operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + type(Channel) ident(outChannel)operator(;) + keyword(if) operator(()ident(process)operator(.)ident(getOutput)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + comment(// NIO-based) + ident(outChannel) operator(=) ident(process)operator(.)ident(getOutput)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(outChannel) operator(=) type(Channels)operator(.)ident(newChannel)operator(()ident(process)operator(.)ident(getOutputStream)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(ChannelDescriptor) ident(pipe) operator(=) keyword(new) ident(ChannelDescriptor)operator(() + ident(outChannel)operator(,) + ident(getNewFileno)operator(()operator(\))operator(,) + keyword(new) type(FileDescriptor)operator(()operator(\))operator(\))operator(;) + ident(pipe)operator(.)ident(setCanBeSeekable)operator(()keyword(false)operator(\))operator(;) + + keyword(if) operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(openFile)operator(.)ident(setPipeStream)operator(()keyword(new) ident(ChannelStream)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(pipe)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(openFile)operator(.)ident(setMainStream)operator(()keyword(new) ident(ChannelStream)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(pipe)operator(\))operator(\))operator(;) + operator(}) + + ident(registerDescriptor)operator(()ident(pipe)operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) ident(RubyIO)operator(()ident(Ruby) ident(runtime)operator(,) ident(STDIO) ident(stdio)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(\))operator(;) + + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + + keyword(try) operator({) + keyword(switch) operator(()ident(stdio)operator(\)) operator({) + keyword(case) ident(IN)operator(:) + ident(openFile)operator(.)ident(setMainStream)operator(() + keyword(new) ident(ChannelStream)operator(() + ident(runtime)operator(,) + comment(// special constructor that accepts stream, not channel) + keyword(new) ident(ChannelDescriptor)operator(()ident(runtime)operator(.)ident(getIn)operator(()operator(\))operator(,) integer(0)operator(,) keyword(new) ident(ModeFlags)operator(()ident(ModeFlags)operator(.)ident(RDONLY)operator(\))operator(,) type(FileDescriptor)operator(.)ident(in)operator(\))operator(,) + type(FileDescriptor)operator(.)ident(in)operator(\))operator(\))operator(;) + keyword(break)operator(;) + keyword(case) ident(OUT)operator(:) + ident(openFile)operator(.)ident(setMainStream)operator(() + keyword(new) ident(ChannelStream)operator(() + ident(runtime)operator(,) + keyword(new) ident(ChannelDescriptor)operator(()type(Channels)operator(.)ident(newChannel)operator(()ident(runtime)operator(.)ident(getOut)operator(()operator(\))operator(\))operator(,) integer(1)operator(,) keyword(new) ident(ModeFlags)operator(()ident(ModeFlags)operator(.)ident(WRONLY) operator(|) ident(ModeFlags)operator(.)ident(APPEND)operator(\))operator(,) type(FileDescriptor)operator(.)ident(out)operator(\))operator(,) + type(FileDescriptor)operator(.)ident(out)operator(\))operator(\))operator(;) + ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(setSync)operator(()keyword(true)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) ident(ERR)operator(:) + ident(openFile)operator(.)ident(setMainStream)operator(() + keyword(new) ident(ChannelStream)operator(() + ident(runtime)operator(,) + keyword(new) ident(ChannelDescriptor)operator(()type(Channels)operator(.)ident(newChannel)operator(()ident(runtime)operator(.)ident(getErr)operator(()operator(\))operator(\))operator(,) integer(2)operator(,) keyword(new) ident(ModeFlags)operator(()ident(ModeFlags)operator(.)ident(WRONLY) operator(|) ident(ModeFlags)operator(.)ident(APPEND)operator(\))operator(,) type(FileDescriptor)operator(.)ident(err)operator(\))operator(,) + type(FileDescriptor)operator(.)ident(err)operator(\))operator(\))operator(;) + ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(setSync)operator(()keyword(true)operator(\))operator(;) + keyword(break)operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + + ident(openFile)operator(.)ident(setMode)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getModes)operator(()operator(\))operator(.)ident(getOpenFileFlags)operator(()operator(\))operator(\))operator(;) + + ident(registerDescriptor)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyIO) ident(newIO)operator(()ident(Ruby) ident(runtime)operator(,) type(Channel) ident(channel)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyIO)operator(()ident(runtime)operator(,) ident(channel)operator(\))operator(;) + operator(}) + + directive(public) ident(OpenFile) ident(getOpenFile)operator(()operator(\)) operator({) + keyword(return) ident(openFile)operator(;) + operator(}) + + directive(protected) ident(OpenFile) ident(getOpenFileChecked)operator(()operator(\)) operator({) + ident(openFile)operator(.)ident(checkClosed)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(openFile)operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(IO_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyIO)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createIOClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(ioClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(IO)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(IO_ALLOCATOR)operator(\))operator(;) + ident(ioClass)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyIO)operator(;) + operator(}) + operator(})operator(;) + + ident(ioClass)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + + comment(// TODO: Implement tty? and isatty. We have no real capability to) + comment(// determine this from java, but if we could set tty status, then) + comment(// we could invoke jruby differently to allow stdin to return true) + comment(// on this. This would allow things like cgi.rb to work properly.) + + ident(ioClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyIO)operator(.)ident(class)operator(\))operator(;) + + comment(// Constants for seek) + ident(ioClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(SEEK_SET)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(Stream)operator(.)ident(SEEK_SET)operator(\))operator(\))operator(;) + ident(ioClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(SEEK_CUR)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(Stream)operator(.)ident(SEEK_CUR)operator(\))operator(\))operator(;) + ident(ioClass)operator(.)ident(fastSetConstant)operator(()string<delimiter(")content(SEEK_END)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(Stream)operator(.)ident(SEEK_END)operator(\))operator(\))operator(;) + + keyword(return) ident(ioClass)operator(;) + operator(}) + + directive(public) type(OutputStream) ident(getOutStream)operator(()operator(\)) operator({) + keyword(return) ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(newOutputStream)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(InputStream) ident(getInStream)operator(()operator(\)) operator({) + keyword(return) ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(newInputStream)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(Channel) ident(getChannel)operator(()operator(\)) operator({) + keyword(if) operator(()ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\)) keyword(instanceof) ident(ChannelStream)operator(\)) operator({) + keyword(return) operator(()operator(()ident(ChannelStream)operator(\)) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getChannel)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + operator(}) + + directive(public) ident(Stream) ident(getHandler)operator(()operator(\)) operator({) + keyword(return) ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reopen)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(reopen)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) ident(InvalidValueException) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(<) integer(1)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(tmp) operator(=) ident(TypeConverter)operator(.)ident(convertToTypeWithCheck)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(,) + ident(MethodIndex)operator(.)ident(getIndex)operator(()string<delimiter(")content(to_io)delimiter(")>operator(\))operator(,) string<delimiter(")content(to_io)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(RubyIO) ident(ios) operator(=) operator(()ident(RubyIO)operator(\)) ident(tmp)operator(;) + + keyword(if) operator(()ident(ios)operator(.)ident(openFile) operator(==) local_variable(this)operator(.)ident(openFile)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + ident(OpenFile) ident(originalFile) operator(=) ident(ios)operator(.)ident(getOpenFileChecked)operator(()operator(\))operator(;) + ident(OpenFile) ident(selfFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + type(long) ident(pos) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(originalFile)operator(.)ident(isReadable)operator(()operator(\))operator(\)) operator({) + ident(pos) operator(=) ident(originalFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fgetpos)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(originalFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(originalFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(fflush)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(originalFile)operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + ident(originalFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fflush)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(selfFile)operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + ident(selfFile)operator(.)ident(getWriteStream)operator(()operator(\))operator(.)ident(fflush)operator(()operator(\))operator(;) + operator(}) + + ident(selfFile)operator(.)ident(setMode)operator(()ident(originalFile)operator(.)ident(getMode)operator(()operator(\))operator(\))operator(;) + ident(selfFile)operator(.)ident(setProcess)operator(()ident(originalFile)operator(.)ident(getProcess)operator(()operator(\))operator(\))operator(;) + ident(selfFile)operator(.)ident(setLineNumber)operator(()ident(originalFile)operator(.)ident(getLineNumber)operator(()operator(\))operator(\))operator(;) + ident(selfFile)operator(.)ident(setPath)operator(()ident(originalFile)operator(.)ident(getPath)operator(()operator(\))operator(\))operator(;) + ident(selfFile)operator(.)ident(setFinalizer)operator(()ident(originalFile)operator(.)ident(getFinalizer)operator(()operator(\))operator(\))operator(;) + + ident(ChannelDescriptor) ident(selfDescriptor) operator(=) ident(selfFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(;) + ident(ChannelDescriptor) ident(originalDescriptor) operator(=) ident(originalFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(;) + + comment(// confirm we're not reopening self's channel) + keyword(if) operator(()ident(selfDescriptor)operator(.)ident(getChannel)operator(()operator(\)) operator(!=) ident(originalDescriptor)operator(.)ident(getChannel)operator(()operator(\))operator(\)) operator({) + comment(// check if we're a stdio IO, and ensure we're not badly mutilated) + keyword(if) operator(()ident(selfDescriptor)operator(.)ident(getFileno)operator(()operator(\)) operator(>=)integer(0) operator(&&) ident(selfDescriptor)operator(.)ident(getFileno)operator(()operator(\)) operator(<=) integer(2)operator(\)) operator({) + ident(selfFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(clearerr)operator(()operator(\))operator(;) + + comment(// dup2 new fd into self to preserve fileno and references to it) + ident(originalDescriptor)operator(.)ident(dup2Into)operator(()ident(selfDescriptor)operator(\))operator(;) + + comment(// re-register, since fileno points at something new now) + ident(registerDescriptor)operator(()ident(selfDescriptor)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(Stream) ident(pipeFile) operator(=) ident(selfFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(;) + type(int) ident(mode) operator(=) ident(selfFile)operator(.)ident(getMode)operator(()operator(\))operator(;) + ident(selfFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fclose)operator(()operator(\))operator(;) + ident(selfFile)operator(.)ident(setPipeStream)operator(()keyword(null)operator(\))operator(;) + + comment(// TODO: turn off readable? am I reading this right?) + comment(// This only seems to be used while duping below, since modes gets) + comment(// reset to actual modes afterward) + comment(//fptr->mode &= (m & FMODE_READABLE\) ? ~FMODE_READABLE : ~FMODE_WRITABLE;) + + keyword(if) operator(()ident(pipeFile) operator(!=) keyword(null)operator(\)) operator({) + ident(selfFile)operator(.)ident(setMainStream)operator(()ident(ChannelStream)operator(.)ident(fdopen)operator(()ident(runtime)operator(,) ident(originalDescriptor)operator(,) keyword(new) ident(ModeFlags)operator(()operator(\))operator(\))operator(\))operator(;) + ident(selfFile)operator(.)ident(setPipeStream)operator(()ident(pipeFile)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(selfFile)operator(.)ident(setMainStream)operator(() + keyword(new) ident(ChannelStream)operator(() + ident(runtime)operator(,) + ident(originalDescriptor)operator(.)ident(dup2)operator(()ident(selfDescriptor)operator(.)ident(getFileno)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + + comment(// re-register the descriptor) + ident(registerDescriptor)operator(()ident(selfFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + + comment(// since we're not actually duping the incoming channel into our handler, we need to) + comment(// copy the original sync behavior from the other handler) + ident(selfFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(setSync)operator(()ident(selfFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(isSync)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(selfFile)operator(.)ident(setMode)operator(()ident(mode)operator(\))operator(;) + operator(}) + + comment(// TODO: anything threads attached to original fd are notified of the close...) + comment(// see rb_thread_fd_close) + + keyword(if) operator(()ident(originalFile)operator(.)ident(isReadable)operator(()operator(\)) operator(&&) ident(pos) operator(>=) integer(0)operator(\)) operator({) + ident(selfFile)operator(.)ident(seek)operator(()ident(pos)operator(,) ident(Stream)operator(.)ident(SEEK_SET)operator(\))operator(;) + ident(originalFile)operator(.)ident(seek)operator(()ident(pos)operator(,) ident(Stream)operator(.)ident(SEEK_SET)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(selfFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(!=) keyword(null) operator(&&) ident(selfDescriptor)operator(.)ident(getFileno)operator(()operator(\)) operator(!=) ident(selfFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileno)operator(()operator(\))operator(\)) operator({) + type(int) ident(fd) operator(=) ident(selfFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileno)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(originalFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(selfFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(fclose)operator(()operator(\))operator(;) + ident(selfFile)operator(.)ident(setPipeStream)operator(()keyword(null)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(fd) operator(!=) ident(originalFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileno)operator(()operator(\))operator(\)) operator({) + ident(selfFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(fclose)operator(()operator(\))operator(;) + ident(ChannelDescriptor) ident(newFD2) operator(=) ident(originalFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(dup2)operator(()ident(fd)operator(\))operator(;) + ident(selfFile)operator(.)ident(setPipeStream)operator(()ident(ChannelStream)operator(.)ident(fdopen)operator(()ident(runtime)operator(,) ident(newFD2)operator(,) ident(getIOModes)operator(()ident(runtime)operator(,) string<delimiter(")content(w)delimiter(")>operator(\))operator(\))operator(\))operator(;) + + comment(// re-register, since fileno points at something new now) + ident(registerDescriptor)operator(()ident(newFD2)operator(\))operator(;) + operator(}) + operator(}) + + comment(// TODO: restore binary mode) + comment(// if (fptr->mode & FMODE_BINMODE\) {) + comment(// rb_io_binmode(io\);) + comment(// }) + + comment(// TODO: set our metaclass to target's class (i.e. scary!\)) + + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) comment(// TODO: better error handling) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(could not reopen: )delimiter(")> operator(+) ident(ex)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(could not reopen: )delimiter(")> operator(+) ident(ex)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(could not reopen: )delimiter(")> operator(+) ident(ex)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(pathString) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + + comment(// TODO: check safe, taint on incoming string) + + keyword(if) operator(()ident(openFile) operator(==) keyword(null)operator(\)) operator({) + ident(openFile) operator(=) keyword(new) ident(OpenFile)operator(()operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(ModeFlags) ident(modes)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(IRubyObject) ident(modeString) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(modes) operator(=) ident(getIOModes)operator(()ident(runtime)operator(,) ident(modeString)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + + ident(openFile)operator(.)ident(setMode)operator(()ident(modes)operator(.)ident(getOpenFileFlags)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modes) operator(=) ident(getIOModes)operator(()ident(runtime)operator(,) string<delimiter(")content(r)delimiter(")>operator(\))operator(;) + operator(}) + + type(String) ident(path) operator(=) ident(pathString)operator(.)ident(toString)operator(()operator(\))operator(;) + + comment(// Ruby code frequently uses a platform check to choose "NUL:" on windows) + comment(// but since that check doesn't work well on JRuby, we help it out) + + ident(openFile)operator(.)ident(setPath)operator(()ident(path)operator(\))operator(;) + + keyword(if) operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(try) operator({) + ident(openFile)operator(.)ident(setMainStream)operator(()ident(ChannelStream)operator(.)ident(fopen)operator(()ident(runtime)operator(,) ident(path)operator(,) ident(modes)operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(FileExistsException) ident(fee)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEEXISTError)operator(()ident(path)operator(\))operator(;) + operator(}) + + ident(registerDescriptor)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(openFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(openFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(fclose)operator(()operator(\))operator(;) + ident(unregisterDescriptor)operator(()ident(openFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileno)operator(()operator(\))operator(\))operator(;) + ident(openFile)operator(.)ident(setPipeStream)operator(()keyword(null)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) keyword(else) operator({) + comment(// TODO: This is an freopen in MRI, this is close, but not quite the same) + ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(freopen)operator(()ident(path)operator(,) ident(getIOModes)operator(()ident(runtime)operator(,) ident(openFile)operator(.)ident(getModeAsString)operator(()ident(runtime)operator(\))operator(\))operator(\))operator(;) + + comment(// re-register) + ident(registerDescriptor)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(openFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + comment(// TODO: pipe handler to be reopened with path and "w" mode) + operator(}) + operator(}) + operator(}) keyword(catch) operator(()ident(PipeException) ident(pe)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOErrorFromException)operator(()ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(// A potentially previously close IO is being 'reopened'.) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) directive(static) ident(ModeFlags) ident(getIOModes)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(modesString)operator(\)) directive(throws) ident(InvalidValueException) operator({) + keyword(return) keyword(new) ident(ModeFlags)operator(()ident(getIOModesIntFromString)operator(()ident(runtime)operator(,) ident(modesString)operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(int) ident(getIOModesIntFromString)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(modesString)operator(\)) operator({) + type(int) ident(modes) operator(=) integer(0)operator(;) + type(int) ident(length) operator(=) ident(modesString)operator(.)ident(length)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(length) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(illegal access mode)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(switch) operator(()ident(modesString)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(\)) operator({) + keyword(case) string<delimiter(')content(r)delimiter(')> operator(:) + ident(modes) operator(|=) ident(ModeFlags)operator(.)ident(RDONLY)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(a)delimiter(')> operator(:) + ident(modes) operator(|=) ident(ModeFlags)operator(.)ident(APPEND) operator(|) ident(ModeFlags)operator(.)ident(WRONLY) operator(|) ident(ModeFlags)operator(.)ident(CREAT)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(w)delimiter(')> operator(:) + ident(modes) operator(|=) ident(ModeFlags)operator(.)ident(WRONLY) operator(|) ident(ModeFlags)operator(.)ident(TRUNC) operator(|) ident(ModeFlags)operator(.)ident(CREAT)operator(;) + keyword(break)operator(;) + keyword(default) operator(:) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(illegal access mode )delimiter(")> operator(+) ident(modes)operator(\))operator(;) + operator(}) + + keyword(for) operator(()type(int) ident(n) operator(=) integer(1)operator(;) ident(n) operator(<) ident(length)operator(;) ident(n)operator(++)operator(\)) operator({) + keyword(switch) operator(()ident(modesString)operator(.)ident(charAt)operator(()ident(n)operator(\))operator(\)) operator({) + keyword(case) string<delimiter(')content(b)delimiter(')>operator(:) + ident(modes) operator(|=) ident(ModeFlags)operator(.)ident(BINARY)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(+)delimiter(')>operator(:) + ident(modes) operator(=) operator(()ident(modes) operator(&) operator(~)ident(ModeFlags)operator(.)ident(ACCMODE)operator(\)) operator(|) ident(ModeFlags)operator(.)ident(RDWR)operator(;) + keyword(break)operator(;) + keyword(default)operator(:) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(illegal access mode )delimiter(")> operator(+) ident(modes)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(modes)operator(;) + operator(}) + + directive(private) directive(static) ident(ByteList) ident(getSeparatorFromArgs)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) type(int) ident(idx)operator(\)) operator({) + ident(IRubyObject) ident(sepVal)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) ident(idx)operator(\)) operator({) + ident(sepVal) operator(=) ident(args)operator([)ident(idx)operator(])operator(;) + operator(}) keyword(else) operator({) + ident(sepVal) operator(=) ident(runtime)operator(.)ident(getRecordSeparatorVar)operator(()operator(\))operator(.)ident(get)operator(()operator(\))operator(;) + operator(}) + + ident(ByteList) ident(separator) operator(=) ident(sepVal)operator(.)ident(isNil)operator(()operator(\)) operator(?) keyword(null) operator(:) ident(sepVal)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(separator) operator(!=) keyword(null) operator(&&) ident(separator)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(separator) operator(=) ident(Stream)operator(.)ident(PARAGRAPH_DELIMETER)operator(;) + operator(}) + + keyword(return) ident(separator)operator(;) + operator(}) + + directive(private) ident(ByteList) ident(getSeparatorForGets)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(getSeparatorFromArgs)operator(()ident(runtime)operator(,) ident(args)operator(,) integer(0)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getline)operator(()ident(Ruby) ident(runtime)operator(,) ident(ByteList) ident(separator)operator(\)) operator({) + keyword(try) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(runtime)operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setReadBuffered)operator(()operator(\))operator(;) + + type(boolean) ident(isParagraph) operator(=) ident(separator) operator(==) ident(Stream)operator(.)ident(PARAGRAPH_DELIMETER)operator(;) + ident(separator) operator(=) operator(()ident(separator) operator(==) ident(Stream)operator(.)ident(PARAGRAPH_DELIMETER)operator(\)) operator(?) + ident(Stream)operator(.)ident(PARAGRAPH_SEPARATOR) operator(:) ident(separator)operator(;) + + keyword(if) operator(()ident(isParagraph)operator(\)) operator({) + ident(swallow)operator(()string<delimiter(')content(\\n)delimiter(')>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(separator) operator(==) keyword(null)operator(\)) operator({) + ident(IRubyObject) ident(str) operator(=) ident(readAll)operator(()keyword(null)operator(\))operator(;) + keyword(if) operator(()operator(()operator(()ident(RubyString)operator(\))ident(str)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + ident(incrementLineno)operator(()ident(runtime)operator(,) ident(myOpenFile)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(separator)operator(.)ident(length)operator(()operator(\)) operator(==) integer(1)operator(\)) operator({) + keyword(return) ident(getlineFast)operator(()ident(runtime)operator(,) ident(separator)operator(.)ident(get)operator(()integer(0)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(Stream) ident(readStream) operator(=) ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(;) + type(int) ident(c) operator(=) operator(-)integer(1)operator(;) + type(int) ident(n) operator(=) operator(-)integer(1)operator(;) + type(int) ident(newline) operator(=) ident(separator)operator(.)ident(get)operator(()ident(separator)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\)) operator(&) hex(0xFF)operator(;) + + ident(ByteList) ident(buf) operator(=) keyword(new) ident(ByteList)operator(()integer(0)operator(\))operator(;) + type(boolean) ident(update) operator(=) keyword(false)operator(;) + + keyword(while) operator(()keyword(true)operator(\)) operator({) + keyword(do) operator({) + ident(readCheck)operator(()ident(readStream)operator(\))operator(;) + ident(readStream)operator(.)ident(clearerr)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(n) operator(=) ident(readStream)operator(.)ident(getline)operator(()ident(buf)operator(,) operator(()type(byte)operator(\)) ident(newline)operator(\))operator(;) + ident(c) operator(=) ident(buf)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(?) ident(buf)operator(.)ident(get)operator(()ident(buf)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\)) operator(&) hex(0xff) operator(:) operator(-)integer(1)operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + ident(n) operator(=) operator(-)integer(1)operator(;) + operator(}) + + keyword(if) operator(()ident(n) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(readStream)operator(.)ident(isBlocking)operator(()operator(\)) operator(&&) operator(()ident(readStream) keyword(instanceof) ident(ChannelStream)operator(\))operator(\)) operator({) + keyword(if)operator(()operator(!)operator(()ident(waitReadable)operator(()operator(()operator(()ident(ChannelStream)operator(\))ident(readStream)operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(bad file descriptor: )delimiter(")> operator(+) ident(openFile)operator(.)ident(getPath)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(continue)operator(;) + operator(}) keyword(else) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + + ident(update) operator(=) keyword(true)operator(;) + operator(}) keyword(while) operator(()ident(c) operator(!=) ident(newline)operator(\))operator(;) comment(// loop until we see the nth separator char) + + comment(// if we hit EOF, we're done) + keyword(if) operator(()ident(n) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + + comment(// if we've found the last char of the separator,) + comment(// and we've found at least as many characters as separator length,) + comment(// and the last n characters of our buffer match the separator, we're done) + keyword(if) operator(()ident(c) operator(==) ident(newline) operator(&&) ident(buf)operator(.)ident(length)operator(()operator(\)) operator(>=) ident(separator)operator(.)ident(length)operator(()operator(\)) operator(&&) + integer(0) operator(==) ident(ByteList)operator(.)ident(memcmp)operator(()ident(buf)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(buf)operator(.)ident(begin) operator(+) ident(buf)operator(.)ident(realSize) operator(-) ident(separator)operator(.)ident(length)operator(()operator(\))operator(,) ident(separator)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(separator)operator(.)ident(begin)operator(,) ident(separator)operator(.)ident(realSize)operator(\))operator(\)) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(isParagraph)operator(\)) operator({) + keyword(if) operator(()ident(c) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(swallow)operator(()string<delimiter(')content(\\n)delimiter(')>operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()operator(!)ident(update)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(incrementLineno)operator(()ident(runtime)operator(,) ident(myOpenFile)operator(\))operator(;) + ident(RubyString) ident(str) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(buf)operator(\))operator(;) + ident(str)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + + keyword(return) ident(str)operator(;) + operator(}) + operator(}) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(incrementLineno)operator(()ident(Ruby) ident(runtime)operator(,) ident(OpenFile) ident(myOpenFile)operator(\)) operator({) + type(int) ident(lineno) operator(=) ident(myOpenFile)operator(.)ident(getLineNumber)operator(()operator(\)) operator(+) integer(1)operator(;) + ident(myOpenFile)operator(.)ident(setLineNumber)operator(()ident(lineno)operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($.)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(lineno)operator(\))operator(\))operator(;) + comment(// this is for a range check, near as I can tell) + ident(RubyNumeric)operator(.)ident(int2fix)operator(()ident(runtime)operator(,) ident(myOpenFile)operator(.)ident(getLineNumber)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(protected) type(boolean) ident(swallow)operator(()type(int) ident(term)operator(\)) directive(throws) type(IOException)operator(,) ident(BadDescriptorException) operator({) + ident(Stream) ident(readStream) operator(=) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(;) + type(int) ident(c)operator(;) + + keyword(do) operator({) + ident(readCheck)operator(()ident(readStream)operator(\))operator(;) + + keyword(try) operator({) + ident(c) operator(=) ident(readStream)operator(.)ident(fgetc)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + ident(c) operator(=) operator(-)integer(1)operator(;) + operator(}) + + keyword(if) operator(()ident(c) operator(!=) ident(term)operator(\)) operator({) + ident(readStream)operator(.)ident(ungetc)operator(()ident(c)operator(\))operator(;) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) keyword(while) operator(()ident(c) operator(!=) operator(-)integer(1)operator(\))operator(;) + + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getlineFast)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(delim)operator(\)) directive(throws) type(IOException)operator(,) ident(BadDescriptorException) operator({) + ident(Stream) ident(readStream) operator(=) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(;) + type(int) ident(c) operator(=) operator(-)integer(1)operator(;) + + ident(ByteList) ident(buf) operator(=) keyword(new) ident(ByteList)operator(()integer(0)operator(\))operator(;) + type(boolean) ident(update) operator(=) keyword(false)operator(;) + keyword(do) operator({) + ident(readCheck)operator(()ident(readStream)operator(\))operator(;) + ident(readStream)operator(.)ident(clearerr)operator(()operator(\))operator(;) + type(int) ident(n)operator(;) + keyword(try) operator({) + ident(n) operator(=) ident(readStream)operator(.)ident(getline)operator(()ident(buf)operator(,) operator(()type(byte)operator(\)) ident(delim)operator(\))operator(;) + ident(c) operator(=) ident(buf)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(?) ident(buf)operator(.)ident(get)operator(()ident(buf)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(\)) operator(&) hex(0xff) operator(:) operator(-)integer(1)operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + ident(n) operator(=) operator(-)integer(1)operator(;) + operator(}) + + keyword(if) operator(()ident(n) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(readStream)operator(.)ident(isBlocking)operator(()operator(\)) operator(&&) operator(()ident(readStream) keyword(instanceof) ident(ChannelStream)operator(\))operator(\)) operator({) + keyword(if)operator(()operator(!)operator(()ident(waitReadable)operator(()operator(()operator(()ident(ChannelStream)operator(\))ident(readStream)operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(bad file descriptor: )delimiter(")> operator(+) ident(openFile)operator(.)ident(getPath)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(continue)operator(;) + operator(}) keyword(else) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + + ident(update) operator(=) keyword(true)operator(;) + operator(}) keyword(while) operator(()ident(c) operator(!=) ident(delim)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(update)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(incrementLineno)operator(()ident(runtime)operator(,) ident(openFile)operator(\))operator(;) + ident(RubyString) ident(str) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(buf)operator(\))operator(;) + ident(str)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + operator(}) + comment(// IO class methods.) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(new)delimiter(")>operator(,) string<delimiter(")content(for_fd)delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(klass) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + type(String) ident(className) operator(=) ident(klass)operator(.)ident(getName)operator(()operator(\))operator(;) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(() + ident(ID)operator(.)ident(BLOCK_NOT_ACCEPTED)operator(,) + ident(className) operator(+) string<delimiter(")content(::new(\) does not take block; use )delimiter(")> operator(+) ident(className) operator(+) string<delimiter(")content(::open(\) instead)delimiter(")>operator(,) + ident(className) operator(+) string<delimiter(")content(::open(\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(klass)operator(.)ident(newInstance)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + type(int) ident(argCount) operator(=) ident(args)operator(.)ident(length)operator(;) + ident(ModeFlags) ident(modes)operator(;) + + type(int) ident(fileno) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + + keyword(try) operator({) + ident(ChannelDescriptor) ident(descriptor) operator(=) ident(getDescriptorByFileno)operator(()ident(fileno)operator(\))operator(;) + + keyword(if) operator(()ident(descriptor) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) + + ident(descriptor)operator(.)ident(checkOpen)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(argCount) operator(==) integer(2)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(RubyFixnum)operator(.)ident(fix2long)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modes) operator(=) ident(getIOModes)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + comment(// use original modes) + ident(modes) operator(=) ident(descriptor)operator(.)ident(getOriginalModes)operator(()operator(\))operator(;) + operator(}) + + ident(openFile)operator(.)ident(setMode)operator(()ident(modes)operator(.)ident(getOpenFileFlags)operator(()operator(\))operator(\))operator(;) + + ident(openFile)operator(.)ident(setMainStream)operator(()ident(fdopen)operator(()ident(descriptor)operator(,) ident(modes)operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ive)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(protected) ident(Stream) ident(fdopen)operator(()ident(ChannelDescriptor) ident(existingDescriptor)operator(,) ident(ModeFlags) ident(modes)operator(\)) directive(throws) ident(InvalidValueException) operator({) + comment(// See if we already have this descriptor open.) + comment(// If so then we can mostly share the handler (keep open) + comment(// file, but possibly change the mode\).) + + keyword(if) operator(()ident(existingDescriptor) operator(==) keyword(null)operator(\)) operator({) + comment(// redundant, done above as well) + + comment(// this seems unlikely to happen unless it's a totally bogus fileno) + comment(// ...so do we even need to bother trying to create one?) + + comment(// IN FACT, we should probably raise an error, yes?) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + +comment(// if (mode == null\) {) +comment(// mode = "r";) +comment(// }) +comment(// ) +comment(// try {) +comment(// openFile.setMainStream(streamForFileno(getRuntime(\), fileno\)\);) +comment(// } catch (BadDescriptorException e\) {) +comment(// throw getRuntime(\).newErrnoEBADFError(\);) +comment(// } catch (IOException e\) {) +comment(// throw getRuntime(\).newErrnoEBADFError(\);) +comment(// }) +comment(// //modes = new IOModes(getRuntime(\), mode\);) +comment(// ) +comment(// registerStream(openFile.getMainStream(\)\);) + operator(}) keyword(else) operator({) + comment(// We are creating a new IO object that shares the same) + comment(// IOHandler (and fileno\).) + keyword(return) ident(ChannelStream)operator(.)ident(fdopen)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(existingDescriptor)operator(,) ident(modes)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(open)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(open)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyClass) ident(klass) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + + ident(RubyIO) ident(io) operator(=) operator(()ident(RubyIO)operator(\))ident(klass)operator(.)ident(newInstance)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(io)operator(\))operator(;) + operator(}) keyword(finally) operator({) + keyword(try) operator({) + ident(io)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(invoke)operator(()ident(context)operator(,) ident(io)operator(,) string<delimiter(")content(close)delimiter(")>operator(,) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(,) ident(CallType)operator(.)ident(FUNCTIONAL)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(re)operator(\)) operator({) + ident(RubyException) ident(rubyEx) operator(=) ident(re)operator(.)ident(getException)operator(()operator(\))operator(;) + keyword(if) operator(()ident(rubyEx)operator(.)ident(kind_of_p)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getStandardError)operator(()operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + comment(// MRI behavior: swallow StandardErorrs) + operator(}) keyword(else) operator({) + keyword(throw) ident(re)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + + keyword(return) ident(io)operator(;) + operator(}) + + comment(// This appears to be some windows-only mode. On a java platform this is a no-op) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(binmode)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(binmode)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** @deprecated will be removed in 1.2 */) + directive(protected) type(void) ident(checkInitialized)operator(()operator(\)) operator({) + keyword(if) operator(()ident(openFile) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(uninitialized stream)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** @deprecated will be removed in 1.2 */) + directive(protected) type(void) ident(checkClosed)operator(()operator(\)) operator({) + keyword(if) operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\)) operator(==) keyword(null) operator(&&) ident(openFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(closed stream)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(syswrite)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(syswrite)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(RubyString) ident(string) operator(=) ident(obj)operator(.)ident(asString)operator(()operator(\))operator(;) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(checkWritable)operator(()ident(runtime)operator(\))operator(;) + + ident(Stream) ident(writeStream) operator(=) ident(myOpenFile)operator(.)ident(getWriteStream)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(isWriteBuffered)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(SYSWRITE_BUFFERED_IO)operator(,) string<delimiter(")content(syswrite for buffered IO)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(writeStream)operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + ident(myOpenFile)operator(.)ident(checkClosed)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + type(int) ident(read) operator(=) ident(writeStream)operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(write)operator(()ident(string)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(read) operator(==) operator(-)integer(1)operator(\)) operator({) + comment(// TODO? I think this ends up propagating from normal Java exceptions) + comment(// sys_fail(openFile.getPath(\)\)) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(read)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSystemCallError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(write_nonblock)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(write_nonblock)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + comment(// MRI behavior: always check whether the file is writable) + comment(// or not, even if we are to write 0 bytes.) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(myOpenFile)operator(.)ident(checkWritable)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) + + comment(// TODO: Obviously, we're not doing a non-blocking write here) + keyword(return) ident(write)operator(()ident(context)operator(,) ident(obj)operator(\))operator(;) + operator(}) + + comment(/** io_write + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(write)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(write)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + + ident(RubyString) ident(str) operator(=) ident(obj)operator(.)ident(asString)operator(()operator(\))operator(;) + + comment(// TODO: Ruby reuses this logic for other "write" behavior by checking if it's an IO and calling write again) + + keyword(if) operator(()ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(checkWritable)operator(()ident(runtime)operator(\))operator(;) + + type(int) ident(written) operator(=) ident(fwrite)operator(()ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(written) operator(==) operator(-)integer(1)operator(\)) operator({) + comment(// TODO: sys fail) + operator(}) + + comment(// if not sync, we switch to write buffered mode) + keyword(if) operator(()operator(!)ident(myOpenFile)operator(.)ident(isSync)operator(()operator(\))operator(\)) operator({) + ident(myOpenFile)operator(.)ident(setWriteBuffered)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(written)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOErrorFromException)operator(()ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(protected) type(boolean) ident(waitWritable)operator(()ident(ChannelDescriptor) ident(descriptor)operator(\)) directive(throws) type(IOException) operator({) + type(Channel) ident(channel) operator(=) ident(descriptor)operator(.)ident(getChannel)operator(()operator(\))operator(;) + keyword(if) operator(()ident(channel) operator(==) keyword(null) operator(||) operator(!)operator(()ident(channel) keyword(instanceof) type(SelectableChannel)operator(\))operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + type(Selector) ident(selector) operator(=) type(Selector)operator(.)ident(open)operator(()operator(\))operator(;) + + operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(configureBlocking)operator(()keyword(false)operator(\))operator(;) + type(int) ident(real_ops) operator(=) operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(validOps)operator(()operator(\)) operator(&) type(SelectionKey)operator(.)ident(OP_WRITE)operator(;) + type(SelectionKey) ident(key) operator(=) operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(keyFor)operator(()ident(selector)operator(\))operator(;) + + keyword(if) operator(()ident(key) operator(==) keyword(null)operator(\)) operator({) + operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(register)operator(()ident(selector)operator(,) ident(real_ops)operator(,) ident(descriptor)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(key)operator(.)ident(interestOps)operator(()ident(key)operator(.)ident(interestOps)operator(()operator(\))operator(|)ident(real_ops)operator(\))operator(;) + operator(}) + + keyword(while)operator(()ident(selector)operator(.)ident(select)operator(()operator(\)) operator(==) integer(0)operator(\))operator(;) + + keyword(for) operator(()type(Iterator) ident(i) operator(=) ident(selector)operator(.)ident(selectedKeys)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;) operator(\)) operator({) + type(SelectionKey) ident(skey) operator(=) operator(()type(SelectionKey)operator(\)) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + keyword(if) operator(()operator(()ident(skey)operator(.)ident(interestOps)operator(()operator(\)) operator(&) ident(skey)operator(.)ident(readyOps)operator(()operator(\)) operator(&) operator(()type(SelectionKey)operator(.)ident(OP_WRITE)operator(\))operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(if)operator(()ident(skey)operator(.)ident(attachment)operator(()operator(\)) operator(==) ident(descriptor)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(protected) type(boolean) ident(waitReadable)operator(()ident(ChannelDescriptor) ident(descriptor)operator(\)) directive(throws) type(IOException) operator({) + type(Channel) ident(channel) operator(=) ident(descriptor)operator(.)ident(getChannel)operator(()operator(\))operator(;) + keyword(if) operator(()ident(channel) operator(==) keyword(null) operator(||) operator(!)operator(()ident(channel) keyword(instanceof) type(SelectableChannel)operator(\))operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + type(Selector) ident(selector) operator(=) type(Selector)operator(.)ident(open)operator(()operator(\))operator(;) + + operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(configureBlocking)operator(()keyword(false)operator(\))operator(;) + type(int) ident(real_ops) operator(=) operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(validOps)operator(()operator(\)) operator(&) operator(()type(SelectionKey)operator(.)ident(OP_READ) operator(|) type(SelectionKey)operator(.)ident(OP_ACCEPT)operator(\))operator(;) + type(SelectionKey) ident(key) operator(=) operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(keyFor)operator(()ident(selector)operator(\))operator(;) + + keyword(if) operator(()ident(key) operator(==) keyword(null)operator(\)) operator({) + operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(register)operator(()ident(selector)operator(,) ident(real_ops)operator(,) ident(descriptor)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(key)operator(.)ident(interestOps)operator(()ident(key)operator(.)ident(interestOps)operator(()operator(\))operator(|)ident(real_ops)operator(\))operator(;) + operator(}) + + keyword(while)operator(()ident(selector)operator(.)ident(select)operator(()operator(\)) operator(==) integer(0)operator(\))operator(;) + + keyword(for) operator(()type(Iterator) ident(i) operator(=) ident(selector)operator(.)ident(selectedKeys)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;) operator(\)) operator({) + type(SelectionKey) ident(skey) operator(=) operator(()type(SelectionKey)operator(\)) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + keyword(if) operator(()operator(()ident(skey)operator(.)ident(interestOps)operator(()operator(\)) operator(&) ident(skey)operator(.)ident(readyOps)operator(()operator(\)) operator(&) operator(()type(SelectionKey)operator(.)ident(OP_READ) operator(|) type(SelectionKey)operator(.)ident(OP_ACCEPT)operator(\))operator(\)) operator(!=) integer(0)operator(\)) operator({) + keyword(if)operator(()ident(skey)operator(.)ident(attachment)operator(()operator(\)) operator(==) ident(descriptor)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(protected) type(int) ident(fwrite)operator(()ident(ByteList) ident(buffer)operator(\)) operator({) + type(int) ident(n)operator(,) ident(r)operator(,) ident(l)operator(,) ident(offset) operator(=) integer(0)operator(;) + type(boolean) ident(eagain) operator(=) keyword(false)operator(;) + ident(Stream) ident(writeStream) operator(=) ident(openFile)operator(.)ident(getWriteStream)operator(()operator(\))operator(;) + + type(int) ident(len) operator(=) ident(buffer)operator(.)ident(length)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(()ident(n) operator(=) ident(len)operator(\)) operator(<=) integer(0)operator(\)) keyword(return) ident(n)operator(;) + + keyword(try) operator({) + keyword(if) operator(()ident(openFile)operator(.)ident(isSync)operator(()operator(\))operator(\)) operator({) + ident(openFile)operator(.)ident(fflush)operator(()ident(writeStream)operator(\))operator(;) + + comment(// TODO: why is this guarded?) + comment(// if (!rb_thread_fd_writable(fileno(f\)\)\) {) + comment(// rb_io_check_closed(fptr\);) + comment(// }) + + keyword(while)operator(()ident(offset)operator(<)ident(len)operator(\)) operator({) + ident(l) operator(=) ident(n)operator(;) + + comment(// TODO: Something about pipe buffer length here) + + ident(r) operator(=) ident(writeStream)operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(write)operator(()ident(buffer)operator(,)ident(offset)operator(,)ident(l)operator(\))operator(;) + + keyword(if)operator(()ident(r) operator(==) ident(len)operator(\)) operator({) + keyword(return) ident(len)operator(;) comment(//Everything written) + operator(}) + + keyword(if) operator(()integer(0) operator(<=) ident(r)operator(\)) operator({) + ident(offset) operator(+=) ident(r)operator(;) + ident(n) operator(-=) ident(r)operator(;) + ident(eagain) operator(=) keyword(true)operator(;) + operator(}) + + keyword(if)operator(()ident(eagain) operator(&&) ident(waitWritable)operator(()ident(writeStream)operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(\)) operator({) + ident(openFile)operator(.)ident(checkClosed)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(if)operator(()ident(offset) operator(>=) ident(buffer)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + keyword(return) operator(-)integer(1)operator(;) + operator(}) + ident(eagain) operator(=) keyword(false)operator(;) + operator(}) keyword(else) operator({) + keyword(return) operator(-)integer(1)operator(;) + operator(}) + operator(}) + + + comment(// TODO: all this stuff...some pipe logic, some async thread stuff) + comment(// retry:) + comment(// l = n;) + comment(// if (PIPE_BUF < l &&) + comment(// !rb_thread_critical &&) + comment(// !rb_thread_alone(\) &&) + comment(// wsplit_p(fptr\)\) {) + comment(// l = PIPE_BUF;) + comment(// }) + comment(// TRAP_BEG;) + comment(// r = write(fileno(f\), RSTRING(str\)->ptr+offset, l\);) + comment(// TRAP_END;) + comment(// if (r == n\) return len;) + comment(// if (0 <= r\) {) + comment(// offset += r;) + comment(// n -= r;) + comment(// errno = EAGAIN;) + comment(// }) + comment(// if (rb_io_wait_writable(fileno(f\)\)\) {) + comment(// rb_io_check_closed(fptr\);) + comment(// if (offset < RSTRING(str\)->len\)) + comment(// goto retry;) + comment(// }) + comment(// return -1L;) + operator(}) + + comment(// TODO: handle errors in buffered write by retrying until finished or file is closed) + keyword(return) ident(writeStream)operator(.)ident(fwrite)operator(()ident(buffer)operator(\))operator(;) + comment(// while (errno = 0, offset += (r = fwrite(RSTRING(str\)->ptr+offset, 1, n, f\)\), (n -= r\) > 0\) {) + comment(// if (ferror(f\)) + comment(// \) {) + comment(// if (rb_io_wait_writable(fileno(f\)\)\) {) + comment(// rb_io_check_closed(fptr\);) + comment(// clearerr(f\);) + comment(// if (offset < RSTRING(str\)->len\)) + comment(// continue;) + comment(// }) + comment(// return -1L;) + comment(// }) + comment(// }) + +comment(// return len - n;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_io_addstr + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_append)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(anObject)operator(\)) operator({) + comment(// Claims conversion is done via 'to_s' in docs.) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(anObject)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fileno)delimiter(")>operator(,) ident(alias) operator(=) string<delimiter(")content(to_i)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(fileno)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileno)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** Returns the current line number. + * + * @return the current line number. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lineno)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(lineno)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getLineNumber)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** Sets the current line number. + * + * @param newLineNumber The new line number. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lineno=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyFixnum) ident(lineno_set)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(newLineNumber)operator(\)) operator({) + ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(setLineNumber)operator(()ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(newLineNumber)operator(\))operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getLineNumber)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** Returns the current sync mode. + * + * @return the current sync mode. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sync)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(sync)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(isSync)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * <p>Return the process id (pid\) of the process this IO object + * spawned. If no process exists (popen was not called\), then + * nil is returned. This is not how it appears to be defined + * but ruby 1.8 works this way.</p> + * + * @return the pid or nil + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pid)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(pid)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getProcess)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(// Of course this isn't particularly useful.) + type(int) ident(pid) operator(=) ident(myOpenFile)operator(.)ident(getProcess)operator(()operator(\))operator(.)ident(hashCode)operator(()operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(pid)operator(\))operator(;) + operator(}) + + comment(/** + * @deprecated + * @return + */) + directive(public) type(boolean) ident(writeDataBuffered)operator(()operator(\)) operator({) + keyword(return) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(writeDataBuffered)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(pos)delimiter(")>operator(,) string<delimiter(")content(tell)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyFixnum) ident(pos)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(try) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fgetpos)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(bde)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoESPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pos=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyFixnum) ident(pos_set)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(newPosition)operator(\)) operator({) + type(long) ident(offset) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(newPosition)operator(\))operator(;) + + keyword(if) operator(()ident(offset) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newSystemCallError)operator(()string<delimiter(")content(Negative seek offset)delimiter(")>operator(\))operator(;) + operator(}) + + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(lseek)operator(()ident(offset)operator(,) ident(Stream)operator(.)ident(SEEK_SET)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoESPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(clearerr)operator(()operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(offset)operator(\))operator(;) + operator(}) + + comment(/** Print some objects to the stream. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(print)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) ident(IRubyObject) ident(print)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getLastLine)operator(()operator(\)) operator(})operator(;) + operator(}) + + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(fs) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($,)delimiter(")>operator(\))operator(;) + ident(IRubyObject) ident(rs) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($)char(\\\\)delimiter(")>operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(i) operator(>) integer(0) operator(&&) operator(!)ident(fs)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(fs)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(args)operator([)ident(i)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(nil)delimiter(")>operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(args)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()operator(!)ident(rs)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(rs)operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(printf)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(printf)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(RubyKernel)operator(.)ident(sprintf)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(args)operator(\))operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(putc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(backtrace) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(putc)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(object)operator(\)) operator({) + type(int) ident(c) operator(=) ident(RubyNumeric)operator(.)ident(num2chr)operator(()ident(object)operator(\))operator(;) + + keyword(try) operator({) + ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fputc)operator(()ident(c)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(object)operator(;) + operator(}) + + directive(public) ident(RubyFixnum) ident(seek)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(long) ident(offset) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + type(int) ident(whence) operator(=) ident(Stream)operator(.)ident(SEEK_SET)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(whence) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(doSeek)operator(()ident(context)operator(,) ident(offset)operator(,) ident(whence)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(seek)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(seek)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + type(long) ident(offset) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(;) + type(int) ident(whence) operator(=) ident(Stream)operator(.)ident(SEEK_SET)operator(;) + + keyword(return) ident(doSeek)operator(()ident(context)operator(,) ident(offset)operator(,) ident(whence)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(seek)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(seek)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + type(long) ident(offset) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg0)operator(\))operator(;) + type(int) ident(whence) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg1)operator(.)ident(convertToInteger)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(doSeek)operator(()ident(context)operator(,) ident(offset)operator(,) ident(whence)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyFixnum) ident(doSeek)operator(()ident(ThreadContext) ident(context)operator(,) type(long) ident(offset)operator(,) type(int) ident(whence)operator(\)) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(myOpenFile)operator(.)ident(seek)operator(()ident(offset)operator(,) ident(whence)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoESPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(clearerr)operator(()operator(\))operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(// This was a getOpt with one mandatory arg, but it did not work) + comment(// so I am parsing it for now.) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sysseek)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyFixnum) ident(sysseek)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(long) ident(offset) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + type(long) ident(pos)operator(;) + type(int) ident(whence) operator(=) ident(Stream)operator(.)ident(SEEK_SET)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(whence) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(try) operator({) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(isReadable)operator(()operator(\)) operator(&&) ident(myOpenFile)operator(.)ident(isReadBuffered)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(sysseek for buffered IO)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(myOpenFile)operator(.)ident(isWritable)operator(()operator(\)) operator(&&) ident(myOpenFile)operator(.)ident(isWriteBuffered)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(SYSSEEK_BUFFERED_IO)operator(,) string<delimiter(")content(sysseek for buffered IO)delimiter(")>operator(\))operator(;) + operator(}) + + ident(pos) operator(=) ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(lseek)operator(()ident(offset)operator(,) ident(whence)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoESPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(clearerr)operator(()operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(pos)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rewind)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(rewind)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(OpenFile) ident(myOpenfile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(myOpenfile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(lseek)operator(()integer(0L)operator(,) ident(Stream)operator(.)ident(SEEK_SET)operator(\))operator(;) + ident(myOpenfile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(clearerr)operator(()operator(\))operator(;) + + comment(// TODO: This is some goofy global file value from MRI..what to do?) +comment(// if (io == current_file\) {) +comment(// gets_lineno -= fptr->lineno;) +comment(// }) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoESPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(// Must be back on first line on rewind.) + ident(myOpenfile)operator(.)ident(setLineNumber)operator(()integer(0)operator(\))operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fsync)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(fsync)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(checkWritable)operator(()ident(runtime)operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(getWriteStream)operator(()operator(\))operator(.)ident(sync)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + comment(/** Sets the current sync mode. + * + * @param newSync The new sync mode. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sync=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(sync_set)operator(()ident(IRubyObject) ident(newSync)operator(\)) operator({) + ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(setSync)operator(()ident(newSync)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(setSync)operator(()ident(newSync)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(eof?)delimiter(")>operator(,) string<delimiter(")content(eof)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyBoolean) ident(eof_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(runtime)operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setReadBuffered)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(feof)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(readDataBuffered)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + ident(readCheck)operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(clearerr)operator(()operator(\))operator(;) + + type(int) ident(c) operator(=) ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fgetc)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(c) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(ungetc)operator(()ident(c)operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + ident(myOpenFile)operator(.)ident(checkClosed)operator(()ident(runtime)operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(clearerr)operator(()operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(tty?)delimiter(")>operator(,) string<delimiter(")content(isatty)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyBoolean) ident(tty_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(isatty)operator(()ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileDescriptor)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(original)operator(\))operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(original)operator(\)) keyword(return) local_variable(this)operator(;) + + ident(RubyIO) ident(originalIO) operator(=) operator(()ident(RubyIO)operator(\)) ident(TypeConverter)operator(.)ident(convertToTypeWithCheck)operator(()ident(original)operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_IO)operator(,) string<delimiter(")content(to_io)delimiter(")>operator(\))operator(;) + + ident(OpenFile) ident(originalFile) operator(=) ident(originalIO)operator(.)ident(getOpenFileChecked)operator(()operator(\))operator(;) + ident(OpenFile) ident(newFile) operator(=) ident(openFile)operator(;) + + keyword(try) operator({) + comment(// TODO: I didn't see where MRI has this check, but it seems to be the right place) + ident(originalFile)operator(.)ident(checkClosed)operator(()ident(runtime)operator(\))operator(;) + + keyword(if) operator(()ident(originalFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(originalFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(fflush)operator(()operator(\))operator(;) + ident(originalFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(lseek)operator(()integer(0)operator(,) ident(Stream)operator(.)ident(SEEK_CUR)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(originalFile)operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + ident(originalFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fflush)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(originalFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(lseek)operator(()integer(0)operator(,) ident(Stream)operator(.)ident(SEEK_CUR)operator(\))operator(;) + operator(}) + + ident(newFile)operator(.)ident(setMode)operator(()ident(originalFile)operator(.)ident(getMode)operator(()operator(\))operator(\))operator(;) + ident(newFile)operator(.)ident(setProcess)operator(()ident(originalFile)operator(.)ident(getProcess)operator(()operator(\))operator(\))operator(;) + ident(newFile)operator(.)ident(setLineNumber)operator(()ident(originalFile)operator(.)ident(getLineNumber)operator(()operator(\))operator(\))operator(;) + ident(newFile)operator(.)ident(setPath)operator(()ident(originalFile)operator(.)ident(getPath)operator(()operator(\))operator(\))operator(;) + ident(newFile)operator(.)ident(setFinalizer)operator(()ident(originalFile)operator(.)ident(getFinalizer)operator(()operator(\))operator(\))operator(;) + + ident(ModeFlags) ident(modes)operator(;) + keyword(if) operator(()ident(newFile)operator(.)ident(isReadable)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(newFile)operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(newFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(ModeFlags)operator(.)ident(RDONLY)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(ModeFlags)operator(.)ident(RDWR)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(ModeFlags)operator(.)ident(RDONLY)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(newFile)operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(ModeFlags)operator(.)ident(WRONLY)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modes) operator(=) ident(originalFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getModes)operator(()operator(\))operator(;) + operator(}) + operator(}) + + ident(ChannelDescriptor) ident(descriptor) operator(=) ident(originalFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(dup)operator(()operator(\))operator(;) + + ident(newFile)operator(.)ident(setMainStream)operator(()ident(ChannelStream)operator(.)ident(fdopen)operator(()ident(runtime)operator(,) ident(descriptor)operator(,) ident(modes)operator(\))operator(\))operator(;) + + comment(// TODO: the rest of this...seeking to same position is unnecessary since we share a channel) + comment(// but some of this may be needed?) + +comment(// fseeko(fptr->f, ftello(orig->f\), SEEK_SET\);) +comment(// if (orig->f2\) {) +comment(// if (fileno(orig->f\) != fileno(orig->f2\)\) {) +comment(// fd = ruby_dup(fileno(orig->f2\)\);) +comment(// }) +comment(// fptr->f2 = rb_fdopen(fd, "w"\);) +comment(// fseeko(fptr->f2, ftello(orig->f2\), SEEK_SET\);) +comment(// }) +comment(// if (fptr->mode & FMODE_BINMODE\) {) +comment(// rb_io_binmode(dest\);) +comment(// }) + + comment(// Register the new descriptor) + ident(registerDescriptor)operator(()ident(newFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(could not init copy: )delimiter(")> operator(+) ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(could not init copy: )delimiter(")> operator(+) ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(could not init copy: )delimiter(")> operator(+) ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(could not init copy: )delimiter(")> operator(+) ident(ex)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** Closes the IO. + * + * @return The IO. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(closed?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(closed_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\)) operator(==) keyword(null) operator(&&) ident(openFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(==) keyword(null)operator(\))operator(;) + operator(}) + + comment(/** + * <p>Closes all open resources for the IO. It also removes + * it from our magical all open file descriptor pool.</p> + * + * @return The IO. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't close)delimiter(")>operator(\))operator(;) + operator(}) + + ident(openFile)operator(.)ident(checkClosed)operator(()ident(runtime)operator(\))operator(;) + keyword(return) ident(close2)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(close2)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(if) operator(()ident(openFile) operator(==) keyword(null)operator(\)) keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + + comment(// These would be used when we notify threads...if we notify threads) + ident(interruptBlockingThreads)operator(()operator(\))operator(;) + + ident(ChannelDescriptor) ident(main)operator(,) ident(pipe)operator(;) + keyword(if) operator(()ident(openFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(pipe) operator(=) ident(openFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + ident(pipe) operator(=) keyword(null)operator(;) + operator(}) + + ident(main) operator(=) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(;) + + comment(// cleanup, raising errors if any) + ident(openFile)operator(.)ident(cleanup)operator(()ident(runtime)operator(,) keyword(true)operator(\))operator(;) + + comment(// TODO: notify threads waiting on descriptors/IO? probably not...) + + keyword(if) operator(()ident(openFile)operator(.)ident(getProcess)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(try) operator({) + ident(IRubyObject) ident(processResult) operator(=) ident(RubyProcess)operator(.)ident(RubyStatus)operator(.)ident(newProcessStatus)operator(()ident(runtime)operator(,) ident(openFile)operator(.)ident(getProcess)operator(()operator(\))operator(.)ident(waitFor)operator(()operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($?)delimiter(")>operator(,) ident(processResult)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(InterruptedException) ident(ie)operator(\)) operator({) + comment(// TODO: do something here?) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close_write)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close_write)operator(()ident(ThreadContext) ident(context)operator(\)) directive(throws) ident(BadDescriptorException) operator({) + keyword(try) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't close)delimiter(")>operator(\))operator(;) + operator(}) + + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(==) keyword(null) operator(&&) ident(myOpenFile)operator(.)ident(isReadable)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(closing non-duplex IO for writing)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(close)operator(()operator(\))operator(;) + operator(}) keyword(else)operator({) + ident(myOpenFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(.)ident(fclose)operator(()operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setPipeStream)operator(()keyword(null)operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setMode)operator(()ident(myOpenFile)operator(.)ident(getMode)operator(()operator(\)) operator(&) operator(~)ident(OpenFile)operator(.)ident(WRITABLE)operator(\))operator(;) + comment(// TODO) + comment(// n is result of fclose; but perhaps having a SysError below is enough?) + comment(// if (n != 0\) rb_sys_fail(fptr->path\);) + operator(}) + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + comment(// hmmmm) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close_read)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close_read)operator(()ident(ThreadContext) ident(context)operator(\)) directive(throws) ident(BadDescriptorException) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(try) operator({) + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't close)delimiter(")>operator(\))operator(;) + operator(}) + + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(==) keyword(null) operator(&&) ident(myOpenFile)operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()string<delimiter(")content(closing non-duplex IO for reading)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getPipeStream)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(close)operator(()operator(\))operator(;) + operator(}) keyword(else)operator({) + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fclose)operator(()operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setMode)operator(()ident(myOpenFile)operator(.)ident(getMode)operator(()operator(\)) operator(&) operator(~)ident(OpenFile)operator(.)ident(READABLE)operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setMainStream)operator(()ident(myOpenFile)operator(.)ident(getPipeStream)operator(()operator(\))operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setPipeStream)operator(()keyword(null)operator(\))operator(;) + comment(// TODO) + comment(// n is result of fclose; but perhaps having a SysError below is enough?) + comment(// if (n != 0\) rb_sys_fail(fptr->path\);) + operator(}) + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + comment(// I believe Ruby bails out with a "bug" if closing fails) + keyword(throw) ident(runtime)operator(.)ident(newIOErrorFromException)operator(()ident(ioe)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** Flushes the IO output stream. + * + * @return The IO. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(flush)delimiter(")>operator(\)) + directive(public) ident(RubyIO) ident(flush)operator(()operator(\)) operator({) + keyword(try) operator({) + ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getWriteStream)operator(()operator(\))operator(.)ident(fflush)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** Read a line. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gets)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) ident(IRubyObject) ident(gets)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(ByteList) ident(separator) operator(=) ident(getSeparatorForGets)operator(()ident(runtime)operator(,) ident(args)operator(\))operator(;) + + ident(IRubyObject) ident(result) operator(=) ident(getline)operator(()ident(runtime)operator(,) ident(separator)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(result)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(public) type(boolean) ident(getBlocking)operator(()operator(\)) operator({) + keyword(return) operator(()operator(()ident(ChannelStream)operator(\)) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(\))operator(.)ident(isBlocking)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fcntl)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(fcntl)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(cmd)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + comment(// TODO: This version differs from ioctl by checking whether fcntl exists) + comment(// and raising notimplemented if it doesn't; perhaps no difference for us?) + keyword(return) ident(ctl)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(cmd)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ioctl)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(ioctl)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(cmd) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(IRubyObject) ident(arg)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(2)operator(\)) operator({) + ident(arg) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + operator(}) keyword(else) operator({) + ident(arg) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(ctl)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(cmd)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(ctl)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(cmd)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + type(long) ident(realCmd) operator(=) ident(cmd)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(nArg) operator(=) integer(0)operator(;) + + comment(// FIXME: Arg may also be true, false, and nil and still be valid. Strangely enough, ) + comment(// protocol conversion is not happening in Ruby on this arg?) + keyword(if) operator(()ident(arg)operator(.)ident(isNil)operator(()operator(\)) operator(||) ident(arg) operator(==) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(\)) operator({) + ident(nArg) operator(=) integer(0)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(nArg) operator(=) ident(RubyFixnum)operator(.)ident(fix2long)operator(()ident(arg)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(arg) operator(==) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(\)) operator({) + ident(nArg) operator(=) integer(1)operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(JRuby does not support string for second fcntl/ioctl argument yet)delimiter(")>operator(\))operator(;) + operator(}) + + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + comment(// Fixme: Only F_SETFL is current supported) + keyword(if) operator(()ident(realCmd) operator(==) integer(1L)operator(\)) operator({) comment(// cmd is F_SETFL) + type(boolean) ident(block) operator(=) keyword(true)operator(;) + + keyword(if) operator(()operator(()ident(nArg) operator(&) ident(ModeFlags)operator(.)ident(NONBLOCK)operator(\)) operator(==) ident(ModeFlags)operator(.)ident(NONBLOCK)operator(\)) operator({) + ident(block) operator(=) keyword(false)operator(;) + operator(}) + + keyword(try) operator({) + ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(setBlocking)operator(()ident(block)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(JRuby only supports F_SETFL for fcntl/ioctl currently)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) ident(ByteList) ident(NIL_BYTELIST) operator(=) ident(ByteList)operator(.)ident(create)operator(()string<delimiter(")content(nil)delimiter(")>operator(\))operator(;) + directive(private) directive(static) directive(final) ident(ByteList) ident(RECURSIVE_BYTELIST) operator(=) ident(ByteList)operator(.)ident(create)operator(()string<delimiter(")content([...])delimiter(")>operator(\))operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(puts)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(puts)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(assert) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(getDefaultSeparator)operator(()operator(\)) keyword(instanceof) ident(RubyString)operator(;) + ident(RubyString) ident(separator) operator(=) operator(()ident(RubyString)operator(\)) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(getDefaultSeparator)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(write)operator(()ident(context)operator(,) ident(separator)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(ByteList) ident(line)operator(;) + + keyword(if) operator(()ident(args)operator([)ident(i)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(line) operator(=) ident(NIL_BYTELIST)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(runtime)operator(.)ident(isInspecting)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(\)) operator({) + ident(line) operator(=) ident(RECURSIVE_BYTELIST)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)ident(i)operator(]) keyword(instanceof) ident(RubyArray)operator(\)) operator({) + ident(inspectPuts)operator(()ident(context)operator(,) operator(()ident(RubyArray)operator(\)) ident(args)operator([)ident(i)operator(])operator(\))operator(;) + keyword(continue)operator(;) + operator(}) keyword(else) operator({) + ident(line) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(asString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + operator(}) + + ident(write)operator(()ident(context)operator(,) ident(line)operator(\))operator(;) + + keyword(if) operator(()ident(line)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0) operator(||) operator(!)ident(line)operator(.)ident(endsWith)operator(()ident(separator)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(\)) operator({) + ident(write)operator(()ident(context)operator(,) ident(separator)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(void) ident(write)operator(()ident(ThreadContext) ident(context)operator(,) ident(ByteList) ident(byteList)operator(\)) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(byteList)operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(inspectPuts)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyArray) ident(array)operator(\)) operator({) + keyword(try) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(registerInspecting)operator(()ident(array)operator(\))operator(;) + keyword(return) ident(puts)operator(()ident(context)operator(,) ident(array)operator(.)ident(toJavaArray)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(unregisterInspecting)operator(()ident(array)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** Read a line. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readline)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) ident(IRubyObject) ident(readline)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(line) operator(=) ident(gets)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + + keyword(if) operator(()ident(line)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + + keyword(return) ident(line)operator(;) + operator(}) + + comment(/** Read a byte. On EOF returns nil. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getc)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(getc)operator(()operator(\)) operator({) + keyword(try) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setReadBuffered)operator(()operator(\))operator(;) + + ident(Stream) ident(stream) operator(=) ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(;) + + ident(readCheck)operator(()ident(stream)operator(\))operator(;) + ident(stream)operator(.)ident(clearerr)operator(()operator(\))operator(;) + + type(int) ident(c) operator(=) ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fgetc)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) operator({) + comment(// TODO: check for ferror, clear it, and try once more up above readCheck) +comment(// if (ferror(f\)\) {) +comment(// clearerr(f\);) +comment(// if (!rb_io_wait_readable(fileno(f\)\)\)) +comment(// rb_sys_fail(fptr->path\);) +comment(// goto retry;) +comment(// }) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(c)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(readCheck)operator(()ident(Stream) ident(stream)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(stream)operator(.)ident(readDataBuffered)operator(()operator(\))operator(\)) operator({) + ident(openFile)operator(.)ident(checkClosed)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * <p>Pushes char represented by int back onto IOS.</p> + * + * @param number to push back + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ungetc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(ungetc)operator(()ident(IRubyObject) ident(number)operator(\)) operator({) + type(int) ident(ch) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(number)operator(\))operator(;) + + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(myOpenFile)operator(.)ident(isReadBuffered)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(unread stream)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setReadBuffered)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(ungetc)operator(()ident(ch)operator(\)) operator(==) operator(-)integer(1) operator(&&) ident(ch) operator(!=) operator(-)integer(1)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(ungetc failed)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read_nonblock)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(read_nonblock)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(openFile)operator(.)ident(checkClosed)operator(()ident(runtime)operator(\))operator(;) + + keyword(if)operator(()operator(!)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\)) keyword(instanceof) ident(ChannelStream)operator(\))operator(\)) operator({) + comment(// cryptic for the uninitiated...) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(read_nonblock only works with Nio based handlers)delimiter(")>operator(\))operator(;) + operator(}) + keyword(try) operator({) + type(int) ident(maxLength) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(maxLength) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative length )delimiter(")> operator(+) ident(maxLength) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + operator(}) + ident(ByteList) ident(buf) operator(=) operator(()operator(()ident(ChannelStream)operator(\))ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(\))operator(.)ident(readnonblock)operator(()ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(\))operator(;) + ident(IRubyObject) ident(strbuf) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(buf) operator(==) keyword(null) operator(?) keyword(new) ident(ByteList)operator(()ident(ByteList)operator(.)ident(NULL_ARRAY)operator(\)) operator(:) ident(buf)operator(\))operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(args)operator([)integer(1)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_LSHIFT)operator(,) string<delimiter(")content(<<)delimiter(")>operator(,) ident(strbuf)operator(\))operator(;) + keyword(return) ident(args)operator([)integer(1)operator(])operator(;) + operator(}) + + keyword(return) ident(strbuf)operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readpartial)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(readpartial)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(openFile)operator(.)ident(checkClosed)operator(()ident(runtime)operator(\))operator(;) + + keyword(if)operator(()operator(!)operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\)) keyword(instanceof) ident(ChannelStream)operator(\))operator(\)) operator({) + comment(// cryptic for the uninitiated...) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(readpartial only works with Nio based handlers)delimiter(")>operator(\))operator(;) + operator(}) + keyword(try) operator({) + type(int) ident(maxLength) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(maxLength) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative length )delimiter(")> operator(+) ident(maxLength) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + operator(}) + ident(ByteList) ident(buf) operator(=) operator(()operator(()ident(ChannelStream)operator(\))ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(\))operator(.)ident(readpartial)operator(()ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(\))operator(;) + ident(IRubyObject) ident(strbuf) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(buf) operator(==) keyword(null) operator(?) keyword(new) ident(ByteList)operator(()ident(ByteList)operator(.)ident(NULL_ARRAY)operator(\)) operator(:) ident(buf)operator(\))operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(args)operator([)integer(1)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_LSHIFT)operator(,) string<delimiter(")content(<<)delimiter(")>operator(,) ident(strbuf)operator(\))operator(;) + keyword(return) ident(args)operator([)integer(1)operator(])operator(;) + operator(}) + + keyword(return) ident(strbuf)operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sysread)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(sysread)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(int) ident(len) operator(=) operator(()type(int)operator(\))ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(Negative size)delimiter(")>operator(\))operator(;) + + keyword(try) operator({) + ident(RubyString) ident(str)operator(;) + ident(ByteList) ident(buffer)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1) operator(||) ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(ByteList)operator(.)ident(EMPTY_BYTELIST)operator(\))operator(;) + operator(}) + + ident(buffer) operator(=) keyword(new) ident(ByteList)operator(()ident(len)operator(\))operator(;) + ident(str) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(buffer)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(str) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(str)operator(.)ident(modify)operator(()ident(len)operator(\))operator(;) + + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(str)operator(;) + operator(}) + + ident(buffer) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + operator(}) + + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(readDataBuffered)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(sysread for buffered IO)delimiter(")>operator(\))operator(;) + operator(}) + + comment(// TODO: Ruby locks the string here) + + ident(context)operator(.)ident(getThread)operator(()operator(\))operator(.)ident(beforeBlockingCall)operator(()operator(\))operator(;) + ident(myOpenFile)operator(.)ident(checkClosed)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + comment(// TODO: Ruby re-checks that the buffer string hasn't been modified) + + type(int) ident(bytesRead) operator(=) ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(read)operator(()ident(len)operator(,) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + + comment(// TODO: Ruby unlocks the string here) + + comment(// TODO: Ruby truncates string to specific size here, but our bytelist should handle this already?) + + keyword(if) operator(()ident(bytesRead) operator(==) operator(-)integer(1) operator(||) operator(()ident(bytesRead) operator(==) integer(0) operator(&&) ident(len) operator(>) integer(0)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) + + ident(str)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + + keyword(return) ident(str)operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + comment(// All errors to sysread should be SystemCallErrors, but on a closed stream) + comment(// Ruby returns an IOError. Java throws same exception for all errors so) + comment(// we resort to this hack...) + keyword(if) operator(()string<delimiter(")content(File not open)delimiter(")>operator(.)ident(equals)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSystemCallError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(getThread)operator(()operator(\))operator(.)ident(afterBlockingCall)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) ident(IRubyObject) ident(read)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) keyword(return) ident(read)operator(()ident(context)operator(\))operator(;) + keyword(case) integer(1)operator(:) keyword(return) ident(read)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(read)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(2)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(read)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(runtime)operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setReadBuffered)operator(()operator(\))operator(;) + + keyword(return) ident(readAll)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(read)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(if) operator(()ident(arg0)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(read)operator(()ident(context)operator(\))operator(;) + operator(}) + + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + type(int) ident(length) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg0)operator(\))operator(;) + + keyword(if) operator(()ident(length) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative length )delimiter(")> operator(+) ident(length) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyString) ident(str) operator(=) keyword(null)operator(;) + + keyword(return) ident(readNotAll)operator(()ident(context)operator(,) ident(myOpenFile)operator(,) ident(length)operator(,) ident(str)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(read)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(arg0)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setReadBuffered)operator(()operator(\))operator(;) + + keyword(return) ident(readAll)operator(()ident(arg1)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + type(int) ident(length) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg0)operator(\))operator(;) + + keyword(if) operator(()ident(length) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative length )delimiter(")> operator(+) ident(length) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyString) ident(str) operator(=) keyword(null)operator(;) +comment(// ByteList buffer = null;) + keyword(if) operator(()ident(arg1)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) +comment(// buffer = new ByteList(length\);) +comment(// str = RubyString.newString(getRuntime(\), buffer\);) + operator(}) keyword(else) operator({) + ident(str) operator(=) ident(arg1)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(str)operator(.)ident(modify)operator(()ident(length)operator(\))operator(;) + + keyword(if) operator(()ident(length) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(str)operator(;) + operator(}) + +comment(// buffer = str.getByteList(\);) + operator(}) + + keyword(return) ident(readNotAll)operator(()ident(context)operator(,) ident(myOpenFile)operator(,) ident(length)operator(,) ident(str)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(readNotAll)operator(()ident(ThreadContext) ident(context)operator(,) ident(OpenFile) ident(myOpenFile)operator(,) type(int) ident(length)operator(,) ident(RubyString) ident(str)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(runtime)operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setReadBuffered)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(feof)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(// TODO: Ruby locks the string here) + + comment(// READ_CHECK from MRI io.c) + ident(readCheck)operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(\))operator(;) + + comment(// TODO: check buffer length again?) + comment(// if (RSTRING(str\)->len != len\) {) + comment(// rb_raise(rb_eRuntimeError, "buffer string modified"\);) + comment(// }) + + comment(// TODO: read into buffer using all the fread logic) + comment(// int read = openFile.getMainStream(\).fread(buffer\);) + ident(ByteList) ident(newBuffer) operator(=) ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fread)operator(()ident(length)operator(\))operator(;) + + comment(// TODO: Ruby unlocks the string here) + + comment(// TODO: change this to check number read into buffer once that's working) + comment(// if (read == 0\) {) + + keyword(if) operator(()ident(newBuffer) operator(==) keyword(null) operator(||) ident(newBuffer)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(feof)operator(()operator(\))operator(\)) operator({) + comment(// truncate buffer string to zero, if provided) + keyword(if) operator(()ident(str) operator(!=) keyword(null)operator(\)) operator({) + ident(str)operator(.)ident(setValue)operator(()ident(ByteList)operator(.)ident(EMPTY_BYTELIST)operator(.)ident(dup)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(// Removed while working on JRUBY-2386, since fixes for that) + comment(// modified EOF logic such that this check is not really valid.) + comment(// We expect that an EOFException will be thrown now in EOF) + comment(// cases.) +comment(// if (length > 0\) {) +comment(// // I think this is only partly correct; sys fail based on errno in Ruby) +comment(// throw getRuntime(\).newEOFError(\);) +comment(// }) + operator(}) + + + comment(// TODO: Ruby truncates string to specific size here, but our bytelist should handle this already?) + + comment(// FIXME: I don't like the null checks here) + keyword(if) operator(()ident(str) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(newBuffer) operator(==) keyword(null)operator(\)) operator({) + ident(str) operator(=) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(str) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(newBuffer)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(newBuffer) operator(==) keyword(null)operator(\)) operator({) + ident(str)operator(.)ident(empty)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(str)operator(.)ident(setValue)operator(()ident(newBuffer)operator(\))operator(;) + operator(}) + operator(}) + ident(str)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + + keyword(return) ident(str)operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOErrorFromException)operator(()ident(ex)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(protected) ident(IRubyObject) ident(readAll)operator(()ident(IRubyObject) ident(buffer)operator(\)) directive(throws) ident(BadDescriptorException)operator(,) type(EOFException)operator(,) type(IOException) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + comment(// TODO: handle writing into original buffer better) + + ident(RubyString) ident(str) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(buffer) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(str) operator(=) operator(()ident(RubyString)operator(\))ident(buffer)operator(;) + operator(}) + + comment(// TODO: ruby locks the string here) + + comment(// READ_CHECK from MRI io.c) + keyword(if) operator(()ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(readDataBuffered)operator(()operator(\))operator(\)) operator({) + ident(openFile)operator(.)ident(checkClosed)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + ident(ByteList) ident(newBuffer) operator(=) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(readall)operator(()operator(\))operator(;) + + comment(// TODO same zero-length checks as file above) + + keyword(if) operator(()ident(str) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(newBuffer) operator(==) keyword(null)operator(\)) operator({) + ident(str) operator(=) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(str) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(newBuffer)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(newBuffer) operator(==) keyword(null)operator(\)) operator({) + ident(str)operator(.)ident(empty)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(str)operator(.)ident(setValue)operator(()ident(newBuffer)operator(\))operator(;) + operator(}) + operator(}) + + ident(str)operator(.)ident(taint)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(str)operator(;) +comment(// long bytes = 0;) +comment(// long n;) +comment(//) +comment(// if (siz == 0\) siz = BUFSIZ;) +comment(// if (NIL_P(str\)\) {) +comment(// str = rb_str_new(0, siz\);) +comment(// }) +comment(// else {) +comment(// rb_str_resize(str, siz\);) +comment(// }) +comment(// for (;;\) {) +comment(// rb_str_locktmp(str\);) +comment(// READ_CHECK(fptr->f\);) +comment(// n = io_fread(RSTRING(str\)->ptr+bytes, siz-bytes, fptr\);) +comment(// rb_str_unlocktmp(str\);) +comment(// if (n == 0 && bytes == 0\) {) +comment(// if (!fptr->f\) break;) +comment(// if (feof(fptr->f\)\) break;) +comment(// if (!ferror(fptr->f\)\) break;) +comment(// rb_sys_fail(fptr->path\);) +comment(// }) +comment(// bytes += n;) +comment(// if (bytes < siz\) break;) +comment(// siz += BUFSIZ;) +comment(// rb_str_resize(str, siz\);) +comment(// }) +comment(// if (bytes != siz\) rb_str_resize(str, bytes\);) +comment(// OBJ_TAINT(str\);) +comment(//) +comment(// return str;) + operator(}) + + comment(// TODO: There's a lot of complexity here due to error handling and) + comment(// nonblocking IO; much of this goes away, but for now I'm just) + comment(// having read call ChannelStream.fread directly.) +comment(// protected int fread(int len, ByteList buffer\) {) +comment(// long n = len;) +comment(// int c;) +comment(// int saved_errno;) +comment(//) +comment(// while (n > 0\) {) +comment(// c = read_buffered_data(ptr, n, fptr->f\);) +comment(// if (c < 0\) goto eof;) +comment(// if (c > 0\) {) +comment(// ptr += c;) +comment(// if ((n -= c\) <= 0\) break;) +comment(// }) +comment(// rb_thread_wait_fd(fileno(fptr->f\)\);) +comment(// rb_io_check_closed(fptr\);) +comment(// clearerr(fptr->f\);) +comment(// TRAP_BEG;) +comment(// c = getc(fptr->f\);) +comment(// TRAP_END;) +comment(// if (c == EOF\) {) +comment(// eof:) +comment(// if (ferror(fptr->f\)\) {) +comment(// switch (errno\) {) +comment(// case EINTR:) +comment(// #if defined(ERESTART\)) +comment(// case ERESTART:) +comment(// #endif) +comment(// clearerr(fptr->f\);) +comment(// continue;) +comment(// case EAGAIN:) +comment(// #if defined(EWOULDBLOCK\) && EWOULDBLOCK != EAGAIN) +comment(// case EWOULDBLOCK:) +comment(// #endif) +comment(// if (len > n\) {) +comment(// clearerr(fptr->f\);) +comment(// }) +comment(// saved_errno = errno;) +comment(// rb_warning("nonblocking IO#read is obsolete; use IO#readpartial or IO#sysread"\);) +comment(// errno = saved_errno;) +comment(// }) +comment(// if (len == n\) return 0;) +comment(// }) +comment(// break;) +comment(// }) +comment(// *ptr++ = c;) +comment(// n--;) +comment(// }) +comment(// return len - n;) +comment(// ) +comment(// }) + + comment(/** Read a byte. On EOF throw EOFError. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readchar)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(readchar)operator(()operator(\)) operator({) + ident(IRubyObject) ident(c) operator(=) ident(getc)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(c)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + + keyword(return) ident(c)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(stat)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(openFile)operator(.)ident(checkClosed)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(getOpenFileChecked)operator(()operator(\))operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileDescriptor)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * <p>Invoke a block for each byte.</p> + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_byte)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each_byte)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(OpenFile) ident(myOpenFile) operator(=) ident(getOpenFileChecked)operator(()operator(\))operator(;) + + keyword(while) operator(()keyword(true)operator(\)) operator({) + ident(myOpenFile)operator(.)ident(checkReadable)operator(()ident(runtime)operator(\))operator(;) + ident(myOpenFile)operator(.)ident(setReadBuffered)operator(()operator(\))operator(;) + + comment(// TODO: READ_CHECK from MRI) + + type(int) ident(c) operator(=) ident(myOpenFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(fgetc)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(c) operator(==) operator(-)integer(1)operator(\)) operator({) + comment(// TODO: check for error, clear it, and wait until readable before trying once more) +comment(// if (ferror(f\)\) {) +comment(// clearerr(f\);) +comment(// if (!rb_io_wait_readable(fileno(f\)\)\)) +comment(// rb_sys_fail(fptr->path\);) +comment(// continue;) +comment(// }) + keyword(break)operator(;) + operator(}) + + ident(assert) ident(c) operator(<) integer(256)operator(;) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(c)operator(\))operator(\))operator(;) + operator(}) + + comment(// TODO: one more check for error) +comment(// if (ferror(f\)\) rb_sys_fail(fptr->path\);) + keyword(return) local_variable(this)operator(;) + operator(}) keyword(catch) operator(()ident(PipeException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEPIPEError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(BadDescriptorException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEBADFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(EOFException) ident(e)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * <p>Invoke a block for each line.</p> + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(each_line)delimiter(")>operator(,) string<delimiter(")content(each)delimiter(")>operator(})operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyIO) ident(each_line)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(ByteList) ident(separator) operator(=) ident(getSeparatorForGets)operator(()ident(runtime)operator(,) ident(args)operator(\))operator(;) + + keyword(for) operator(()ident(IRubyObject) ident(line) operator(=) ident(getline)operator(()ident(runtime)operator(,) ident(separator)operator(\))operator(;) operator(!)ident(line)operator(.)ident(isNil)operator(()operator(\))operator(;) + ident(line) operator(=) ident(getline)operator(()ident(runtime)operator(,) ident(separator)operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(line)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyArray) ident(readlines)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject)type([]) ident(separatorArgs) operator(=) ident(args)operator(.)ident(length) operator(>) integer(0) operator(?) keyword(new) ident(IRubyObject)type([]) operator({) ident(args)operator([)integer(0)operator(]) operator(}) operator(:) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(;) + ident(ByteList) ident(separator) operator(=) ident(getSeparatorForGets)operator(()ident(runtime)operator(,) ident(separatorArgs)operator(\))operator(;) + ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + ident(IRubyObject) ident(line)operator(;) + + keyword(while) operator(()operator(!) operator(()ident(line) operator(=) ident(getline)operator(()ident(runtime)operator(,) ident(separator)operator(\))operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(line)operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_io)delimiter(")>operator(\)) + directive(public) ident(RubyIO) ident(to_io)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(String) ident(toString)operator(()operator(\)) operator({) + keyword(return) string<delimiter(")content(RubyIO()delimiter(")> operator(+) ident(openFile)operator(.)ident(getMode)operator(()operator(\)) operator(+) string<delimiter(")content(, )delimiter(")> operator(+) ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(.)ident(getFileno)operator(()operator(\)) operator(+) string<delimiter(")content(\))delimiter(")>operator(;) + operator(}) + + comment(/* class methods for IO */) + + comment(/** rb_io_s_foreach + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(foreach)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(foreach)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(count) operator(=) ident(args)operator(.)ident(length)operator(;) + ident(IRubyObject) ident(filename) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(checkSafeString)operator(()ident(filename)operator(\))operator(;) + + ident(ByteList) ident(separator) operator(=) ident(getSeparatorFromArgs)operator(()ident(runtime)operator(,) ident(args)operator(,) integer(1)operator(\))operator(;) + + ident(RubyIO) ident(io) operator(=) operator(()ident(RubyIO)operator(\))ident(RubyFile)operator(.)ident(open)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getFile)operator(()operator(\))operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(filename) operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(io)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(IRubyObject) ident(str) operator(=) ident(io)operator(.)ident(getline)operator(()ident(runtime)operator(,) ident(separator)operator(\))operator(;) + keyword(while) operator(()operator(!)ident(str)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(str)operator(\))operator(;) + ident(str) operator(=) ident(io)operator(.)ident(getline)operator(()ident(runtime)operator(,) ident(separator)operator(\))operator(;) + operator(}) + operator(}) keyword(finally) operator({) + ident(io)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(RubyIO) ident(convertToIO)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) operator(()ident(RubyIO)operator(\))ident(TypeConverter)operator(.)ident(convertToType)operator(()ident(obj)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getIO)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_IO)operator(,) string<delimiter(")content(to_io)delimiter(")>operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(boolean) ident(registerSelect)operator(()ident(ThreadContext) ident(context)operator(,) type(Selector) ident(selector)operator(,) ident(IRubyObject) ident(obj)operator(,) ident(RubyIO) ident(ioObj)operator(,) type(int) ident(ops)operator(\)) directive(throws) type(IOException) operator({) + type(Channel) ident(channel) operator(=) ident(ioObj)operator(.)ident(getChannel)operator(()operator(\))operator(;) + keyword(if) operator(()ident(channel) operator(==) keyword(null) operator(||) operator(!)operator(()ident(channel) keyword(instanceof) type(SelectableChannel)operator(\))operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(configureBlocking)operator(()keyword(false)operator(\))operator(;) + type(int) ident(real_ops) operator(=) operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(validOps)operator(()operator(\)) operator(&) ident(ops)operator(;) + type(SelectionKey) ident(key) operator(=) operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(keyFor)operator(()ident(selector)operator(\))operator(;) + + keyword(if) operator(()ident(key) operator(==) keyword(null)operator(\)) operator({) + operator(()operator(()type(SelectableChannel)operator(\)) ident(channel)operator(\))operator(.)ident(register)operator(()ident(selector)operator(,) ident(real_ops)operator(,) ident(obj)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(key)operator(.)ident(interestOps)operator(()ident(key)operator(.)ident(interestOps)operator(()operator(\))operator(|)ident(real_ops)operator(\))operator(;) + operator(}) + + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(select)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(3)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(select)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(select_static)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(checkArrayType)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(obj) keyword(instanceof) ident(RubyArray)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type )delimiter(")> + operator(+) ident(obj)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( (expected Array\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(IRubyObject) ident(select_static)operator(()ident(ThreadContext) ident(context)operator(,) ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(try) operator({) + type(Set) ident(pending) operator(=) keyword(new) type(HashSet)operator(()operator(\))operator(;) + type(Set) ident(unselectable_reads) operator(=) keyword(new) type(HashSet)operator(()operator(\))operator(;) + type(Set) ident(unselectable_writes) operator(=) keyword(new) type(HashSet)operator(()operator(\))operator(;) + type(Selector) ident(selector) operator(=) type(Selector)operator(.)ident(open)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + comment(// read) + ident(checkArrayType)operator(()ident(runtime)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(for) operator(()type(Iterator) ident(i) operator(=) operator(()operator(()ident(RubyArray)operator(\)) ident(args)operator([)integer(0)operator(])operator(\))operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;) operator(\)) operator({) + ident(IRubyObject) ident(obj) operator(=) operator(()ident(IRubyObject)operator(\)) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + ident(RubyIO) ident(ioObj) operator(=) ident(convertToIO)operator(()ident(context)operator(,) ident(obj)operator(\))operator(;) + keyword(if) operator(()ident(registerSelect)operator(()ident(context)operator(,) ident(selector)operator(,) ident(obj)operator(,) ident(ioObj)operator(,) type(SelectionKey)operator(.)ident(OP_READ) operator(|) type(SelectionKey)operator(.)ident(OP_ACCEPT)operator(\))operator(\)) operator({) + keyword(if) operator(()ident(ioObj)operator(.)ident(writeDataBuffered)operator(()operator(\))operator(\)) operator({) + ident(pending)operator(.)ident(add)operator(()ident(obj)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()operator(() ident(ioObj)operator(.)ident(openFile)operator(.)ident(getMode)operator(()operator(\)) operator(&) ident(OpenFile)operator(.)ident(READABLE) operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(unselectable_reads)operator(.)ident(add)operator(()ident(obj)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1) operator(&&) operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + comment(// write) + ident(checkArrayType)operator(()ident(runtime)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(for) operator(()type(Iterator) ident(i) operator(=) operator(()operator(()ident(RubyArray)operator(\)) ident(args)operator([)integer(1)operator(])operator(\))operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;) operator(\)) operator({) + ident(IRubyObject) ident(obj) operator(=) operator(()ident(IRubyObject)operator(\)) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + ident(RubyIO) ident(ioObj) operator(=) ident(convertToIO)operator(()ident(context)operator(,) ident(obj)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(registerSelect)operator(()ident(context)operator(,) ident(selector)operator(,) ident(obj)operator(,) ident(ioObj)operator(,) type(SelectionKey)operator(.)ident(OP_WRITE)operator(\))operator(\)) operator({) + keyword(if) operator(()operator(() ident(ioObj)operator(.)ident(openFile)operator(.)ident(getMode)operator(()operator(\)) operator(&) ident(OpenFile)operator(.)ident(WRITABLE) operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(unselectable_writes)operator(.)ident(add)operator(()ident(obj)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(2) operator(&&) operator(!)ident(args)operator([)integer(2)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(checkArrayType)operator(()ident(runtime)operator(,) ident(args)operator([)integer(2)operator(])operator(\))operator(;) + comment(// Java's select doesn't do anything about this, so we leave it be.) + operator(}) + + directive(final) type(boolean) ident(has_timeout) operator(=) operator(() ident(args)operator(.)ident(length) operator(>) integer(3) operator(&&) operator(!)ident(args)operator([)integer(3)operator(])operator(.)ident(isNil)operator(()operator(\)) operator(\))operator(;) + type(long) ident(timeout) operator(=) integer(0)operator(;) + keyword(if)operator(()ident(has_timeout)operator(\)) operator({) + ident(IRubyObject) ident(timeArg) operator(=) ident(args)operator([)integer(3)operator(])operator(;) + keyword(if) operator(()ident(timeArg) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + ident(timeout) operator(=) type(Math)operator(.)ident(round)operator(()operator(()operator(()ident(RubyFloat)operator(\)) ident(timeArg)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\)) operator(*) integer(1000)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(timeArg) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(timeout) operator(=) type(Math)operator(.)ident(round)operator(()operator(()operator(()ident(RubyFixnum)operator(\)) ident(timeArg)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\)) operator(*) integer(1000)operator(\))operator(;) + operator(}) keyword(else) operator({) comment(// TODO: MRI also can hadle Bignum here) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> + operator(+) ident(timeArg)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( into time interval)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(timeout) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative timeout given)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(pending)operator(.)ident(isEmpty)operator(()operator(\)) operator(&&) ident(unselectable_reads)operator(.)ident(isEmpty)operator(()operator(\)) operator(&&) ident(unselectable_writes)operator(.)ident(isEmpty)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(has_timeout)operator(\)) operator({) + keyword(if) operator(()ident(timeout)operator(==)integer(0)operator(\)) operator({) + ident(selector)operator(.)ident(selectNow)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(selector)operator(.)ident(select)operator(()ident(timeout)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(selector)operator(.)ident(select)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(selector)operator(.)ident(selectNow)operator(()operator(\))operator(;) + operator(}) + + type(List) ident(r) operator(=) keyword(new) type(ArrayList)operator(()operator(\))operator(;) + type(List) ident(w) operator(=) keyword(new) type(ArrayList)operator(()operator(\))operator(;) + type(List) ident(e) operator(=) keyword(new) type(ArrayList)operator(()operator(\))operator(;) + keyword(for) operator(()type(Iterator) ident(i) operator(=) ident(selector)operator(.)ident(selectedKeys)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;) operator(\)) operator({) + type(SelectionKey) ident(key) operator(=) operator(()type(SelectionKey)operator(\)) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + keyword(if) operator(()operator(()ident(key)operator(.)ident(interestOps)operator(()operator(\)) operator(&) ident(key)operator(.)ident(readyOps)operator(()operator(\)) + operator(&) operator(()type(SelectionKey)operator(.)ident(OP_READ)operator(|)type(SelectionKey)operator(.)ident(OP_ACCEPT)operator(|)type(SelectionKey)operator(.)ident(OP_CONNECT)operator(\))operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(r)operator(.)ident(add)operator(()ident(key)operator(.)ident(attachment)operator(()operator(\))operator(\))operator(;) + ident(pending)operator(.)ident(remove)operator(()ident(key)operator(.)ident(attachment)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(()ident(key)operator(.)ident(interestOps)operator(()operator(\)) operator(&) ident(key)operator(.)ident(readyOps)operator(()operator(\)) operator(&) operator(()type(SelectionKey)operator(.)ident(OP_WRITE)operator(\))operator(\)) operator(!=) integer(0)operator(\)) operator({) + ident(w)operator(.)ident(add)operator(()ident(key)operator(.)ident(attachment)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + ident(r)operator(.)ident(addAll)operator(()ident(pending)operator(\))operator(;) + ident(r)operator(.)ident(addAll)operator(()ident(unselectable_reads)operator(\))operator(;) + ident(w)operator(.)ident(addAll)operator(()ident(unselectable_writes)operator(\))operator(;) + + comment(// make all sockets blocking as configured again) + keyword(for) operator(()type(Iterator) ident(i) operator(=) ident(selector)operator(.)ident(keys)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;) operator(\)) operator({) + type(SelectionKey) ident(key) operator(=) operator(()type(SelectionKey)operator(\)) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + type(SelectableChannel) ident(channel) operator(=) ident(key)operator(.)ident(channel)operator(()operator(\))operator(;) + directive(synchronized)operator(()ident(channel)operator(.)ident(blockingLock)operator(()operator(\))operator(\)) operator({) + ident(RubyIO) ident(originalIO) operator(=) operator(()ident(RubyIO)operator(\)) ident(TypeConverter)operator(.)ident(convertToType)operator(() + operator(()ident(IRubyObject)operator(\)) ident(key)operator(.)ident(attachment)operator(()operator(\))operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(,) + ident(MethodIndex)operator(.)ident(TO_IO)operator(,) string<delimiter(")content(to_io)delimiter(")>operator(\))operator(;) + type(boolean) ident(blocking) operator(=) ident(originalIO)operator(.)ident(getBlocking)operator(()operator(\))operator(;) + ident(key)operator(.)ident(cancel)operator(()operator(\))operator(;) + ident(channel)operator(.)ident(configureBlocking)operator(()ident(blocking)operator(\))operator(;) + operator(}) + operator(}) + ident(selector)operator(.)ident(close)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(r)operator(.)ident(size)operator(()operator(\)) operator(==) integer(0) operator(&&) ident(w)operator(.)ident(size)operator(()operator(\)) operator(==) integer(0) operator(&&) ident(e)operator(.)ident(size)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + type(List) ident(ret) operator(=) keyword(new) type(ArrayList)operator(()operator(\))operator(;) + + ident(ret)operator(.)ident(add)operator(()ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(r)operator(\))operator(\))operator(;) + ident(ret)operator(.)ident(add)operator(()ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(w)operator(\))operator(\))operator(;) + ident(ret)operator(.)ident(add)operator(()ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(e)operator(\))operator(\))operator(;) + + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(runtime)operator(,) ident(ret)operator(\))operator(;) + operator(}) keyword(catch)operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOError)operator(()ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(IRubyObject) ident(read)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(case) integer(1)operator(:) keyword(return) ident(read)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(read)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(case) integer(3)operator(:) keyword(return) ident(read)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(args)operator([)integer(2)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(default)operator(:) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(3)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(read)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject)type([]) ident(fileArguments) operator(=) keyword(new) ident(IRubyObject)type([]) operator({)ident(arg0)operator(})operator(;) + ident(RubyIO) ident(file) operator(=) operator(()ident(RubyIO)operator(\)) ident(RubyKernel)operator(.)ident(open)operator(()ident(context)operator(,) ident(recv)operator(,) ident(fileArguments)operator(,) ident(block)operator(\))operator(;) + + keyword(try) operator({) + keyword(return) ident(file)operator(.)ident(read)operator(()ident(context)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(file)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(read)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject)type([]) ident(fileArguments) operator(=) keyword(new) ident(IRubyObject)type([]) operator({)ident(arg0)operator(})operator(;) + ident(RubyIO) ident(file) operator(=) operator(()ident(RubyIO)operator(\)) ident(RubyKernel)operator(.)ident(open)operator(()ident(context)operator(,) ident(recv)operator(,) ident(fileArguments)operator(,) ident(block)operator(\))operator(;) + + keyword(try) operator({) + keyword(if) operator(()operator(!)ident(arg1)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(file)operator(.)ident(read)operator(()ident(context)operator(,) ident(arg1)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(file)operator(.)ident(read)operator(()ident(context)operator(\))operator(;) + operator(}) + operator(}) keyword(finally) operator({) + ident(file)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(read)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject)type([]) ident(fileArguments) operator(=) keyword(new) ident(IRubyObject)type([])operator({)ident(arg0)operator(})operator(;) + ident(RubyIO) ident(file) operator(=) operator(()ident(RubyIO)operator(\)) ident(RubyKernel)operator(.)ident(open)operator(()ident(context)operator(,) ident(recv)operator(,) ident(fileArguments)operator(,) ident(block)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(arg2)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(file)operator(.)ident(seek)operator(()ident(context)operator(,) ident(arg2)operator(\))operator(;) + operator(}) + + keyword(try) operator({) + keyword(if) operator(()operator(!)ident(arg1)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(file)operator(.)ident(read)operator(()ident(context)operator(,) ident(arg1)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(file)operator(.)ident(read)operator(()ident(context)operator(\))operator(;) + operator(}) + operator(}) keyword(finally) operator({) + ident(file)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(readlines)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(int) ident(count) operator(=) ident(args)operator(.)ident(length)operator(;) + + ident(IRubyObject)type([]) ident(fileArguments) operator(=) keyword(new) ident(IRubyObject)type([])operator({) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\)) operator(})operator(;) + ident(IRubyObject)type([]) ident(separatorArguments) operator(=) ident(count) operator(>=) integer(2) operator(?) keyword(new) ident(IRubyObject)type([])operator({)ident(args)operator([)integer(1)operator(])operator(}) operator(:) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(;) + ident(RubyIO) ident(file) operator(=) operator(()ident(RubyIO)operator(\)) ident(RubyKernel)operator(.)ident(open)operator(()ident(context)operator(,) ident(recv)operator(,) ident(fileArguments)operator(,) ident(block)operator(\))operator(;) + keyword(try) operator({) + keyword(return) ident(file)operator(.)ident(readlines)operator(()ident(context)operator(,) ident(separatorArguments)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(file)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(popen)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(popen)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(mode)operator(;) + + ident(IRubyObject) ident(cmdObj) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(checkSafeString)operator(()ident(cmdObj)operator(\))operator(;) + + keyword(if) operator(()string<delimiter(")content(-)delimiter(")>operator(.)ident(equals)operator(()ident(cmdObj)operator(.)ident(toString)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(popen()char(\\")content(-)char(\\")content(\) is unimplemented)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(try) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(mode) operator(=) ident(ModeFlags)operator(.)ident(RDONLY)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(mode) operator(=) ident(RubyFixnum)operator(.)ident(num2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(mode) operator(=) ident(getIOModesIntFromString)operator(()ident(runtime)operator(,) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(ModeFlags) ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(mode)operator(\))operator(;) + + ident(ShellLauncher)operator(.)ident(POpenProcess) ident(process) operator(=) ident(ShellLauncher)operator(.)ident(popen)operator(()ident(runtime)operator(,) ident(cmdObj)operator(,) ident(modes)operator(\))operator(;) + ident(RubyIO) ident(io) operator(=) keyword(new) ident(RubyIO)operator(()ident(runtime)operator(,) ident(process)operator(,) ident(modes)operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(io)operator(\))operator(;) + operator(}) keyword(finally) operator({) + keyword(if) operator(()ident(io)operator(.)ident(openFile)operator(.)ident(isOpen)operator(()operator(\))operator(\)) operator({) + ident(io)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($?)delimiter(")>operator(,) ident(RubyProcess)operator(.)ident(RubyStatus)operator(.)ident(newProcessStatus)operator(()ident(runtime)operator(,) operator(()ident(process)operator(.)ident(waitFor)operator(()operator(\)) operator(*) integer(256)operator(\))operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(io)operator(;) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(ex)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newIOErrorFromException)operator(()ident(e)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(InterruptedException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(unexpected interrupt)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(// NIO based pipe) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pipe)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(pipe)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) directive(throws) type(Exception) operator({) + comment(// TODO: This isn't an exact port of MRI's pipe behavior, so revisit) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(Pipe) ident(pipe) operator(=) type(Pipe)operator(.)ident(open)operator(()operator(\))operator(;) + + ident(RubyIO) ident(source) operator(=) keyword(new) ident(RubyIO)operator(()ident(runtime)operator(,) ident(pipe)operator(.)ident(source)operator(()operator(\))operator(\))operator(;) + ident(RubyIO) ident(sink) operator(=) keyword(new) ident(RubyIO)operator(()ident(runtime)operator(,) ident(pipe)operator(.)ident(sink)operator(()operator(\))operator(\))operator(;) + + ident(sink)operator(.)ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(setSync)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newArrayNoCopy)operator(()keyword(new) ident(IRubyObject)type([]) operator({) ident(source)operator(,) ident(sink) operator(})operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(copy_stream)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(compat) operator(=) ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(copy_stream)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) + ident(IRubyObject) ident(stream1)operator(,) ident(IRubyObject) ident(stream2)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyIO) ident(io1) operator(=) operator(()ident(RubyIO)operator(\))ident(stream1)operator(;) + ident(RubyIO) ident(io2) operator(=) operator(()ident(RubyIO)operator(\))ident(stream2)operator(;) + + ident(ChannelDescriptor) ident(d1) operator(=) ident(io1)operator(.)ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(d1)operator(.)ident(isSeekable)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(only supports file-to-file copy)delimiter(")>operator(\))operator(;) + operator(}) + ident(ChannelDescriptor) ident(d2) operator(=) ident(io2)operator(.)ident(openFile)operator(.)ident(getMainStream)operator(()operator(\))operator(.)ident(getDescriptor)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(d2)operator(.)ident(isSeekable)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(only supports file-to-file copy)delimiter(")>operator(\))operator(;) + operator(}) + + type(FileChannel) ident(f1) operator(=) operator(()type(FileChannel)operator(\))ident(d1)operator(.)ident(getChannel)operator(()operator(\))operator(;) + type(FileChannel) ident(f2) operator(=) operator(()type(FileChannel)operator(\))ident(d2)operator(.)ident(getChannel)operator(()operator(\))operator(;) + + type(long) ident(size) operator(=) ident(f1)operator(.)ident(size)operator(()operator(\))operator(;) + + ident(f1)operator(.)ident(transferTo)operator(()ident(f2)operator(.)ident(position)operator(()operator(\))operator(,) ident(size)operator(,) ident(f2)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(size)operator(\))operator(;) + operator(}) + + comment(/** + * Add a thread to the list of blocking threads for this IO. + * + * @param thread A thread blocking on this IO + */) + directive(public) directive(synchronized) type(void) ident(addBlockingThread)operator(()ident(RubyThread) ident(thread)operator(\)) operator({) + keyword(if) operator(()ident(blockingThreads) operator(==) keyword(null)operator(\)) operator({) + ident(blockingThreads) operator(=) keyword(new) type(ArrayList)operator(<)ident(RubyThread)operator(>)operator(()integer(1)operator(\))operator(;) + operator(}) + ident(blockingThreads)operator(.)ident(add)operator(()ident(thread)operator(\))operator(;) + operator(}) + + comment(/** + * Remove a thread from the list of blocking threads for this IO. + * + * @param thread A thread blocking on this IO + */) + directive(public) directive(synchronized) type(void) ident(removeBlockingThread)operator(()ident(RubyThread) ident(thread)operator(\)) operator({) + keyword(if) operator(()ident(blockingThreads) operator(==) keyword(null)operator(\)) operator({) + keyword(return)operator(;) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(blockingThreads)operator(.)ident(size)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(blockingThreads)operator(.)ident(get)operator(()ident(i)operator(\)) operator(==) ident(thread)operator(\)) operator({) + comment(// not using remove(Object\) here to avoid the equals(\) call) + ident(blockingThreads)operator(.)ident(remove)operator(()ident(i)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** + * Fire an IOError in all threads blocking on this IO object + */) + directive(protected) directive(synchronized) type(void) ident(interruptBlockingThreads)operator(()operator(\)) operator({) + keyword(if) operator(()ident(blockingThreads) operator(==) keyword(null)operator(\)) operator({) + keyword(return)operator(;) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(blockingThreads)operator(.)ident(size)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyThread) ident(thread) operator(=) ident(blockingThreads)operator(.)ident(get)operator(()ident(i)operator(\))operator(;) + + comment(// raise will also wake the thread from selection) + ident(thread)operator(.)ident(raise)operator(()keyword(new) ident(IRubyObject)type([]) operator({)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(stream closed)delimiter(")>operator(\))operator(.)ident(getException)operator(()operator(\))operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2005 Thomas E Enebo <enebo@acm.org> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.PrintWriter)operator(;) +keyword(import) include(java.io.StringWriter)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) + +keyword(import) include(org.jruby.ast.ArgsNode)operator(;) +keyword(import) include(org.jruby.ast.ArgumentNode)operator(;) +keyword(import) include(org.jruby.ast.ListNode)operator(;) +keyword(import) include(org.jruby.ast.LocalAsgnNode)operator(;) +keyword(import) include(org.jruby.javasupport.Java)operator(;) +keyword(import) include(org.jruby.javasupport.JavaObject)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.load.Library)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.DynamicMethod)operator(;) + +keyword(import) include(org.jruby.ast.Node)operator(;) +keyword(import) include(org.jruby.compiler.ASTInspector)operator(;) +keyword(import) include(org.jruby.compiler.ASTCompiler)operator(;) +keyword(import) include(org.jruby.compiler.impl.StandardASMCompiler)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.MethodArgs)operator(;) +keyword(import) include(org.jruby.javasupport.JavaUtil)operator(;) +keyword(import) include(org.jruby.runtime.InterpretedBlock)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) +keyword(import) include(org.objectweb.asm.ClassReader)operator(;) +keyword(import) include(org.objectweb.asm.util.TraceClassVisitor)operator(;) + +comment(/** + * Module which defines JRuby-specific methods for use. + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(JRuby)delimiter(")>operator(\)) +directive(public) type(class) class(RubyJRuby) operator({) + directive(public) directive(static) ident(RubyModule) ident(createJRuby)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getKernel)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(require)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(java)delimiter(")>operator(\))operator(\))operator(;) + ident(RubyModule) ident(jrubyModule) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(JRuby)delimiter(")>operator(\))operator(;) + + ident(jrubyModule)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyJRuby)operator(.)ident(class)operator(\))operator(;) + + ident(RubyClass) ident(compiledScriptClass) operator(=) ident(jrubyModule)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(CompiledScript)delimiter(")>operator(,)ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + + ident(compiledScriptClass)operator(.)ident(attr_accessor)operator(()ident(context)operator(,) keyword(new) ident(IRubyObject)type([])operator({)ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(name)delimiter(")>operator(\))operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(class_name)delimiter(")>operator(\))operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(original_script)delimiter(")>operator(\))operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(code)delimiter(")>operator(\))operator(})operator(\))operator(;) + ident(compiledScriptClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(JRubyCompiledScript)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(jrubyModule)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyModule) ident(createJRubyExt)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(runtime)operator(.)ident(getKernel)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,)string<delimiter(")content(require)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(java)delimiter(")>operator(\))operator(\))operator(;) + ident(RubyModule) ident(mJRubyExt) operator(=) ident(runtime)operator(.)ident(getOrCreateModule)operator(()string<delimiter(")content(JRuby)delimiter(")>operator(\))operator(.)ident(defineModuleUnder)operator(()string<delimiter(")content(Extensions)delimiter(")>operator(\))operator(;) + + ident(mJRubyExt)operator(.)ident(defineAnnotatedMethods)operator(()ident(JRubyExtensions)operator(.)ident(class)operator(\))operator(;) + + ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(includeModule)operator(()ident(mJRubyExt)operator(\))operator(;) + + keyword(return) ident(mJRubyExt)operator(;) + operator(}) + + directive(public) directive(static) type(class) class(ExtLibrary) directive(implements) ident(Library) operator({) + directive(public) type(void) ident(load)operator(()ident(Ruby) ident(runtime)operator(,) type(boolean) ident(wrap)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyJRuby)operator(.)ident(createJRubyExt)operator(()ident(runtime)operator(\))operator(;) + + ident(runtime)operator(.)ident(getMethod)operator(()operator(\))operator(.)ident(defineAnnotatedMethods)operator(()ident(MethodExtensions)operator(.)ident(class)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(class) class(TypeLibrary) directive(implements) ident(Library) operator({) + directive(public) type(void) ident(load)operator(()ident(Ruby) ident(runtime)operator(,) type(boolean) ident(wrap)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyModule) ident(jrubyType) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Type)delimiter(")>operator(\))operator(;) + ident(jrubyType)operator(.)ident(defineAnnotatedMethods)operator(()ident(TypeLibrary)operator(.)ident(class)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(coerce_to)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(object)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(method)operator(\)) operator({) + ident(Ruby) ident(ruby) operator(=) ident(object)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)operator(()ident(clazz) keyword(instanceof) ident(RubyClass)operator(\))operator(\)) operator({) + keyword(throw) ident(ruby)operator(.)ident(newTypeError)operator(()ident(clazz)operator(,) ident(ruby)operator(.)ident(getClassClass)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)operator(()ident(method) keyword(instanceof) ident(RubySymbol)operator(\))operator(\)) operator({) + keyword(throw) ident(ruby)operator(.)ident(newTypeError)operator(()ident(method)operator(,) ident(ruby)operator(.)ident(getSymbol)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(RubyClass) ident(rubyClass) operator(=) operator(()ident(RubyClass)operator(\))ident(clazz)operator(;) + ident(RubySymbol) ident(methodSym) operator(=) operator(()ident(RubySymbol)operator(\))ident(method)operator(;) + + keyword(return) ident(TypeConverter)operator(.)ident(convertToTypeOrRaise)operator(()ident(object)operator(,) ident(rubyClass)operator(,) ident(methodSym)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(runtime)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(runtime)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) ident(Java)operator(.)ident(java_to_ruby)operator(()ident(recv)operator(,) ident(JavaObject)operator(.)ident(wrap)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(objectspace)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getObjectSpaceEnabled)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(b)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(return) ident(RubyBoolean)operator(.)ident(newBoolean)operator(() + ident(runtime)operator(,) ident(runtime)operator(.)ident(isObjectSpaceEnabled)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(objectspace=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setObjectSpaceEnabled)operator(() + ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(,) ident(Block) ident(b)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(setObjectSpaceEnabled)operator(()ident(arg)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(parse)delimiter(")>operator(,) string<delimiter(")content(ast_for)delimiter(")>operator(})operator(,) ident(optional) operator(=) integer(3)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(parse)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if)operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(if)operator(()ident(block)operator(.)ident(getBody)operator(()operator(\)) keyword(instanceof) ident(org)operator(.)ident(jruby)operator(.)ident(runtime)operator(.)ident(CompiledBlock)operator(\)) operator({) + keyword(throw) keyword(new) type(RuntimeException)operator(()string<delimiter(")content(Cannot compile an already compiled block. Use -J-Djruby.jit.enabled=false to avoid this problem.)delimiter(")>operator(\))operator(;) + operator(}) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(0)operator(,)integer(0)operator(\))operator(;) + keyword(return) ident(Java)operator(.)ident(java_to_ruby)operator(()ident(recv)operator(,) ident(JavaObject)operator(.)ident(wrap)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(()operator(()ident(InterpretedBlock)operator(\))ident(block)operator(.)ident(getBody)operator(()operator(\))operator(\))operator(.)ident(getIterNode)operator(()operator(\))operator(.)ident(getBodyNode)operator(()operator(\))operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(1)operator(,)integer(3)operator(\))operator(;) + type(String) ident(filename) operator(=) string<delimiter(")content(-)delimiter(")>operator(;) + type(boolean) ident(extraPositionInformation) operator(=) keyword(false)operator(;) + ident(RubyString) ident(content) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length)operator(>)integer(1)operator(\)) operator({) + ident(filename) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length)operator(>)integer(2)operator(\)) operator({) + ident(extraPositionInformation) operator(=) ident(args)operator([)integer(2)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(Java)operator(.)ident(java_to_ruby)operator(()ident(recv)operator(,) ident(JavaObject)operator(.)ident(wrap)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(parse)operator(()ident(content)operator(.)ident(getByteList)operator(()operator(\))operator(,) ident(filename)operator(,) keyword(null)operator(,) integer(0)operator(,) ident(extraPositionInformation)operator(\))operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(compile)delimiter(")>operator(,) ident(optional) operator(=) integer(3)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(compile)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Node) ident(node)operator(;) + type(String) ident(filename)operator(;) + ident(RubyString) ident(content)operator(;) + keyword(if)operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(0)operator(,)integer(0)operator(\))operator(;) + keyword(if)operator(()ident(block)operator(.)ident(getBody)operator(()operator(\)) keyword(instanceof) ident(org)operator(.)ident(jruby)operator(.)ident(runtime)operator(.)ident(CompiledBlock)operator(\)) operator({) + keyword(throw) keyword(new) type(RuntimeException)operator(()string<delimiter(")content(Cannot compile an already compiled block. Use -J-Djruby.jit.enabled=false to avoid this problem.)delimiter(")>operator(\))operator(;) + operator(}) + ident(content) operator(=) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(Node) ident(bnode) operator(=) operator(()operator(()ident(InterpretedBlock)operator(\))ident(block)operator(.)ident(getBody)operator(()operator(\))operator(\))operator(.)ident(getIterNode)operator(()operator(\))operator(.)ident(getBodyNode)operator(()operator(\))operator(;) + ident(node) operator(=) keyword(new) ident(org)operator(.)ident(jruby)operator(.)ident(ast)operator(.)ident(RootNode)operator(()ident(bnode)operator(.)ident(getPosition)operator(()operator(\))operator(,) ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(getDynamicScope)operator(()operator(\))operator(,) ident(bnode)operator(\))operator(;) + ident(filename) operator(=) string<delimiter(")content(__block_)delimiter(")> operator(+) ident(node)operator(.)ident(getPosition)operator(()operator(\))operator(.)ident(getFile)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(1)operator(,)integer(3)operator(\))operator(;) + ident(filename) operator(=) string<delimiter(")content(-)delimiter(")>operator(;) + type(boolean) ident(extraPositionInformation) operator(=) keyword(false)operator(;) + ident(content) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length)operator(>)integer(1)operator(\)) operator({) + ident(filename) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length)operator(>)integer(2)operator(\)) operator({) + ident(extraPositionInformation) operator(=) ident(args)operator([)integer(2)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + operator(}) + + ident(node) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(parse)operator(()ident(content)operator(.)ident(getByteList)operator(()operator(\))operator(,) ident(filename)operator(,) keyword(null)operator(,) integer(0)operator(,) ident(extraPositionInformation)operator(\))operator(;) + operator(}) + + type(String) ident(classname)operator(;) + keyword(if) operator(()ident(filename)operator(.)ident(equals)operator(()string<delimiter(")content(-e)delimiter(")>operator(\))operator(\)) operator({) + ident(classname) operator(=) string<delimiter(")content(__dash_e__)delimiter(")>operator(;) + operator(}) keyword(else) operator({) + ident(classname) operator(=) ident(filename)operator(.)ident(replace)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(,) string<delimiter(')content(/)delimiter(')>operator(\))operator(.)ident(replaceAll)operator(()string<delimiter(")content(.rb)delimiter(")>operator(,) string<delimiter(")delimiter(")>operator(\))operator(.)ident(replaceAll)operator(()string<delimiter(")content(-)delimiter(")>operator(,)string<delimiter(")content(_dash_)delimiter(")>operator(\))operator(;) + operator(}) + + ident(ASTInspector) ident(inspector) operator(=) keyword(new) ident(ASTInspector)operator(()operator(\))operator(;) + ident(inspector)operator(.)ident(inspect)operator(()ident(node)operator(\))operator(;) + + ident(StandardASMCompiler) ident(asmCompiler) operator(=) keyword(new) ident(StandardASMCompiler)operator(()ident(classname)operator(,) ident(filename)operator(\))operator(;) + ident(ASTCompiler) ident(compiler) operator(=) keyword(new) ident(ASTCompiler)operator(()operator(\))operator(;) + ident(compiler)operator(.)ident(compileRoot)operator(()ident(node)operator(,) ident(asmCompiler)operator(,) ident(inspector)operator(\))operator(;) + type(byte)type([]) ident(bts) operator(=) ident(asmCompiler)operator(.)ident(getClassByteArray)operator(()operator(\))operator(;) + + ident(IRubyObject) ident(compiledScript) operator(=) operator(()operator(()ident(RubyModule)operator(\))ident(recv)operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(CompiledScript)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,)string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + ident(compiledScript)operator(.)ident(callMethod)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(name=)delimiter(")>operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(filename)operator(\))operator(\))operator(;) + ident(compiledScript)operator(.)ident(callMethod)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(class_name=)delimiter(")>operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(classname)operator(\))operator(\))operator(;) + ident(compiledScript)operator(.)ident(callMethod)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(original_script=)delimiter(")>operator(,) ident(content)operator(\))operator(;) + ident(compiledScript)operator(.)ident(callMethod)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(code=)delimiter(")>operator(,) ident(Java)operator(.)ident(java_to_ruby)operator(()ident(recv)operator(,) ident(JavaObject)operator(.)ident(wrap)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(bts)operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(\))operator(;) + + keyword(return) ident(compiledScript)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reference)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(reference)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) ident(Java)operator(.)ident(wrap)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getJavaSupport)operator(()operator(\))operator(.)ident(getJavaUtilitiesModule)operator(()operator(\))operator(,) + ident(JavaObject)operator(.)ident(wrap)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(obj)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dereference)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(dereference)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(obj)operator(.)ident(dataGetStruct)operator(()operator(\)) keyword(instanceof) ident(JavaObject)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(got )delimiter(")> operator(+) ident(obj) operator(+) string<delimiter(")content(, expected wrapped Java object)delimiter(")>operator(\))operator(;) + operator(}) + + type(Object) ident(unwrapped) operator(=) ident(JavaUtil)operator(.)ident(unwrapJavaObject)operator(()ident(obj)operator(\))operator(;) + + keyword(if) operator(()operator(!)operator(()ident(unwrapped) keyword(instanceof) ident(IRubyObject)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(got )delimiter(")> operator(+) ident(obj) operator(+) string<delimiter(")content(, expected Java-wrapped Ruby object)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) operator(()ident(IRubyObject)operator(\))ident(unwrapped)operator(;) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(JRuby::CompiledScript)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(JRubyCompiledScript) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(compiled_script_to_s)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getInstanceVariables)operator(()operator(\))operator(.)ident(fastGetInstanceVariable)operator(()string<delimiter(")content(@original_script)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(compiled_script_inspect)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(#<JRuby::CompiledScript )delimiter(")> operator(+) ident(recv)operator(.)ident(getInstanceVariables)operator(()operator(\))operator(.)ident(fastGetInstanceVariable)operator(()string<delimiter(")content(@name)delimiter(")>operator(\)) operator(+) string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect_bytecode)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(compiled_script_inspect_bytecode)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + type(StringWriter) ident(sw) operator(=) keyword(new) type(StringWriter)operator(()operator(\))operator(;) + ident(ClassReader) ident(cr) operator(=) keyword(new) ident(ClassReader)operator(()operator(()type(byte)type([])operator(\))ident(org)operator(.)ident(jruby)operator(.)ident(javasupport)operator(.)ident(JavaUtil)operator(.)ident(convertRubyToJava)operator(()ident(recv)operator(.)ident(getInstanceVariables)operator(()operator(\))operator(.)ident(fastGetInstanceVariable)operator(()string<delimiter(")content(@code)delimiter(")>operator(\))operator(,)type(byte)type([])operator(.)ident(class)operator(\))operator(\))operator(;) + ident(TraceClassVisitor) ident(cv) operator(=) keyword(new) ident(TraceClassVisitor)operator(()keyword(new) type(PrintWriter)operator(()ident(sw)operator(\))operator(\))operator(;) + ident(cr)operator(.)ident(accept)operator(()ident(cv)operator(,) ident(ClassReader)operator(.)ident(SKIP_DEBUG)operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(sw)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(JRubyExtensions)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(JRubyExtensions) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(steal_method)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(steal_method)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(type)operator(,) ident(IRubyObject) ident(methodName)operator(\)) operator({) + ident(RubyModule) ident(to_add) operator(=) keyword(null)operator(;) + keyword(if)operator(()ident(recv) keyword(instanceof) ident(RubyModule)operator(\)) operator({) + ident(to_add) operator(=) operator(()ident(RubyModule)operator(\))ident(recv)operator(;) + operator(}) keyword(else) operator({) + ident(to_add) operator(=) ident(recv)operator(.)ident(getSingletonClass)operator(()operator(\))operator(;) + operator(}) + type(String) ident(name) operator(=) ident(methodName)operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if)operator(()operator(!)operator(()ident(type) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(First argument must be a module/class)delimiter(")>operator(\))operator(;) + operator(}) + + ident(DynamicMethod) ident(method) operator(=) operator(()operator(()ident(RubyModule)operator(\))ident(type)operator(\))operator(.)ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if)operator(()ident(method) operator(==) keyword(null) operator(||) ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(No such method )delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content( on )delimiter(")> operator(+) ident(type)operator(\))operator(;) + operator(}) + + ident(to_add)operator(.)ident(addMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(steal_methods)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(steal_methods)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(type) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + keyword(for)operator(()type(int) ident(i)operator(=)integer(1)operator(;)ident(i)operator(<)ident(args)operator(.)ident(length)operator(;)ident(i)operator(++)operator(\)) operator({) + ident(steal_method)operator(()ident(recv)operator(,) ident(type)operator(,) ident(args)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(class) class(MethodExtensions) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(args)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(methodArgs)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(ruby) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyMethod) ident(rubyMethod) operator(=) operator(()ident(RubyMethod)operator(\))ident(recv)operator(;) + + ident(DynamicMethod) ident(method) operator(=) ident(rubyMethod)operator(.)ident(method)operator(;) + + keyword(if) operator(()ident(method) keyword(instanceof) ident(MethodArgs)operator(\)) operator({) + ident(MethodArgs) ident(interpMethod) operator(=) operator(()ident(MethodArgs)operator(\))ident(method)operator(;) + ident(ArgsNode) ident(args) operator(=) ident(interpMethod)operator(.)ident(getArgsNode)operator(()operator(\))operator(;) + ident(RubyArray) ident(argsArray) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(ruby)operator(\))operator(;) + + ident(RubyArray) ident(reqArray) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(ruby)operator(\))operator(;) + ident(ListNode) ident(requiredArgs) operator(=) ident(args)operator(.)ident(getArgs)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(requiredArgs) operator(!=) keyword(null) operator(&&) ident(i) operator(<) ident(requiredArgs)operator(.)ident(size)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(ArgumentNode) ident(arg) operator(=) operator(()ident(ArgumentNode)operator(\))ident(requiredArgs)operator(.)ident(get)operator(()ident(i)operator(\))operator(;) + ident(reqArray)operator(.)ident(append)operator(()ident(RubySymbol)operator(.)ident(newSymbol)operator(()ident(ruby)operator(,) ident(arg)operator(.)ident(getName)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + ident(argsArray)operator(.)ident(append)operator(()ident(reqArray)operator(\))operator(;) + + ident(RubyArray) ident(optArray) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(ruby)operator(\))operator(;) + ident(ListNode) ident(optArgs) operator(=) ident(args)operator(.)ident(getOptArgs)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(optArgs) operator(!=) keyword(null) operator(&&) ident(i) operator(<) ident(optArgs)operator(.)ident(size)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(LocalAsgnNode) ident(arg) operator(=) operator(()ident(LocalAsgnNode)operator(\))ident(optArgs)operator(.)ident(get)operator(()ident(i)operator(\))operator(;) + ident(optArray)operator(.)ident(append)operator(()ident(RubySymbol)operator(.)ident(newSymbol)operator(()ident(ruby)operator(,) ident(arg)operator(.)ident(getName)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + ident(argsArray)operator(.)ident(append)operator(()ident(optArray)operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(getRestArgNode)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(argsArray)operator(.)ident(append)operator(()ident(RubySymbol)operator(.)ident(newSymbol)operator(()ident(ruby)operator(,) ident(args)operator(.)ident(getRestArgNode)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(argsArray)operator(.)ident(append)operator(()ident(ruby)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(getBlockArgNode)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(argsArray)operator(.)ident(append)operator(()ident(RubySymbol)operator(.)ident(newSymbol)operator(()ident(ruby)operator(,) ident(args)operator(.)ident(getBlockArgNode)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(argsArray)operator(.)ident(append)operator(()ident(ruby)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(argsArray)operator(;) + operator(}) + + keyword(throw) ident(ruby)operator(.)ident(newTypeError)operator(()string<delimiter(")content(Method args are only available for standard interpreted or jitted methods)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Kiel Hodges <jruby-devel@selfsosoft.com> + * Copyright (C\) 2006 Evan Buswell <evan@heron.sytes.net> + * Copyright (C\) 2006 Ola Bini <ola@ologix.com> + * Copyright (C\) 2006 Michael Studman <codehaus@michaelstudman.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2007 Nick Sieger <nicksieger@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.ByteArrayOutputStream)operator(;) +keyword(import) include(java.math.BigInteger)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(static) include(org.jruby.anno.FrameField)operator(.)operator(*)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) + +keyword(import) include(org.jruby.ast.util.ArgsUtil)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.evaluator.ASTInterpreter)operator(;) +keyword(import) include(org.jruby.exceptions.JumpException)operator(;) +keyword(import) include(org.jruby.exceptions.MainExitException)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.internal.runtime.JumpTarget)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallType)operator(;) +keyword(import) include(org.jruby.runtime.Frame)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(static) include(org.jruby.runtime.Visibility)operator(.)operator(*)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.load.IAutoloadMethod)operator(;) +keyword(import) include(org.jruby.runtime.load.LoadService)operator(;) +keyword(import) include(org.jruby.util.IdUtil)operator(;) +keyword(import) include(org.jruby.util.ShellLauncher)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) + +comment(/** + * Note: For CVS history, see KernelModule.java. + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Kernel)delimiter(")>operator(\)) +directive(public) type(class) class(RubyKernel) operator({) + directive(public) directive(final) directive(static) type(Class)operator(<)operator(?)operator(>) ident(IRUBY_OBJECT) operator(=) ident(IRubyObject)operator(.)ident(class)operator(;) + + directive(public) directive(static) ident(RubyModule) ident(createKernelModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Kernel)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setKernel)operator(()ident(module)operator(\))operator(;) + + ident(module)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyKernel)operator(.)ident(class)operator(\))operator(;) + ident(module)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyObject)operator(.)ident(class)operator(\))operator(;) + + ident(runtime)operator(.)ident(setRespondToMethod)operator(()ident(module)operator(.)ident(searchMethod)operator(()string<delimiter(")content(respond_to?)delimiter(")>operator(\))operator(\))operator(;) + + ident(module)operator(.)ident(setFlag)operator(()ident(RubyObject)operator(.)ident(USER7_F)operator(,) keyword(false)operator(\))operator(;) comment(//Kernel is the only Module that doesn't need an implementor) + + keyword(return) ident(module)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(at_exit)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(at_exit)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(pushExitBlock)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newProc)operator(()ident(Block)operator(.)ident(Type)operator(.)ident(PROC)operator(,) ident(block)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(autoload?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(autoload_p)operator(()ident(ThreadContext) ident(context)operator(,) directive(final) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(symbol)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyModule) ident(module) operator(=) ident(recv) keyword(instanceof) ident(RubyModule) operator(?) operator(()ident(RubyModule)operator(\)) ident(recv) operator(:) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(;) + type(String) ident(name) operator(=) ident(module)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + + ident(IAutoloadMethod) ident(autoloadMethod) operator(=) ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(autoloadFor)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(autoloadMethod) operator(==) keyword(null)operator(\)) keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newString)operator(()ident(autoloadMethod)operator(.)ident(file)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(autoload)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(autoload)operator(()directive(final) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(symbol)operator(,) directive(final) ident(IRubyObject) ident(file)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(LoadService) ident(loadService) operator(=) ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(;) + type(String) ident(nonInternedName) operator(=) ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(IdUtil)operator(.)ident(isValidConstantName)operator(()ident(nonInternedName)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNameError)operator(()string<delimiter(")content(autoload must be constant name)delimiter(")>operator(,) ident(nonInternedName)operator(\))operator(;) + operator(}) + + ident(RubyString) ident(fileString) operator(=) ident(file)operator(.)ident(convertToString)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(fileString)operator(.)ident(isEmpty)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(empty file name)delimiter(")>operator(\))operator(;) + operator(}) + + directive(final) type(String) ident(baseName) operator(=) ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(;) comment(// interned, OK for "fast" methods) + directive(final) ident(RubyModule) ident(module) operator(=) ident(recv) keyword(instanceof) ident(RubyModule) operator(?) operator(()ident(RubyModule)operator(\)) ident(recv) operator(:) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(;) + type(String) ident(nm) operator(=) ident(module)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(baseName)operator(;) + + ident(IRubyObject) ident(existingValue) operator(=) ident(module)operator(.)ident(fastFetchConstant)operator(()ident(baseName)operator(\))operator(;) + keyword(if) operator(()ident(existingValue) operator(!=) keyword(null) operator(&&) ident(existingValue) operator(!=) ident(RubyObject)operator(.)ident(UNDEF)operator(\)) keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(module)operator(.)ident(fastStoreConstant)operator(()ident(baseName)operator(,) ident(RubyObject)operator(.)ident(UNDEF)operator(\))operator(;) + + ident(loadService)operator(.)ident(addAutoload)operator(()ident(nm)operator(,) keyword(new) ident(IAutoloadMethod)operator(()operator(\)) operator({) + directive(public) type(String) ident(file)operator(()operator(\)) operator({) + keyword(return) ident(file)operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + comment(/** + * @see org.jruby.runtime.load.IAutoloadMethod#load(Ruby, String\) + */) + directive(public) ident(IRubyObject) ident(load)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + type(boolean) ident(required) operator(=) ident(loadService)operator(.)ident(require)operator(()ident(file)operator(()operator(\))operator(\))operator(;) + + comment(// File to be loaded by autoload has already been or is being loaded.) + keyword(if) operator(()operator(!)ident(required)operator(\)) keyword(return) keyword(null)operator(;) + + keyword(return) ident(module)operator(.)ident(fastGetConstant)operator(()ident(baseName)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(method_missing)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(method_missing)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0) operator(||) operator(!)operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubySymbol)operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no id given)delimiter(")>operator(\))operator(;) + + type(Visibility) ident(lastVis) operator(=) ident(context)operator(.)ident(getLastVisibility)operator(()operator(\))operator(;) + ident(CallType) ident(lastCallType) operator(=) ident(context)operator(.)ident(getLastCallType)operator(()operator(\))operator(;) + + comment(// create a lightweight thunk) + ident(IRubyObject) ident(msg) operator(=) keyword(new) ident(RubyNameError)operator(.)ident(RubyNameErrorMessage)operator(()ident(runtime)operator(,) + ident(recv)operator(,) + ident(args)operator([)integer(0)operator(])operator(,) + ident(lastVis)operator(,) + ident(lastCallType)operator(\))operator(;) + directive(final) ident(IRubyObject)type([])ident(exArgs)operator(;) + directive(final) ident(RubyClass) ident(exc)operator(;) + keyword(if) operator(()ident(lastCallType) operator(!=) ident(CallType)operator(.)ident(VARIABLE)operator(\)) operator({) + ident(exc) operator(=) ident(runtime)operator(.)ident(getNoMethodError)operator(()operator(\))operator(;) + ident(exArgs) operator(=) keyword(new) ident(IRubyObject)type([])operator({)ident(msg)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(RubyArray)operator(.)ident(newArrayNoCopy)operator(()ident(runtime)operator(,) ident(args)operator(,) integer(1)operator(\))operator(})operator(;) + operator(}) keyword(else) operator({) + ident(exc) operator(=) ident(runtime)operator(.)ident(getNameError)operator(()operator(\))operator(;) + ident(exArgs) operator(=) keyword(new) ident(IRubyObject)type([])operator({)ident(msg)operator(,) ident(args)operator([)integer(0)operator(])operator(})operator(;) + operator(}) + + keyword(throw) keyword(new) ident(RaiseException)operator(()operator(()ident(RubyException)operator(\))ident(exc)operator(.)ident(newInstance)operator(()ident(context)operator(,) ident(exArgs)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(open)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(open)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(String) ident(arg) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(arg)operator(.)ident(startsWith)operator(()string<delimiter(")content(|)delimiter(")>operator(\))operator(\)) operator({) + type(String) ident(command) operator(=) ident(arg)operator(.)ident(substring)operator(()integer(1)operator(\))operator(;) + comment(// exec process, create IO with process) + keyword(return) ident(RubyIO)operator(.)ident(popen)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getIO)operator(()operator(\))operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(runtime)operator(.)ident(newString)operator(()ident(command)operator(\))operator(})operator(,) ident(block)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyFile)operator(.)ident(open)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getFile)operator(()operator(\))operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getc)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getc)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(getc is obsolete; use STDIN.getc instead)delimiter(")>operator(,) string<delimiter(")content(getc)delimiter(")>operator(,) string<delimiter(")content(STDIN.getc)delimiter(")>operator(\))operator(;) + ident(IRubyObject) ident(defin) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stdin)delimiter(")>operator(\))operator(;) + keyword(return) ident(defin)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(getc)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gets)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(gets)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(RubyArgsFile)operator(.)ident(gets)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($<)delimiter(")>operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abort)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(abort)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stderr)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(puts)delimiter(")>operator(,)ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + keyword(throw) keyword(new) ident(MainExitException)operator(()integer(1)operator(,)keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Array)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_array)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(object)operator(\)) operator({) + ident(IRubyObject) ident(value) operator(=) ident(object)operator(.)ident(checkArrayType)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(value)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(object)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(searchMethod)operator(()string<delimiter(")content(to_a)delimiter(")>operator(\))operator(.)ident(getImplementationClass)operator(()operator(\)) operator(!=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getKernel)operator(()operator(\))operator(\)) operator({) + ident(value) operator(=) ident(object)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_A)operator(,) string<delimiter(")content(to_a)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(value) keyword(instanceof) ident(RubyArray)operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(`to_a' did not return Array)delimiter(")>operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(object)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Complex)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_complex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) string<delimiter(")content(convert)delimiter(")>operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Complex)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_complex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) string<delimiter(")content(convert)delimiter(")>operator(,) ident(arg)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Complex)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_complex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getComplex)operator(()operator(\))operator(,) string<delimiter(")content(convert)delimiter(")>operator(,) ident(arg0)operator(,) ident(arg1)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Rational)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_rational)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getRational)operator(()operator(\))operator(,) string<delimiter(")content(convert)delimiter(")>operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Rational)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_rational)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getRational)operator(()operator(\))operator(,) string<delimiter(")content(convert)delimiter(")>operator(,) ident(arg)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Rational)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_rational)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getRational)operator(()operator(\))operator(,) string<delimiter(")content(convert)delimiter(")>operator(,) ident(arg0)operator(,) ident(arg1)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Float)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_float)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(object)operator(\)) operator({) + keyword(if)operator(()ident(object) keyword(instanceof) ident(RubyFixnum)operator(\))operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(object)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(()operator(()ident(RubyFixnum)operator(\))ident(object)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(})keyword(else) keyword(if)operator(()ident(object) keyword(instanceof) ident(RubyFloat)operator(\))operator({) + keyword(return) ident(object)operator(;) + operator(})keyword(else) keyword(if)operator(()ident(object) keyword(instanceof) ident(RubyBignum)operator(\))operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(object)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(RubyBignum)operator(.)ident(big2dbl)operator(()operator(()ident(RubyBignum)operator(\))ident(object)operator(\))operator(\))operator(;) + operator(})keyword(else) keyword(if)operator(()ident(object) keyword(instanceof) ident(RubyString)operator(\))operator({) + keyword(if)operator(()operator(()operator(()ident(RubyString)operator(\))ident(object)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(==) integer(0)operator(\))operator({) comment(// rb_cstr_to_dbl case) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid value for Float(\): )delimiter(")> operator(+) ident(object)operator(.)ident(inspect)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyNumeric)operator(.)ident(str2fnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)operator(()ident(RubyString)operator(\))ident(object)operator(,)keyword(true)operator(\))operator(;) + operator(})keyword(else) keyword(if)operator(()ident(object)operator(.)ident(isNil)operator(()operator(\))operator(\))operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert nil into Float)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(RubyFloat) ident(rFloat) operator(=) operator(()ident(RubyFloat)operator(\))ident(TypeConverter)operator(.)ident(convertToType)operator(()ident(object)operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFloat)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_F)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(\))operator(;) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(rFloat)operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(\)) keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid value for Float(\))delimiter(")>operator(\))operator(;) + keyword(return) ident(rFloat)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(Integer)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_integer)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(object)operator(\)) operator({) + keyword(if) operator(()ident(object) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + type(double) ident(val) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(object)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(val) operator(>) operator(()type(double)operator(\)) ident(RubyFixnum)operator(.)ident(MAX) operator(&&) ident(val) operator(<) operator(()type(double)operator(\)) ident(RubyFixnum)operator(.)ident(MIN)operator(\)) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(dbl2num)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,)operator(()operator(()ident(RubyFloat)operator(\))ident(object)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(object) keyword(instanceof) ident(RubyFixnum) operator(||) ident(object) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(object)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(object) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(str2inum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,)operator(()ident(RubyString)operator(\))ident(object)operator(,)integer(0)operator(,)keyword(true)operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(tmp) operator(=) ident(TypeConverter)operator(.)ident(convertToType)operator(()ident(object)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getInteger)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_INT)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(object)operator(.)ident(convertToInteger)operator(()ident(MethodIndex)operator(.)ident(TO_I)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(\))operator(;) + keyword(return) ident(tmp)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(String)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(new_string)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(object)operator(\)) operator({) + keyword(return) ident(TypeConverter)operator(.)ident(convertToType)operator(()ident(object)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getString)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_S)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(p)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(defout) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($>)delimiter(")>operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)ident(i)operator(]) operator(!=) keyword(null)operator(\)) operator({) + ident(defout)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(RubyObject)operator(.)ident(inspect)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + ident(defout)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(defout) keyword(instanceof) ident(RubyFile)operator(\)) operator({) + operator(()operator(()ident(RubyFile)operator(\))ident(defout)operator(\))operator(.)ident(flush)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_f_putc + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(putc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(putc)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(ch)operator(\)) operator({) + ident(IRubyObject) ident(defout) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($>)delimiter(")>operator(\))operator(;) + keyword(return) ident(defout)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(putc)delimiter(")>operator(,) ident(ch)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(puts)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(puts)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(defout) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($>)delimiter(")>operator(\))operator(;) + + ident(defout)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(puts)delimiter(")>operator(,) ident(args)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(print)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(print)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(defout) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($>)delimiter(")>operator(\))operator(;) + + ident(defout)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(print)delimiter(")>operator(,) ident(args)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(printf)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(printf)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(defout) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($>)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()operator(!)operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + ident(defout) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(args) operator(=) ident(ArgsUtil)operator(.)ident(popArray)operator(()ident(args)operator(\))operator(;) + operator(}) + + ident(defout)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(RubyKernel)operator(.)ident(sprintf)operator(()ident(recv)operator(,) ident(args)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readline)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(readline)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(line) operator(=) ident(gets)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(\))operator(;) + + keyword(if) operator(()ident(line)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + + keyword(return) ident(line)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(readlines)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(RubyArgsFile)operator(.)ident(readlines)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($<)delimiter(")>operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + comment(/** Returns value of $_. + * + * @throws TypeError if $_ is not a String or nil. + * @return value of $_ as String. + */) + directive(private) directive(static) ident(RubyString) ident(getLastlineString)operator(()ident(ThreadContext) ident(context)operator(,) ident(Ruby) ident(runtime)operator(\)) operator({) + ident(IRubyObject) ident(line) operator(=) ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(getLastLine)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(line)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content($_ value need to be String (nil given\).)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(!)operator(()ident(line) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content($_ value need to be String ()delimiter(")> operator(+) ident(line)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( given\).)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) operator(()ident(RubyString)operator(\)) ident(line)operator(;) + operator(}) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the one or two-arg versions. + */) + directive(public) directive(static) ident(IRubyObject) ident(sub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the one or two-arg versions. + */) + directive(public) directive(static) ident(IRubyObject) ident(sub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(str)operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(str)operator(\))operator(;) + operator(}) + + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(str)operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(block)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(str)operator(\))operator(;) + operator(}) + + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(str)operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(str)operator(\))operator(;) + operator(}) + + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the one or two-arg versions. + */) + directive(public) directive(static) ident(IRubyObject) ident(gsub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(gsub_bang)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gsub!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(gsub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(gsub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gsub!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(gsub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(gsub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the one or two-arg versions. + */) + directive(public) directive(static) ident(IRubyObject) ident(gsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(str)operator(.)ident(gsub_bang)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(str)operator(\))operator(;) + operator(}) + + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gsub)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(gsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(str)operator(.)ident(gsub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(block)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(str)operator(\))operator(;) + operator(}) + + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gsub)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(gsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(str)operator(.)ident(gsub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(str)operator(\))operator(;) + operator(}) + + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chop!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chop_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(chop_bang)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chop)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chop)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(>) integer(0)operator(\)) operator({) + ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(str)operator(.)ident(dup)operator(()operator(\))operator(;) + ident(str)operator(.)ident(chop_bang)operator(()operator(\))operator(;) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(str)operator(\))operator(;) + operator(}) + + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the zero or one-arg versions. + */) + directive(public) directive(static) ident(IRubyObject) ident(chomp_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(chomp_bang)operator(()ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chomp!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chomp_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(chomp_bang)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chomp!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chomp_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(chomp_bang)operator(()ident(arg0)operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the zero or one-arg versions. + */) + directive(public) directive(static) ident(IRubyObject) ident(chomp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(RubyString) ident(dup) operator(=) operator(()ident(RubyString)operator(\)) ident(str)operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(dup)operator(.)ident(chomp_bang)operator(()ident(args)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(str)operator(;) + operator(}) + + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(dup)operator(\))operator(;) + keyword(return) ident(dup)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chomp)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chomp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(RubyString) ident(dup) operator(=) operator(()ident(RubyString)operator(\)) ident(str)operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(dup)operator(.)ident(chomp_bang)operator(()operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(str)operator(;) + operator(}) + + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(dup)operator(\))operator(;) + keyword(return) ident(dup)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chomp)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) ident(LASTLINE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(chomp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(RubyString) ident(dup) operator(=) operator(()ident(RubyString)operator(\)) ident(str)operator(.)ident(dup)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(dup)operator(.)ident(chomp_bang)operator(()ident(arg0)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(str)operator(;) + operator(}) + + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(dup)operator(\))operator(;) + keyword(return) ident(dup)operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * + * @param context The thread context for the current thread + * @param recv The receiver of the method (usually a class that has included Kernel\) + * @return + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) directive(static) ident(IRubyObject) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(split)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(split)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) operator({)ident(LASTLINE)operator(,) ident(BACKREF)operator(})operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(split)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(split)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) operator({)ident(LASTLINE)operator(,) ident(BACKREF)operator(})operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(split)operator(()ident(context)operator(,) ident(arg0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(split)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(LASTLINE)operator(,) ident(writes) operator(=) operator({)ident(LASTLINE)operator(,) ident(BACKREF)operator(})operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(split)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(scan)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) operator({)ident(LASTLINE)operator(,) ident(BACKREF)operator(})operator(,) ident(writes) operator(=) operator({)ident(LASTLINE)operator(,) ident(BACKREF)operator(})operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(scan)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(pattern)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getLastlineString)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(scan)operator(()ident(context)operator(,) ident(pattern)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(select)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(3)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(select)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(RubyIO)operator(.)ident(select_static)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sleep)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sleep)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(long) ident(milliseconds)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + comment(// Zero sleeps forever) + ident(milliseconds) operator(=) integer(0)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()operator(!)operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyNumeric)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(args)operator([)integer(0)operator(])operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(into time interval)delimiter(")>operator(\))operator(;) + operator(}) + ident(milliseconds) operator(=) operator(()type(long)operator(\)) operator(()ident(args)operator([)integer(0)operator(])operator(.)ident(convertToFloat)operator(()operator(\))operator(.)ident(getDoubleValue)operator(()operator(\)) operator(*) integer(1000)operator(\))operator(;) + keyword(if) operator(()ident(milliseconds) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(time interval must be positive)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(milliseconds) operator(==) integer(0)operator(\)) operator({) + comment(// Explicit zero in MRI returns immediately) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + operator(}) + operator(}) + type(long) ident(startTime) operator(=) type(System)operator(.)ident(currentTimeMillis)operator(()operator(\))operator(;) + + ident(RubyThread) ident(rubyThread) operator(=) ident(context)operator(.)ident(getThread)operator(()operator(\))operator(;) + + keyword(do) operator({) + type(long) ident(loopStartTime) operator(=) type(System)operator(.)ident(currentTimeMillis)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(rubyThread)operator(.)ident(sleep)operator(()ident(milliseconds)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(InterruptedException) ident(iExcptn)operator(\)) operator({) + operator(}) + ident(milliseconds) operator(-=) operator(()type(System)operator(.)ident(currentTimeMillis)operator(()operator(\)) operator(-) ident(loopStartTime)operator(\))operator(;) + operator(}) keyword(while) operator(()ident(milliseconds) operator(>) integer(0)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()type(Math)operator(.)ident(round)operator(()operator(()type(System)operator(.)ident(currentTimeMillis)operator(()operator(\)) operator(-) ident(startTime)operator(\)) operator(/) float(1000.0)operator(\))operator(\))operator(;) + operator(}) + + comment(// FIXME: Add at_exit and finalizers to exit, then make exit_bang not call those.) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exit)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exit)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(exit)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) keyword(false)operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) comment(// not reached) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exit!)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exit_bang)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(exit)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) keyword(true)operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) comment(// not reached) + operator(}) + + directive(private) directive(static) type(void) ident(exit)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) type(boolean) ident(hard)operator(\)) operator({) + ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + + type(int) ident(status) operator(=) integer(1)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(RubyObject) ident(argument) operator(=) operator(()ident(RubyObject)operator(\))ident(args)operator([)integer(0)operator(])operator(;) + keyword(if) operator(()ident(argument) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(status) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(argument)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(status) operator(=) ident(argument)operator(.)ident(isFalse)operator(()operator(\)) operator(?) integer(1) operator(:) integer(0)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(hard)operator(\)) operator({) + keyword(throw) keyword(new) ident(MainExitException)operator(()ident(status)operator(,) keyword(true)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSystemExit)operator(()ident(status)operator(\))operator(;) + operator(}) + operator(}) + + + comment(/** Returns an Array with the names of all global variables. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(global_variables)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(global_variables)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(globalVariables) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(for) operator(()type(String) ident(globalVariableName) operator(:) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(getNames)operator(()operator(\))operator(\)) operator({) + ident(globalVariables)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(globalVariableName)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(globalVariables)operator(;) + operator(}) + + comment(/** Returns an Array with the names of all local variables. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(local_variables)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(local_variables)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(localVariables) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(for) operator(()type(String) ident(name)operator(:) ident(context)operator(.)ident(getCurrentScope)operator(()operator(\))operator(.)ident(getAllNamesInScope)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(IdUtil)operator(.)ident(isLocal)operator(()ident(name)operator(\))operator(\)) ident(localVariables)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(localVariables)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(binding)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyBinding) ident(binding)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(RubyBinding)operator(.)ident(newBinding)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(block_given?)delimiter(")>operator(,) string<delimiter(")content(iterator?)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(block_given_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(getBlock)operator(()operator(\))operator(.)ident(isGiven)operator(()operator(\))operator(\))operator(;) + operator(}) + + + annotation(@Deprecated) + directive(public) directive(static) ident(IRubyObject) ident(sprintf)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(sprintf)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(recv)operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(sprintf)delimiter(")>operator(,) string<delimiter(")content(format)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sprintf)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(sprintf must have at least one argument)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyString) ident(str) operator(=) ident(RubyString)operator(.)ident(stringValue)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + + ident(RubyArray) ident(newArgs) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArrayNoCopy)operator(()ident(args)operator(\))operator(;) + ident(newArgs)operator(.)ident(shift)operator(()operator(\))operator(;) + + keyword(return) ident(str)operator(.)ident(op_format)operator(()ident(context)operator(,) ident(newArgs)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(raise)delimiter(")>operator(,) string<delimiter(")content(fail)delimiter(")>operator(})operator(,) ident(optional) operator(=) integer(3)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(raise)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + comment(// FIXME: Pass block down?) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(lastException) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($!)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(lastException)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) keyword(new) ident(RaiseException)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRuntimeError)operator(()operator(\))operator(,) string<delimiter(")delimiter(")>operator(,) keyword(false)operator(\))operator(;) + operator(}) + keyword(throw) keyword(new) ident(RaiseException)operator(()operator(()ident(RubyException)operator(\)) ident(lastException)operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(exception)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(throw) keyword(new) ident(RaiseException)operator(()operator(()ident(RubyException)operator(\))ident(runtime)operator(.)ident(getRuntimeError)operator(()operator(\))operator(.)ident(newInstance)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(respondsTo)operator(()string<delimiter(")content(exception)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(exception class/object expected)delimiter(")>operator(\))operator(;) + operator(}) + ident(exception) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(exception)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(respondsTo)operator(()string<delimiter(")content(exception)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(exception class/object expected)delimiter(")>operator(\))operator(;) + operator(}) + + ident(exception) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(exception)delimiter(")>operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(runtime)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Exception)delimiter(")>operator(\))operator(.)ident(isInstance)operator(()ident(exception)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(exception object expected)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(3)operator(\)) operator({) + operator(()operator(()ident(RubyException)operator(\)) ident(exception)operator(\))operator(.)ident(set_backtrace)operator(()ident(args)operator([)integer(2)operator(])operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(runtime)operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(printExceptionSummary)operator(()ident(context)operator(,) ident(runtime)operator(,) operator(()ident(RubyException)operator(\)) ident(exception)operator(\))operator(;) + operator(}) + + keyword(throw) keyword(new) ident(RaiseException)operator(()operator(()ident(RubyException)operator(\)) ident(exception)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(printExceptionSummary)operator(()ident(ThreadContext) ident(context)operator(,) ident(Ruby) ident(runtime)operator(,) ident(RubyException) ident(rEx)operator(\)) operator({) + type(Frame) ident(currentFrame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + + type(String) ident(msg) operator(=) type(String)operator(.)ident(format)operator(()string<delimiter(")content(Exception `%s' at %s:%s - %s)char(\\n)delimiter(")>operator(,) + ident(rEx)operator(.)ident(getMetaClass)operator(()operator(\))operator(,) + ident(currentFrame)operator(.)ident(getFile)operator(()operator(\))operator(,) ident(currentFrame)operator(.)ident(getLine)operator(()operator(\)) operator(+) integer(1)operator(,) + ident(rEx)operator(.)ident(to_s)operator(()operator(\))operator(\))operator(;) + + ident(IRubyObject) ident(errorStream) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stderr)delimiter(")>operator(\))operator(;) + ident(errorStream)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()ident(msg)operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Require. + * MRI allows to require ever .rb files or ruby extension dll (.so or .dll depending on system\). + * we allow requiring either .rb files or jars. + * @param recv ruby object used to call require (any object will do and it won't be used anyway\). + * @param name the name of the file to require + **/) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(require)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(require)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(name)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()ident(name)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(load)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(load)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyString) ident(file) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + type(boolean) ident(wrap) operator(=) ident(args)operator(.)ident(length) operator(==) integer(2) operator(?) ident(args)operator([)integer(1)operator(])operator(.)ident(isTrue)operator(()operator(\)) operator(:) keyword(false)operator(;) + + ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(load)operator(()ident(file)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) ident(wrap)operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eval)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(3)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + comment(// string to eval) + ident(RubyString) ident(src) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(checkSafeString)operator(()ident(src)operator(\))operator(;) + + ident(IRubyObject) ident(scope) operator(=) ident(args)operator(.)ident(length) operator(>) integer(1) operator(&&) operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\)) operator(?) ident(args)operator([)integer(1)operator(]) operator(:) keyword(null)operator(;) + type(String) ident(file)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(2)operator(\)) operator({) + ident(file) operator(=) ident(args)operator([)integer(2)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(scope) operator(==) keyword(null)operator(\)) operator({) + ident(file) operator(=) string<delimiter(")content((eval\))delimiter(")>operator(;) + operator(}) keyword(else) operator({) + ident(file) operator(=) keyword(null)operator(;) + operator(}) + type(int) ident(line)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(3)operator(\)) operator({) + ident(line) operator(=) operator(()type(int)operator(\)) ident(args)operator([)integer(3)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(scope) operator(==) keyword(null)operator(\)) operator({) + ident(line) operator(=) integer(0)operator(;) + operator(}) keyword(else) operator({) + ident(line) operator(=) operator(-)integer(1)operator(;) + operator(}) + keyword(if) operator(()ident(scope) operator(==) keyword(null)operator(\)) ident(scope) operator(=) ident(RubyBinding)operator(.)ident(newBindingForEval)operator(()ident(context)operator(\))operator(;) + + keyword(return) ident(ASTInterpreter)operator(.)ident(evalWithBinding)operator(()ident(context)operator(,) ident(src)operator(,) ident(scope)operator(,) ident(file)operator(,) ident(line)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(callcc)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(callcc)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(EMPTY_IMPLEMENTATION)operator(,) string<delimiter(")content(Kernel#callcc: Continuations are not implemented in JRuby and will not work)delimiter(")>operator(,) string<delimiter(")content(Kernel#callcc)delimiter(")>operator(\))operator(;) + ident(IRubyObject) ident(cc) operator(=) ident(runtime)operator(.)ident(getContinuation)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + ident(cc)operator(.)ident(dataWrapStruct)operator(()ident(block)operator(\))operator(;) + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(cc)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(caller)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(caller)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(int) ident(level) operator(=) ident(args)operator(.)ident(length) operator(>) integer(0) operator(?) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\)) operator(:) integer(1)operator(;) + + keyword(if) operator(()ident(level) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative level()delimiter(")> operator(+) ident(level) operator(+) string<delimiter(')content(\))delimiter(')>operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(createCallerBacktrace)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(level)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(catch)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(rbCatch)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(tag)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(CatchTarget) ident(target) operator(=) keyword(new) ident(CatchTarget)operator(()ident(tag)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + keyword(try) operator({) + ident(context)operator(.)ident(pushCatch)operator(()ident(target)operator(\))operator(;) + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(tag)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ThrowJump) ident(tj)operator(\)) operator({) + keyword(if) operator(()ident(tj)operator(.)ident(getTarget)operator(()operator(\)) operator(==) ident(target)operator(\)) keyword(return) operator(()ident(IRubyObject)operator(\)) ident(tj)operator(.)ident(getValue)operator(()operator(\))operator(;) + + keyword(throw) ident(tj)operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(popCatch)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(class) class(CatchTarget) directive(implements) ident(JumpTarget) operator({) + directive(private) directive(final) type(String) ident(tag)operator(;) + directive(public) ident(CatchTarget)operator(()type(String) ident(tag)operator(\)) operator({) local_variable(this)operator(.)ident(tag) operator(=) ident(tag)operator(;) operator(}) + directive(public) type(String) ident(getTag)operator(()operator(\)) operator({) keyword(return) ident(tag)operator(;) operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(throw)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(rbThrow)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + type(String) ident(tag) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(;) + ident(CatchTarget)type([]) ident(catches) operator(=) ident(context)operator(.)ident(getActiveCatches)operator(()operator(\))operator(;) + + type(String) ident(message) operator(=) string<delimiter(")content(uncaught throw `)delimiter(")> operator(+) ident(tag) operator(+) string<delimiter(")content(')delimiter(")>operator(;) + + comment(// Ordering of array traversal not important, just intuitive) + keyword(for) operator(()type(int) ident(i) operator(=) ident(catches)operator(.)ident(length) operator(-) integer(1) operator(;) ident(i) operator(>=) integer(0) operator(;) ident(i)operator(--)operator(\)) operator({) + keyword(if) operator(()ident(tag)operator(.)ident(equals)operator(()ident(catches)operator([)ident(i)operator(])operator(.)ident(getTag)operator(()operator(\))operator(\))operator(\)) operator({) + comment(//Catch active, throw for catch to handle) + keyword(throw) keyword(new) ident(JumpException)operator(.)ident(ThrowJump)operator(()ident(catches)operator([)ident(i)operator(])operator(,) ident(args)operator(.)ident(length) operator(>) integer(1) operator(?) ident(args)operator([)integer(1)operator(]) operator(:) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(// No catch active for this throw) + ident(RubyThread) ident(currentThread) operator(=) ident(context)operator(.)ident(getThread)operator(()operator(\))operator(;) + keyword(if) operator(()ident(currentThread) operator(==) ident(runtime)operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(getMainThread)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNameError)operator(()ident(message)operator(,) ident(tag)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()ident(message) operator(+) string<delimiter(")content( in thread 0x)delimiter(")> operator(+) type(Integer)operator(.)ident(toHexString)operator(()ident(RubyInteger)operator(.)ident(fix2int)operator(()ident(currentThread)operator(.)ident(id)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(trap)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(trap)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(jsignal)delimiter(")>operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(recv)operator(,) string<delimiter(")content(__jtrap)delimiter(")>operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(warn)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(warn)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(message)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(runtime)operator(.)ident(getVerbose)operator(()operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(out) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($stderr)delimiter(")>operator(\))operator(;) + ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(out)operator(,) string<delimiter(")content(puts)delimiter(")>operator(,) ident(message)operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(set_trace_func)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(set_trace_func)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(trace_func)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(trace_func)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(setTraceFunction)operator(()keyword(null)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(!)operator(()ident(trace_func) keyword(instanceof) ident(RubyProc)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(trace_func needs to be Proc.)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(setTraceFunction)operator(()operator(()ident(RubyProc)operator(\)) ident(trace_func)operator(\))operator(;) + operator(}) + keyword(return) ident(trace_func)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(trace_var)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(trace_var)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(0)operator(,) integer(1)operator(\))operator(;) + ident(RubyProc) ident(proc) operator(=) keyword(null)operator(;) + type(String) ident(var) operator(=) ident(args)operator(.)ident(length) operator(>) integer(1) operator(?) ident(args)operator([)integer(0)operator(])operator(.)ident(toString)operator(()operator(\)) operator(:) keyword(null)operator(;) + comment(// ignore if it's not a global var) + keyword(if) operator(()ident(var)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(!=) string<delimiter(')content($)delimiter(')>operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) ident(proc) operator(=) ident(RubyProc)operator(.)ident(newProc)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(block)operator(,) ident(Block)operator(.)ident(Type)operator(.)ident(PROC)operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(2)operator(\)) operator({) + ident(proc) operator(=) operator(()ident(RubyProc)operator(\))ident(TypeConverter)operator(.)ident(convertToType)operator(()ident(args)operator([)integer(1)operator(])operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getProc)operator(()operator(\))operator(,) integer(0)operator(,) string<delimiter(")content(to_proc)delimiter(")>operator(,) keyword(true)operator(\))operator(;) + operator(}) + + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(setTraceVar)operator(()ident(var)operator(,) ident(proc)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(untrace_var)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(untrace_var)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(0)operator(,) integer(1)operator(\))operator(;) + type(String) ident(var) operator(=) ident(args)operator(.)ident(length) operator(>=) integer(1) operator(?) ident(args)operator([)integer(0)operator(])operator(.)ident(toString)operator(()operator(\)) operator(:) keyword(null)operator(;) + + comment(// ignore if it's not a global var) + keyword(if) operator(()ident(var)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(!=) string<delimiter(')content($)delimiter(')>operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + type(ArrayList)operator(<)ident(IRubyObject)operator(>) ident(success) operator(=) keyword(new) type(ArrayList)operator(<)ident(IRubyObject)operator(>)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(untraceVar)operator(()ident(var)operator(,) ident(args)operator([)ident(i)operator(])operator(\))operator(\)) operator({) + ident(success)operator(.)ident(add)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(success)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(untraceVar)operator(()ident(var)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(singleton_method_added)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(singleton_method_added)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(symbolId)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(singleton_method_removed)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(singleton_method_removed)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(symbolId)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(singleton_method_undefined)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(singleton_method_undefined)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(symbolId)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(proc)delimiter(")>operator(,) string<delimiter(")content(lambda)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_8)operator(\)) + directive(public) directive(static) ident(RubyProc) ident(proc)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newProc)operator(()ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) directive(static) ident(RubyProc) ident(proc)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newProc)operator(()ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(lambda)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(RubyProc) ident(lambda)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newProc)operator(()ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(proc)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(RubyProc) ident(proc_1_9)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newProc)operator(()ident(Block)operator(.)ident(Type)operator(.)ident(PROC)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(loop)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(loop)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(while) operator(()keyword(true)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + + ident(context)operator(.)ident(pollThreadEvents)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(test)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(test)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\))operator(;) + + type(int) ident(cmd)operator(;) + keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(cmd) operator(=) operator(()type(int)operator(\))operator(()operator(()ident(RubyFixnum)operator(\)) ident(args)operator([)integer(0)operator(])operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyString) operator(&&) + operator(()operator(()ident(RubyString)operator(\)) ident(args)operator([)integer(0)operator(])operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(>) integer(0)operator(\)) operator({) + comment(// MRI behavior: use first byte of string value if len > 0) + ident(cmd) operator(=) operator(()operator(()ident(RubyString)operator(\)) ident(args)operator([)integer(0)operator(])operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(charAt)operator(()integer(0)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(cmd) operator(=) operator(()type(int)operator(\)) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + + comment(// MRI behavior: raise ArgumentError for 'unknown command' before) + comment(// checking number of args.) + keyword(switch)operator(()ident(cmd)operator(\)) operator({) + keyword(case) string<delimiter(')content(A)delimiter(')>operator(:) keyword(case) string<delimiter(')content(b)delimiter(')>operator(:) keyword(case) string<delimiter(')content(c)delimiter(')>operator(:) keyword(case) string<delimiter(')content(C)delimiter(')>operator(:) keyword(case) string<delimiter(')content(d)delimiter(')>operator(:) keyword(case) string<delimiter(')content(e)delimiter(')>operator(:) keyword(case) string<delimiter(')content(f)delimiter(')>operator(:) keyword(case) string<delimiter(')content(g)delimiter(')>operator(:) keyword(case) string<delimiter(')content(G)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(k)delimiter(')>operator(:) keyword(case) string<delimiter(')content(M)delimiter(')>operator(:) keyword(case) string<delimiter(')content(l)delimiter(')>operator(:) keyword(case) string<delimiter(')content(o)delimiter(')>operator(:) keyword(case) string<delimiter(')content(O)delimiter(')>operator(:) keyword(case) string<delimiter(')content(p)delimiter(')>operator(:) keyword(case) string<delimiter(')content(r)delimiter(')>operator(:) keyword(case) string<delimiter(')content(R)delimiter(')>operator(:) keyword(case) string<delimiter(')content(s)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(S)delimiter(')>operator(:) keyword(case) string<delimiter(')content(u)delimiter(')>operator(:) keyword(case) string<delimiter(')content(w)delimiter(')>operator(:) keyword(case) string<delimiter(')content(W)delimiter(')>operator(:) keyword(case) string<delimiter(')content(x)delimiter(')>operator(:) keyword(case) string<delimiter(')content(X)delimiter(')>operator(:) keyword(case) string<delimiter(')content(z)delimiter(')>operator(:) keyword(case) string<delimiter(')content(=)delimiter(')>operator(:) keyword(case) string<delimiter(')content(<)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(>)delimiter(')>operator(:) keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(default)operator(:) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(unknown command ?)delimiter(")> operator(+) operator(()type(char)operator(\)) ident(cmd)operator(\))operator(;) + operator(}) + + comment(// MRI behavior: now check arg count) + + keyword(switch)operator(()ident(cmd)operator(\)) operator({) + keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) keyword(case) string<delimiter(')content(=)delimiter(')>operator(:) keyword(case) string<delimiter(')content(<)delimiter(')>operator(:) keyword(case) string<delimiter(')content(>)delimiter(')>operator(:) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(3)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(3)operator(\))operator(;) + keyword(break)operator(;) + keyword(default)operator(:) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(2)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(2)operator(\))operator(;) + keyword(break)operator(;) + operator(}) + + keyword(switch) operator(()ident(cmd)operator(\)) operator({) + keyword(case) string<delimiter(')content(A)delimiter(')>operator(:) comment(// ?A | Time | Last access time for file1) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(atime)operator(()operator(\))operator(;) + keyword(case) string<delimiter(')content(b)delimiter(')>operator(:) comment(// ?b | boolean | True if file1 is a block device) + keyword(return) ident(RubyFileTest)operator(.)ident(blockdev_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(c)delimiter(')>operator(:) comment(// ?c | boolean | True if file1 is a character device) + keyword(return) ident(RubyFileTest)operator(.)ident(chardev_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(C)delimiter(')>operator(:) comment(// ?C | Time | Last change time for file1) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(ctime)operator(()operator(\))operator(;) + keyword(case) string<delimiter(')content(d)delimiter(')>operator(:) comment(// ?d | boolean | True if file1 exists and is a directory) + keyword(return) ident(RubyFileTest)operator(.)ident(directory_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(e)delimiter(')>operator(:) comment(// ?e | boolean | True if file1 exists) + keyword(return) ident(RubyFileTest)operator(.)ident(exist_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(f)delimiter(')>operator(:) comment(// ?f | boolean | True if file1 exists and is a regular file) + keyword(return) ident(RubyFileTest)operator(.)ident(file_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(g)delimiter(')>operator(:) comment(// ?g | boolean | True if file1 has the \\CF{setgid} bit) + keyword(return) ident(RubyFileTest)operator(.)ident(setgid_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(G)delimiter(')>operator(:) comment(// ?G | boolean | True if file1 exists and has a group ownership equal to the caller's group) + keyword(return) ident(RubyFileTest)operator(.)ident(grpowned_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(k)delimiter(')>operator(:) comment(// ?k | boolean | True if file1 exists and has the sticky bit set) + keyword(return) ident(RubyFileTest)operator(.)ident(sticky_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(M)delimiter(')>operator(:) comment(// ?M | Time | Last modification time for file1) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(mtime)operator(()operator(\))operator(;) + keyword(case) string<delimiter(')content(l)delimiter(')>operator(:) comment(// ?l | boolean | True if file1 exists and is a symbolic link) + keyword(return) ident(RubyFileTest)operator(.)ident(symlink_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(o)delimiter(')>operator(:) comment(// ?o | boolean | True if file1 exists and is owned by the caller's effective uid) + keyword(return) ident(RubyFileTest)operator(.)ident(owned_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(O)delimiter(')>operator(:) comment(// ?O | boolean | True if file1 exists and is owned by the caller's real uid ) + keyword(return) ident(RubyFileTest)operator(.)ident(rowned_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(p)delimiter(')>operator(:) comment(// ?p | boolean | True if file1 exists and is a fifo) + keyword(return) ident(RubyFileTest)operator(.)ident(pipe_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(r)delimiter(')>operator(:) comment(// ?r | boolean | True if file1 is readable by the effective uid/gid of the caller) + keyword(return) ident(RubyFileTest)operator(.)ident(readable_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(R)delimiter(')>operator(:) comment(// ?R | boolean | True if file is readable by the real uid/gid of the caller) + comment(// FIXME: Need to implement an readable_real_p in FileTest) + keyword(return) ident(RubyFileTest)operator(.)ident(readable_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(s)delimiter(')>operator(:) comment(// ?s | int/nil | If file1 has nonzero size, return the size, otherwise nil) + keyword(return) ident(RubyFileTest)operator(.)ident(size_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(S)delimiter(')>operator(:) comment(// ?S | boolean | True if file1 exists and is a socket) + keyword(return) ident(RubyFileTest)operator(.)ident(socket_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(u)delimiter(')>operator(:) comment(// ?u | boolean | True if file1 has the setuid bit set) + keyword(return) ident(RubyFileTest)operator(.)ident(setuid_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(w)delimiter(')>operator(:) comment(// ?w | boolean | True if file1 exists and is writable by effective uid/gid) + keyword(return) ident(RubyFileTest)operator(.)ident(writable_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(W)delimiter(')>operator(:) comment(// ?W | boolean | True if file1 exists and is writable by the real uid/gid) + comment(// FIXME: Need to implement an writable_real_p in FileTest) + keyword(return) ident(RubyFileTest)operator(.)ident(writable_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(x)delimiter(')>operator(:) comment(// ?x | boolean | True if file1 exists and is executable by the effective uid/gid) + keyword(return) ident(RubyFileTest)operator(.)ident(executable_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(X)delimiter(')>operator(:) comment(// ?X | boolean | True if file1 exists and is executable by the real uid/gid) + keyword(return) ident(RubyFileTest)operator(.)ident(executable_real_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(z)delimiter(')>operator(:) comment(// ?z | boolean | True if file1 exists and has a zero length) + keyword(return) ident(RubyFileTest)operator(.)ident(zero_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(=)delimiter(')>operator(:) comment(// ?= | boolean | True if the modification times of file1 and file2 are equal) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(mtimeEquals)operator(()ident(args)operator([)integer(2)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(<)delimiter(')>operator(:) comment(// ?< | boolean | True if the modification time of file1 is prior to that of file2) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(mtimeLessThan)operator(()ident(args)operator([)integer(2)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(>)delimiter(')>operator(:) comment(// ?> | boolean | True if the modification time of file1 is after that of file2) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFileStat)operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(.)ident(mtimeGreaterThan)operator(()ident(args)operator([)integer(2)operator(])operator(\))operator(;) + keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) comment(// ?- | boolean | True if file1 and file2 are identical) + keyword(return) ident(RubyFileTest)operator(.)ident(identical_p)operator(()ident(recv)operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(args)operator([)integer(2)operator(])operator(\))operator(;) + keyword(default)operator(:) + keyword(throw) keyword(new) type(InternalError)operator(()string<delimiter(")content(unreachable code reached!)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(`)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(backquote)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(aString)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(ByteArrayOutputStream) ident(output) operator(=) keyword(new) type(ByteArrayOutputStream)operator(()operator(\))operator(;) + + ident(RubyString) ident(string) operator(=) ident(aString)operator(.)ident(convertToString)operator(()operator(\))operator(;) + type(int) ident(resultCode) operator(=) ident(ShellLauncher)operator(.)ident(runAndWait)operator(()ident(runtime)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(string)operator(})operator(,) ident(output)operator(\))operator(;) + + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($?)delimiter(")>operator(,) ident(RubyProcess)operator(.)ident(RubyStatus)operator(.)ident(newProcessStatus)operator(()ident(runtime)operator(,) ident(resultCode)operator(\))operator(\))operator(;) + + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(output)operator(.)ident(toByteArray)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(srand)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyInteger) ident(srand)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(long) ident(oldRandomSeed) operator(=) ident(runtime)operator(.)ident(getRandomSeed)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(RubyInteger) ident(integerSeed) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToInteger)operator(()ident(MethodIndex)operator(.)ident(TO_INT)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setRandomSeed)operator(()ident(integerSeed)operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + comment(// Not sure how well this works, but it works much better than) + comment(// just currentTimeMillis by itself.) + ident(runtime)operator(.)ident(setRandomSeed)operator(()type(System)operator(.)ident(currentTimeMillis)operator(()operator(\)) operator(^) + ident(recv)operator(.)ident(hashCode)operator(()operator(\)) operator(^) ident(runtime)operator(.)ident(incrementRandomSeedSequence)operator(()operator(\)) operator(^) + ident(runtime)operator(.)ident(getRandom)operator(()operator(\))operator(.)ident(nextInt)operator(()type(Math)operator(.)ident(max)operator(()integer(1)operator(,) type(Math)operator(.)ident(abs)operator(()operator(()type(int)operator(\))ident(runtime)operator(.)ident(getRandomSeed)operator(()operator(\))operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + ident(runtime)operator(.)ident(getRandom)operator(()operator(\))operator(.)ident(setSeed)operator(()ident(runtime)operator(.)ident(getRandomSeed)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(oldRandomSeed)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rand)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyNumeric) ident(rand)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(long) ident(ceil)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(ceil) operator(=) integer(0)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + type(byte)type([]) ident(bigCeilBytes) operator(=) operator(()operator(()ident(RubyBignum)operator(\)) ident(args)operator([)integer(0)operator(])operator(\))operator(.)ident(getValue)operator(()operator(\))operator(.)ident(toByteArray)operator(()operator(\))operator(;) + type(BigInteger) ident(bigCeil) operator(=) keyword(new) type(BigInteger)operator(()ident(bigCeilBytes)operator(\))operator(.)ident(abs)operator(()operator(\))operator(;) + + type(byte)type([]) ident(randBytes) operator(=) keyword(new) type(byte)operator([)ident(bigCeilBytes)operator(.)ident(length)operator(])operator(;) + ident(runtime)operator(.)ident(getRandom)operator(()operator(\))operator(.)ident(nextBytes)operator(()ident(randBytes)operator(\))operator(;) + + type(BigInteger) ident(result) operator(=) keyword(new) type(BigInteger)operator(()ident(randBytes)operator(\))operator(.)ident(abs)operator(()operator(\))operator(.)ident(mod)operator(()ident(bigCeil)operator(\))operator(;) + + keyword(return) keyword(new) ident(RubyBignum)operator(()ident(runtime)operator(,) ident(result)operator(\))operator(;) + operator(}) + + ident(RubyInteger) ident(integerCeil) operator(=) operator(()ident(RubyInteger)operator(\))ident(RubyKernel)operator(.)ident(new_integer)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + ident(ceil) operator(=) type(Math)operator(.)ident(abs)operator(()ident(integerCeil)operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong # of arguments()delimiter(")> operator(+) ident(args)operator(.)ident(length) operator(+) string<delimiter(")content( for 1\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(ceil) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRandom)operator(()operator(\))operator(.)ident(nextDouble)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(ceil) operator(>) type(Integer)operator(.)ident(MAX_VALUE)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()type(Math)operator(.)ident(abs)operator(()ident(runtime)operator(.)ident(getRandom)operator(()operator(\))operator(.)ident(nextLong)operator(()operator(\))operator(\)) operator(%) ident(ceil)operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(runtime)operator(.)ident(getRandom)operator(()operator(\))operator(.)ident(nextInt)operator(()operator(()type(int)operator(\)) ident(ceil)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(syscall)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(9)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(syscall)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Kernel#syscall is not implemented in JRuby)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(system)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(system)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(resultCode)operator(;) + keyword(try) operator({) + ident(resultCode) operator(=) ident(ShellLauncher)operator(.)ident(runAndWait)operator(()ident(runtime)operator(,) ident(args)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({) + ident(resultCode) operator(=) integer(127)operator(;) + operator(}) + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(()string<delimiter(")content($?)delimiter(")>operator(,) ident(RubyProcess)operator(.)ident(RubyStatus)operator(.)ident(newProcessStatus)operator(()ident(runtime)operator(,) ident(resultCode)operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newBoolean)operator(()ident(resultCode) operator(==) integer(0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(exec)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exec)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(resultCode)operator(;) + keyword(try) operator({) + comment(// TODO: exec should replace the current process.) + comment(// This could be possible with JNA. ) + ident(resultCode) operator(=) ident(ShellLauncher)operator(.)ident(execAndWait)operator(()ident(runtime)operator(,) ident(args)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoENOENTError)operator(()string<delimiter(")content(cannot execute)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(exit)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(runtime)operator(.)ident(newFixnum)operator(()ident(resultCode)operator(\))operator(})operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fork)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(fork)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(RubyInstanceConfig)operator(.)ident(FORK_ENABLED)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(fork is unsafe and disabled by default on JRuby)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + type(int) ident(pid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(fork)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(pid) operator(==) integer(0)operator(\)) operator({) + keyword(try) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(re)operator(\)) operator({) + keyword(if) operator(()ident(re)operator(.)ident(getException)operator(()operator(\)) keyword(instanceof) ident(RubySystemExit)operator(\)) operator({) + keyword(throw) ident(re)operator(;) + operator(}) + keyword(return) ident(exit_bang)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(})operator(\))operator(;) + operator(}) keyword(catch) operator(()type(Throwable) ident(t)operator(\)) operator({) + keyword(return) ident(exit_bang)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(})operator(\))operator(;) + operator(}) + keyword(return) ident(exit_bang)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([]) operator({)ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(})operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(pid)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + type(int) ident(result) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(fork)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(result) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(result)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(tap)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(recv)operator(\))operator(;) + keyword(return) ident(recv)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Charles O Nutter <headius@headius.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) + +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(LocalJumpError)delimiter(")>operator(,)ident(parent)operator(=)string<delimiter(")content(StandardError)delimiter(")>operator(\)) +directive(public) type(class) class(RubyLocalJumpError) directive(extends) ident(RubyException) operator({) + directive(private) directive(static) ident(ObjectAllocator) ident(LOCALJUMPERROR_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyLocalJumpError)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createLocalJumpErrorClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(standardErrorClass)operator(\)) operator({) + ident(RubyClass) ident(nameErrorClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(LocalJumpError)delimiter(")>operator(,) ident(standardErrorClass)operator(,) ident(LOCALJUMPERROR_ALLOCATOR)operator(\))operator(;) + + ident(nameErrorClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyLocalJumpError)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(nameErrorClass)operator(;) + operator(}) + + directive(private) ident(RubyLocalJumpError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(exceptionClass)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyLocalJumpError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(,) type(String) ident(message)operator(,) type(String) ident(reason)operator(,) ident(IRubyObject) ident(exitValue)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(exceptionClass)operator(,) ident(message)operator(\))operator(;) + ident(fastSetInternalVariable)operator(()string<delimiter(")content(reason)delimiter(")>operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()ident(reason)operator(\))operator(\))operator(;) + ident(fastSetInternalVariable)operator(()string<delimiter(")content(exit_value)delimiter(")>operator(,) ident(exitValue)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reason)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(reason)operator(()operator(\)) operator({) + keyword(return) ident(fastGetInternalVariable)operator(()string<delimiter(")content(reason)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exit_value)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(exit_value)operator(()operator(\)) operator({) + keyword(return) ident(fastGetInternalVariable)operator(()string<delimiter(")content(exit_value)delimiter(")>operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2007 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2003 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.ByteArrayInputStream)operator(;) +keyword(import) include(java.io.ByteArrayOutputStream)operator(;) +keyword(import) include(java.io.EOFException)operator(;) +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.InputStream)operator(;) +keyword(import) include(java.io.OutputStream)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) + +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.Constants)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) + +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.IOInputStream)operator(;) +keyword(import) include(org.jruby.util.IOOutputStream)operator(;) + +comment(/** + * Marshal module + * + * @author Anders + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Marshal)delimiter(")>operator(\)) +directive(public) type(class) class(RubyMarshal) operator({) + + directive(public) directive(static) ident(RubyModule) ident(createMarshalModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Marshal)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setMarshal)operator(()ident(module)operator(\))operator(;) + + ident(module)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyMarshal)operator(.)ident(class)operator(\))operator(;) + ident(module)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MAJOR_VERSION)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(Constants)operator(.)ident(MARSHAL_MAJOR)operator(\))operator(\))operator(;) + ident(module)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MINOR_VERSION)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(Constants)operator(.)ident(MARSHAL_MINOR)operator(\))operator(\))operator(;) + + keyword(return) ident(module)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dump)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(dump)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(<) integer(1)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong # of arguments(at least 1\))delimiter(")>operator(\))operator(;) + operator(}) + ident(IRubyObject) ident(objectToDump) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + + ident(IRubyObject) ident(io) operator(=) keyword(null)operator(;) + type(int) ident(depthLimit) operator(=) operator(-)integer(1)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>=) integer(2)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(respondsTo)operator(()string<delimiter(")content(write)delimiter(")>operator(\))operator(\)) operator({) + ident(io) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(depthLimit) operator(=) operator(()type(int)operator(\)) operator(()operator(()ident(RubyFixnum)operator(\)) ident(args)operator([)integer(1)operator(])operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Instance of IO needed)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(3)operator(\)) operator({) + ident(depthLimit) operator(=) operator(()type(int)operator(\)) operator(()operator(()ident(RubyFixnum)operator(\)) ident(args)operator([)integer(2)operator(])operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(try) operator({) + keyword(if) operator(()ident(io) operator(!=) keyword(null)operator(\)) operator({) + ident(dumpToStream)operator(()ident(objectToDump)operator(,) ident(outputStream)operator(()ident(io)operator(\))operator(,) ident(depthLimit)operator(\))operator(;) + keyword(return) ident(io)operator(;) + operator(}) + type(ByteArrayOutputStream) ident(stringOutput) operator(=) keyword(new) type(ByteArrayOutputStream)operator(()operator(\))operator(;) + ident(dumpToStream)operator(()ident(objectToDump)operator(,) ident(stringOutput)operator(,) ident(depthLimit)operator(\))operator(;) + + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) keyword(new) ident(ByteList)operator(()ident(stringOutput)operator(.)ident(toByteArray)operator(()operator(\))operator(,)keyword(false)operator(\))operator(\))operator(;) + + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(ioe)operator(\))operator(;) + operator(}) + + operator(}) + + directive(private) directive(static) type(OutputStream) ident(outputStream)operator(()ident(IRubyObject) ident(out)operator(\)) operator({) + ident(setBinmodeIfPossible)operator(()ident(out)operator(\))operator(;) + keyword(if) operator(()ident(out) keyword(instanceof) ident(RubyIO)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyIO)operator(\)) ident(out)operator(\))operator(.)ident(getOutStream)operator(()operator(\))operator(;) + operator(}) + keyword(return) keyword(new) ident(IOOutputStream)operator(()ident(out)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(setBinmodeIfPossible)operator(()ident(IRubyObject) ident(io)operator(\)) operator({) + keyword(if) operator(()ident(io)operator(.)ident(respondsTo)operator(()string<delimiter(")content(binmode)delimiter(")>operator(\))operator(\)) operator({) + ident(io)operator(.)ident(callMethod)operator(()ident(io)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(binmode)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(load)delimiter(")>operator(,) string<delimiter(")content(restore)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(load)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(try) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(<) integer(1)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments (0 for 1\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(2)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments ()delimiter(")> operator(+) ident(args)operator(.)ident(length) operator(+) string<delimiter(")content( for 2\))delimiter(")>operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(in) operator(=) keyword(null)operator(;) + ident(IRubyObject) ident(proc) operator(=) keyword(null)operator(;) + + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(2)operator(:) + ident(proc) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + keyword(case) integer(1)operator(:) + ident(in) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + operator(}) + + type(InputStream) ident(rawInput)operator(;) + keyword(if) operator(()ident(in) operator(!=) keyword(null) operator(&&) ident(in)operator(.)ident(respondsTo)operator(()string<delimiter(")content(read)delimiter(")>operator(\))operator(\)) operator({) + ident(rawInput) operator(=) ident(inputStream)operator(()ident(in)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(in) operator(!=) keyword(null) operator(&&) ident(in)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\)) operator({) + ident(RubyString) ident(inString) operator(=) operator(()ident(RubyString)operator(\)) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(in)operator(,) string<delimiter(")content(to_str)delimiter(")>operator(\))operator(;) + ident(ByteList) ident(bytes) operator(=) ident(inString)operator(.)ident(getByteList)operator(()operator(\))operator(;) + ident(rawInput) operator(=) keyword(new) type(ByteArrayInputStream)operator(()ident(bytes)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(begin)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(instance of IO needed)delimiter(")>operator(\))operator(;) + operator(}) + + ident(UnmarshalStream) ident(input) operator(=) keyword(new) ident(UnmarshalStream)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(rawInput)operator(,) ident(proc)operator(\))operator(;) + + keyword(return) ident(input)operator(.)ident(unmarshalObject)operator(()operator(\))operator(;) + + operator(}) keyword(catch) operator(()type(EOFException) ident(ee)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(ioe)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(InputStream) ident(inputStream)operator(()ident(IRubyObject) ident(in)operator(\)) operator({) + ident(setBinmodeIfPossible)operator(()ident(in)operator(\))operator(;) + keyword(if) operator(()ident(in) keyword(instanceof) ident(RubyIO)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyIO)operator(\)) ident(in)operator(\))operator(.)ident(getInStream)operator(()operator(\))operator(;) + operator(}) + keyword(return) keyword(new) ident(IOInputStream)operator(()ident(in)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(void) ident(dumpToStream)operator(()ident(IRubyObject) ident(object)operator(,) type(OutputStream) ident(rawOutput)operator(,) type(int) ident(depthLimit)operator(\)) + directive(throws) type(IOException) + operator({) + ident(MarshalStream) ident(output) operator(=) keyword(new) ident(MarshalStream)operator(()ident(object)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(rawOutput)operator(,) ident(depthLimit)operator(\))operator(;) + ident(output)operator(.)ident(dumpObject)operator(()ident(object)operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.util.Iterator)operator(;) + +keyword(import) include(org.joni.NameEntry)operator(;) +keyword(import) include(org.joni.Regex)operator(;) +keyword(import) include(org.joni.Region)operator(;) +keyword(import) include(org.joni.exception.JOniException)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) + +comment(/** + * @author olabini + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(MatchData)delimiter(")>operator(\)) +directive(public) type(class) class(RubyMatchData) directive(extends) ident(RubyObject) operator({) + type(Region) ident(regs)operator(;) comment(// captures) + type(int) ident(begin)operator(;) comment(// begin and end are used when not groups defined) + type(int) ident(end)operator(;) + ident(RubyString) ident(str)operator(;) + ident(Regex) ident(pattern)operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createMatchDataClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + comment(// TODO: Is NOT_ALLOCATABLE_ALLOCATOR ok here, since you can't actually instantiate MatchData directly?) + ident(RubyClass) ident(matchDataClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(MatchData)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setMatchData)operator(()ident(matchDataClass)operator(\))operator(;) + ident(runtime)operator(.)ident(defineGlobalConstant)operator(()string<delimiter(")content(MatchingData)delimiter(")>operator(,) ident(matchDataClass)operator(\))operator(;) + ident(matchDataClass)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyMatchData)operator(;) + operator(}) + operator(})operator(;) + + ident(matchDataClass)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(undefineMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + + ident(matchDataClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyMatchData)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(matchDataClass)operator(;) + operator(}) + + directive(public) ident(RubyMatchData)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getMatchData)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(final) directive(static) type(int) ident(MATCH_BUSY) operator(=) ident(USER2_F)operator(;) + + comment(// rb_match_busy) + directive(public) directive(final) type(void) ident(use)operator(()operator(\)) operator({) + ident(flags) operator(|=) ident(MATCH_BUSY)operator(;) + operator(}) + + directive(public) directive(final) type(boolean) ident(used)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(MATCH_BUSY)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + directive(private) ident(RubyArray) ident(match_array)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(start)operator(\)) operator({) + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(start) operator(!=) integer(0)operator(\)) keyword(return) ident(runtime)operator(.)ident(newEmptyArray)operator(()operator(\))operator(;) + keyword(if) operator(()ident(begin) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(RubyString) ident(ss) operator(=) ident(str)operator(.)ident(makeShared)operator(()ident(runtime)operator(,) ident(begin)operator(,) ident(end) operator(-) ident(begin)operator(\))operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(ss)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(ss)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(RubyArray) ident(arr) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(regs)operator(.)ident(numRegs) operator(-) ident(start)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)ident(start)operator(;) ident(i)operator(<)ident(regs)operator(.)ident(numRegs)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(regs)operator(.)ident(beg)operator([)ident(i)operator(]) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(arr)operator(.)ident(append)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(RubyString) ident(ss) operator(=) ident(str)operator(.)ident(makeShared)operator(()ident(runtime)operator(,) ident(regs)operator(.)ident(beg)operator([)ident(i)operator(])operator(,) ident(regs)operator(.)ident(end)operator([)ident(i)operator(]) operator(-) ident(regs)operator(.)ident(beg)operator([)ident(i)operator(])operator(\))operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(ss)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + ident(arr)operator(.)ident(append)operator(()ident(ss)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(arr)operator(;) + operator(}) + + operator(}) + + directive(public) ident(IRubyObject) ident(group)operator(()type(long) ident(n)operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(nth_match)operator(()operator(()type(int)operator(\))ident(n)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(group)operator(()type(int) ident(n)operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(nth_match)operator(()ident(n)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + keyword(if) operator(()ident(pattern) operator(==) keyword(null)operator(\)) keyword(return) ident(anyToString)operator(()operator(\))operator(;) + + ident(RubyString) ident(result) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()operator(\))operator(;) + ident(result)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(#)delimiter(')>operator(\))operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(<)delimiter(')>operator(\))operator(;) + ident(result)operator(.)ident(append)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(to_s)operator(()operator(\))operator(\))operator(;) + + ident(NameEntry)type([])ident(names) operator(=) keyword(new) ident(NameEntry)operator([)ident(regs) operator(==) keyword(null) operator(?) integer(1) operator(:) ident(regs)operator(.)ident(numRegs)operator(])operator(;) + + keyword(if) operator(()ident(pattern)operator(.)ident(numberOfNames)operator(()operator(\)) operator(>) integer(0)operator(\)) operator({) + keyword(for) operator(()type(Iterator)operator(<)ident(NameEntry)operator(>) ident(i) operator(=) ident(pattern)operator(.)ident(namedBackrefIterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(NameEntry) ident(e) operator(=) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(num) operator(:) ident(e)operator(.)ident(getBackRefs)operator(()operator(\))operator(\)) ident(names)operator([)ident(num)operator(]) operator(=) ident(e)operator(;) + operator(}) + operator(}) + + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(names)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content( )delimiter(')>operator(\))operator(;) + keyword(if) operator(()ident(i) operator(>) integer(0)operator(\)) operator({) + ident(NameEntry) ident(e) operator(=) ident(names)operator([)ident(i)operator(])operator(;) + keyword(if) operator(()ident(e) operator(!=) keyword(null)operator(\)) operator({) + ident(result)operator(.)ident(cat)operator(()ident(e)operator(.)ident(name)operator(,) ident(e)operator(.)ident(nameP)operator(,) ident(e)operator(.)ident(nameEnd) operator(-) ident(e)operator(.)ident(nameP)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))operator(()string<delimiter(')content(0)delimiter(')> operator(+) ident(i)operator(\))operator(\))operator(;) + operator(}) + ident(result)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(:)delimiter(')>operator(\))operator(;) + operator(}) + ident(IRubyObject) ident(v) operator(=) ident(RubyRegexp)operator(.)ident(nth_match)operator(()ident(i)operator(,) local_variable(this)operator(\))operator(;) + keyword(if) operator(()ident(v)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(result)operator(.)ident(cat)operator(()string<delimiter(")content(nil)delimiter(")>operator(.)ident(getBytes)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result)operator(.)ident(append)operator(()ident(v)operator(.)ident(inspect)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(result)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(>)delimiter(')>operator(\))operator(;) + operator(}) + + comment(/** match_to_a + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_a)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyArray) ident(to_a)operator(()operator(\)) operator({) + keyword(return) ident(match_array)operator(()ident(getRuntime)operator(()operator(\))operator(,) integer(0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(values_at)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(values_at)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(to_a)operator(()operator(\))operator(.)ident(values_at)operator(()ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(select)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(select)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(to_a)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** match_captures + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(captures)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(captures)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(match_array)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) integer(1)operator(\))operator(;) + operator(}) + + directive(private) type(int) ident(nameToBackrefNumber)operator(()ident(RubyString) ident(str)operator(\)) operator({) + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(try) operator({) + keyword(return) ident(pattern)operator(.)ident(nameToBackrefNumber)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(,) ident(regs)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JOniException) ident(je)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()ident(je)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(final) type(int) ident(backrefNumber)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()ident(obj) keyword(instanceof) ident(RubySymbol)operator(\)) operator({) + keyword(return) ident(nameToBackrefNumber)operator(()operator(()ident(RubyString)operator(\))operator(()operator(()ident(RubySymbol)operator(\))ident(obj)operator(\))operator(.)ident(id2name)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(obj) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(nameToBackrefNumber)operator(()operator(()ident(RubyString)operator(\))ident(obj)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(obj)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(op_aref)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(op_aref)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** match_aref + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(IRubyObject) ident(idx)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(op_arefCommon)operator(()ident(idx)operator(\))operator(;) + keyword(return) ident(result) operator(==) keyword(null) operator(?) operator(()operator(()ident(RubyArray)operator(\))ident(to_a)operator(()operator(\))operator(\))operator(.)ident(aref)operator(()ident(idx)operator(\)) operator(:) ident(result)operator(;) + operator(}) + + comment(/** match_aref + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(IRubyObject) ident(idx)operator(,) ident(IRubyObject) ident(rest)operator(\)) operator({) + ident(IRubyObject) ident(result)operator(;) + keyword(return) operator(!)ident(rest)operator(.)ident(isNil)operator(()operator(\)) operator(||) operator(()ident(result) operator(=) ident(op_arefCommon)operator(()ident(idx)operator(\))operator(\)) operator(==) keyword(null) operator(?) operator(()operator(()ident(RubyArray)operator(\))ident(to_a)operator(()operator(\))operator(\))operator(.)ident(aref)operator(()ident(idx)operator(,) ident(rest)operator(\)) operator(:) ident(result)operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(op_arefCommon)operator(()ident(IRubyObject) ident(idx)operator(\)) operator({) + keyword(if) operator(()ident(idx) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(int) ident(num) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(idx)operator(\))operator(;) + keyword(if) operator(()ident(num) operator(>=) integer(0)operator(\)) keyword(return) ident(RubyRegexp)operator(.)ident(nth_match)operator(()ident(num)operator(,) local_variable(this)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(idx) keyword(instanceof) ident(RubySymbol)operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(nth_match)operator(()ident(nameToBackrefNumber)operator(()operator(()ident(RubyString)operator(\))operator(()operator(()ident(RubySymbol)operator(\))ident(idx)operator(\))operator(.)ident(id2name)operator(()operator(\))operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(idx) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(nth_match)operator(()ident(nameToBackrefNumber)operator(()operator(()ident(RubyString)operator(\))ident(idx)operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** match_size + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(size)delimiter(")>operator(,) string<delimiter(")content(length)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(regs) operator(==) keyword(null) operator(?) ident(RubyFixnum)operator(.)ident(one)operator(()ident(getRuntime)operator(()operator(\))operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(regs)operator(.)ident(numRegs)operator(\))operator(;) + operator(}) + + comment(/** match_begin + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(begin)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(begin)operator(()ident(IRubyObject) ident(index)operator(\)) operator({) + type(int) ident(i) operator(=) ident(backrefNumber)operator(()ident(index)operator(\))operator(;) + + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(i) operator(!=) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(i) operator(+) string<delimiter(")content( out of matches)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(begin) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(begin)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(i) operator(<) integer(0) operator(||) ident(regs)operator(.)ident(numRegs) operator(<=) ident(i)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(i) operator(+) string<delimiter(")content( out of matches)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(regs)operator(.)ident(beg)operator([)ident(i)operator(]) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(regs)operator(.)ident(beg)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + + comment(/** match_end + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(end)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(end)operator(()ident(IRubyObject) ident(index)operator(\)) operator({) + type(int) ident(i) operator(=) ident(backrefNumber)operator(()ident(index)operator(\))operator(;) + + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(i) operator(!=) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(i) operator(+) string<delimiter(")content( out of matches)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(end) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(end)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(i) operator(<) integer(0) operator(||) ident(regs)operator(.)ident(numRegs) operator(<=) ident(i)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(i) operator(+) string<delimiter(")content( out of matches)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(regs)operator(.)ident(end)operator([)ident(i)operator(]) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(regs)operator(.)ident(end)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + + comment(/** match_offset + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(offset)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(offset)operator(()ident(IRubyObject) ident(index)operator(\)) operator({) + type(int) ident(i) operator(=) ident(backrefNumber)operator(()ident(index)operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(i) operator(!=) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(i) operator(+) string<delimiter(")content( out of matches)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(begin) operator(<) integer(0)operator(\)) keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(begin)operator(\))operator(,)ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(end)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(i) operator(<) integer(0) operator(||) ident(regs)operator(.)ident(numRegs) operator(<=) ident(i)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(i) operator(+) string<delimiter(")content( out of matches)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(regs)operator(.)ident(beg)operator([)ident(i)operator(]) operator(<) integer(0)operator(\)) keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(regs)operator(.)ident(beg)operator([)ident(i)operator(])operator(\))operator(,)ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(regs)operator(.)ident(end)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** match_pre_match + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pre_match)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(pre_match)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(ss)operator(;) + + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if)operator(()ident(begin) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(ss) operator(=) ident(str)operator(.)ident(makeShared)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) integer(0)operator(,) ident(begin)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if)operator(()ident(regs)operator(.)ident(beg)operator([)integer(0)operator(]) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(ss) operator(=) ident(str)operator(.)ident(makeShared)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) integer(0)operator(,) ident(regs)operator(.)ident(beg)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(ss)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(ss)operator(;) + operator(}) + + comment(/** match_post_match + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(post_match)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(post_match)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(ss)operator(;) + + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(begin) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(ss) operator(=) ident(str)operator(.)ident(makeShared)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(end)operator(,) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(-) ident(end)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(regs)operator(.)ident(beg)operator([)integer(0)operator(]) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(ss) operator(=) ident(str)operator(.)ident(makeShared)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(regs)operator(.)ident(end)operator([)integer(0)operator(])operator(,) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(-) ident(regs)operator(.)ident(end)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + keyword(if)operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(ss)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(ss)operator(;) + operator(}) + + comment(/** match_to_s + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + ident(IRubyObject) ident(ss) operator(=) ident(RubyRegexp)operator(.)ident(last_match)operator(()local_variable(this)operator(\))operator(;) + keyword(if) operator(()ident(ss)operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(ss) operator(=) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(ss)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(ss)operator(;) + operator(}) + + comment(/** match_string + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(string)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(string)operator(()operator(\)) operator({) + keyword(return) ident(str)operator(;) comment(//str is frozen) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(original)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(original)operator(\)) keyword(return) local_variable(this)operator(;) + + keyword(if) operator(()operator(!)operator(()ident(getMetaClass)operator(()operator(\)) operator(==) ident(original)operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(\))operator({) comment(// MRI also does a pointer comparison here) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument class)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyMatchData) ident(origMatchData) operator(=) operator(()ident(RubyMatchData)operator(\))ident(original)operator(;) + ident(str) operator(=) ident(origMatchData)operator(.)ident(str)operator(;) + ident(regs) operator(=) ident(origMatchData)operator(.)ident(regs)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001-2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Math)delimiter(")>operator(\)) +directive(public) type(class) class(RubyMath) operator({) + comment(/** Create the Math module and add it to the Ruby runtime. + * + */) + directive(public) directive(static) ident(RubyModule) ident(createMathModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(result) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Math)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setMath)operator(()ident(result)operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(E)delimiter(")>operator(,) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(runtime)operator(,) type(Math)operator(.)ident(E)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(PI)delimiter(")>operator(,) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(runtime)operator(,) type(Math)operator(.)ident(PI)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyMath)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + + directive(private) directive(static) type(void) ident(domainCheck)operator(()ident(IRubyObject) ident(recv)operator(,) type(double) ident(value)operator(,) type(String) ident(msg)operator(\)) operator({) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\))operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEDOMError)operator(()ident(msg)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) type(double) ident(chebylevSerie)operator(()type(double) ident(x)operator(,) type(double) ident(coef)type([])operator(\)) operator({) + type(double) ident(b0)operator(,) ident(b1)operator(,) ident(b2)operator(,) ident(twox)operator(;) + type(int) ident(i)operator(;) + ident(b1) operator(=) float(0.0)operator(;) + ident(b0) operator(=) float(0.0)operator(;) + ident(b2) operator(=) float(0.0)operator(;) + ident(twox) operator(=) float(2.0) operator(*) ident(x)operator(;) + keyword(for) operator(()ident(i) operator(=) ident(coef)operator(.)ident(length)operator(-)integer(1)operator(;) ident(i) operator(>=) integer(0)operator(;) ident(i)operator(--)operator(\)) operator({) + ident(b2) operator(=) ident(b1)operator(;) + ident(b1) operator(=) ident(b0)operator(;) + ident(b0) operator(=) ident(twox) operator(*) ident(b1) operator(-) ident(b2) operator(+) ident(coef)operator([)ident(i)operator(])operator(;) + operator(}) + keyword(return) float(0.5)operator(*)operator(()ident(b0) operator(-) ident(b2)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(double) ident(sign)operator(()type(double) ident(x)operator(,) type(double) ident(y)operator(\)) operator({) + type(double) ident(abs) operator(=) operator(()operator(()ident(x) operator(<) integer(0)operator(\)) operator(?) operator(-)ident(x) operator(:) ident(x)operator(\))operator(;) + keyword(return) operator(()ident(y) operator(<) float(0.0)operator(\)) operator(?) operator(-)ident(abs) operator(:) ident(abs)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(atan2)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(atan2)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + type(double) ident(valuea) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(valueb) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(y)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(atan2)operator(()ident(valuea)operator(,) ident(valueb)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(cos)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(cos)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)type(Math)operator(.)ident(cos)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sin)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(sin)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)type(Math)operator(.)ident(sin)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(tan)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(tan)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)type(Math)operator(.)ident(tan)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(asin)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(asin)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(result) operator(=) type(Math)operator(.)ident(asin)operator(()ident(value)operator(\))operator(;) + ident(domainCheck)operator(()ident(recv)operator(,) ident(result)operator(,) string<delimiter(")content(asin)delimiter(")>operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(acos)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(acos)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(result) operator(=) type(Math)operator(.)ident(acos)operator(()ident(value)operator(\))operator(;) + ident(domainCheck)operator(()ident(recv)operator(,) ident(result)operator(,) string<delimiter(")content(acos)delimiter(")>operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(atan)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(atan)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)type(Math)operator(.)ident(atan)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(cosh)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(cosh)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)operator(()type(Math)operator(.)ident(exp)operator(()ident(value)operator(\)) operator(+) type(Math)operator(.)ident(exp)operator(()operator(-)ident(value)operator(\))operator(\)) operator(/) float(2.0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sinh)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(sinh)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)operator(()type(Math)operator(.)ident(exp)operator(()ident(value)operator(\)) operator(-) type(Math)operator(.)ident(exp)operator(()operator(-)ident(value)operator(\))operator(\)) operator(/) float(2.0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(tanh)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(tanh)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) type(Math)operator(.)ident(tanh)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(acosh)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(acosh)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(result)operator(;) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\)) operator(||) ident(value) operator(<) integer(1)operator(\)) operator({) + ident(result) operator(=) type(Double)operator(.)ident(NaN)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(value) operator(<) float(94906265.62)operator(\)) operator({) + ident(result) operator(=) type(Math)operator(.)ident(log)operator(()ident(value) operator(+) type(Math)operator(.)ident(sqrt)operator(()ident(value) operator(*) ident(value) operator(-) float(1.0)operator(\))operator(\))operator(;) + operator(}) keyword(else)operator({) + ident(result) operator(=) float(0.69314718055994530941723212145818) operator(+) type(Math)operator(.)ident(log)operator(()ident(value)operator(\))operator(;) + operator(}) + + ident(domainCheck)operator(()ident(recv)operator(,) ident(result)operator(,) string<delimiter(")content(acosh)delimiter(")>operator(\))operator(;) + + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(double) ident(ASINH_COEF)type([]) operator(=) operator({) + operator(-)float(.12820039911738186343372127359268e+0)operator(,) + operator(-)float(.58811761189951767565211757138362e-1)operator(,) + float(.47274654322124815640725249756029e-2)operator(,) + operator(-)float(.49383631626536172101360174790273e-3)operator(,) + float(.58506207058557412287494835259321e-4)operator(,) + operator(-)float(.74669983289313681354755069217188e-5)operator(,) + float(.10011693583558199265966192015812e-5)operator(,) + operator(-)float(.13903543858708333608616472258886e-6)operator(,) + float(.19823169483172793547317360237148e-7)operator(,) + operator(-)float(.28847468417848843612747272800317e-8)operator(,) + float(.42672965467159937953457514995907e-9)operator(,) + operator(-)float(.63976084654366357868752632309681e-10)operator(,) + float(.96991686089064704147878293131179e-11)operator(,) + operator(-)float(.14844276972043770830246658365696e-11)operator(,) + float(.22903737939027447988040184378983e-12)operator(,) + operator(-)float(.35588395132732645159978942651310e-13)operator(,) + float(.55639694080056789953374539088554e-14)operator(,) + operator(-)float(.87462509599624678045666593520162e-15)operator(,) + float(.13815248844526692155868802298129e-15)operator(,) + operator(-)float(.21916688282900363984955142264149e-16)operator(,) + float(.34904658524827565638313923706880e-17) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(asinh)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(asinh)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(y) operator(=) type(Math)operator(.)ident(abs)operator(()ident(value)operator(\))operator(;) + type(double) ident(result)operator(;) + + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\))operator(\)) operator({) + ident(result) operator(=) type(Double)operator(.)ident(NaN)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<=) float(1.05367e-08)operator(\)) operator({) + ident(result) operator(=) ident(value)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<=) float(1.0)operator(\)) operator({) + ident(result) operator(=) ident(value) operator(*) operator(()float(1.0) operator(+) ident(chebylevSerie)operator(()float(2.0) operator(*) ident(value) operator(*) ident(value) operator(-) float(1.0)operator(,) ident(ASINH_COEF)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<) float(94906265.62)operator(\)) operator({) + ident(result) operator(=) type(Math)operator(.)ident(log)operator(()ident(value) operator(+) type(Math)operator(.)ident(sqrt)operator(()ident(value) operator(*) ident(value) operator(+) float(1.0)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result) operator(=) float(0.69314718055994530941723212145818) operator(+) type(Math)operator(.)ident(log)operator(()ident(y)operator(\))operator(;) + keyword(if) operator(()ident(value) operator(<) integer(0)operator(\)) ident(result) operator(*=) operator(-)integer(1)operator(;) + operator(}) + + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(double) ident(ATANH_COEF)type([]) operator(=) operator({) + float(.9439510239319549230842892218633e-1)operator(,) + float(.4919843705578615947200034576668e-1)operator(,) + float(.2102593522455432763479327331752e-2)operator(,) + float(.1073554449776116584640731045276e-3)operator(,) + float(.5978267249293031478642787517872e-5)operator(,) + float(.3505062030889134845966834886200e-6)operator(,) + float(.2126374343765340350896219314431e-7)operator(,) + float(.1321694535715527192129801723055e-8)operator(,) + float(.8365875501178070364623604052959e-10)operator(,) + float(.5370503749311002163881434587772e-11)operator(,) + float(.3486659470157107922971245784290e-12)operator(,) + float(.2284549509603433015524024119722e-13)operator(,) + float(.1508407105944793044874229067558e-14)operator(,) + float(.1002418816804109126136995722837e-15)operator(,) + float(.6698674738165069539715526882986e-17)operator(,) + float(.4497954546494931083083327624533e-18) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(atanh)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(atanh)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(y) operator(=) type(Math)operator(.)ident(abs)operator(()ident(value)operator(\))operator(;) + type(double) ident(result)operator(;) + + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(value)operator(\))operator(\)) operator({) + ident(result) operator(=) type(Double)operator(.)ident(NaN)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<) float(1.82501e-08)operator(\)) operator({) + ident(result) operator(=) ident(value)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<=) float(0.5)operator(\)) operator({) + ident(result) operator(=) ident(value) operator(*) operator(()float(1.0) operator(+) ident(chebylevSerie)operator(()float(8.0) operator(*) ident(value) operator(*) ident(value) operator(-) float(1.0)operator(,) ident(ATANH_COEF)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<) float(1.0)operator(\)) operator({) + ident(result) operator(=) float(0.5) operator(*) type(Math)operator(.)ident(log)operator(()operator(()float(1.0) operator(+) ident(value)operator(\)) operator(/) operator(()float(1.0) operator(-) ident(value)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(==) float(1.0)operator(\)) operator({) + ident(result) operator(=) ident(value) operator(*) type(Double)operator(.)ident(POSITIVE_INFINITY)operator(;) + operator(}) keyword(else) operator({) + ident(result) operator(=) type(Double)operator(.)ident(NaN)operator(;) + operator(}) + + ident(domainCheck)operator(()ident(recv)operator(,) ident(result)operator(,) string<delimiter(")content(atanh)delimiter(")>operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exp)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(exp)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(exponent)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(exponent)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)type(Math)operator(.)ident(exp)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + comment(/** Returns the natural logarithm of x. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(log)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(log)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(result) operator(=) type(Math)operator(.)ident(log)operator(()ident(value)operator(\))operator(;) + ident(domainCheck)operator(()ident(recv)operator(,) ident(result)operator(,) string<delimiter(")content(log)delimiter(")>operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + comment(/** Returns the base 10 logarithm of x. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(log10)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(log10)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(result) operator(=) type(Math)operator(.)ident(log)operator(()ident(value)operator(\)) operator(/) type(Math)operator(.)ident(log)operator(()integer(10)operator(\))operator(;) + ident(domainCheck)operator(()ident(recv)operator(,) ident(result)operator(,) string<delimiter(")content(log10)delimiter(")>operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sqrt)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(sqrt)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(result)operator(;) + + keyword(if) operator(()ident(value) operator(<) integer(0)operator(\)) operator({) + ident(result) operator(=) type(Double)operator(.)ident(NaN)operator(;) + operator(}) keyword(else)operator({) + ident(result) operator(=) type(Math)operator(.)ident(sqrt)operator(()ident(value)operator(\))operator(;) + operator(}) + + ident(domainCheck)operator(()ident(recv)operator(,) ident(result)operator(,) string<delimiter(")content(sqrt)delimiter(")>operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hypot)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(hypot)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + type(double) ident(valuea) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(valueb) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(y)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(result)operator(;) + + keyword(if) operator(()type(Math)operator(.)ident(abs)operator(()ident(valuea)operator(\)) operator(>) type(Math)operator(.)ident(abs)operator(()ident(valueb)operator(\))operator(\)) operator({) + ident(result) operator(=) ident(valueb) operator(/) ident(valuea)operator(;) + ident(result) operator(=) type(Math)operator(.)ident(abs)operator(()ident(valuea)operator(\)) operator(*) type(Math)operator(.)ident(sqrt)operator(()integer(1) operator(+) ident(result) operator(*) ident(result)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(valueb) operator(!=) integer(0)operator(\)) operator({) + ident(result) operator(=) ident(valuea) operator(/) ident(valueb)operator(;) + ident(result) operator(=) type(Math)operator(.)ident(abs)operator(()ident(valueb)operator(\)) operator(*) type(Math)operator(.)ident(sqrt)operator(()integer(1) operator(+) ident(result) operator(*) ident(result)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result) operator(=) integer(0)operator(;) + operator(}) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + + comment(/* + * x = mantissa * 2 ** exponent + * + * Where mantissa is in the range of [.5, 1\) + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(frexp)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(frexp)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + type(double) ident(mantissa) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(other)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(short) ident(sign) operator(=) integer(1)operator(;) + type(long) ident(exponent) operator(=) integer(0)operator(;) + + keyword(if) operator(()ident(mantissa) operator(!=) float(0.0)operator(\)) operator({) + comment(// Make mantissa same sign so we only have one code path.) + keyword(if) operator(()ident(mantissa) operator(<) integer(0)operator(\)) operator({) + ident(mantissa) operator(=) operator(-)ident(mantissa)operator(;) + ident(sign) operator(=) operator(-)integer(1)operator(;) + operator(}) + + comment(// Increase value to hit lower range.) + keyword(for) operator(()operator(;) ident(mantissa) operator(<) float(0.5)operator(;) ident(mantissa) operator(*=) float(2.0)operator(,) ident(exponent) operator(-=)integer(1)operator(\)) operator({) operator(}) + + comment(// Decrease value to hit upper range. ) + keyword(for) operator(()operator(;) ident(mantissa) operator(>=) float(1.0)operator(;) ident(mantissa) operator(*=) float(0.5)operator(,) ident(exponent) operator(+=)integer(1)operator(\)) operator({) operator(}) + operator(}) + + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) + ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(sign) operator(*) ident(mantissa)operator(\))operator(,) + ident(RubyNumeric)operator(.)ident(int2fix)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(exponent)operator(\))operator(\))operator(;) + operator(}) + + comment(/* + * r = x * 2 ** y + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ldexp)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(ldexp)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(mantissa)operator(,) ident(IRubyObject) ident(exponent)operator(\)) operator({) + type(double) ident(mantissaValue) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,) ident(mantissa)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(mantissaValue) operator(*) type(Math)operator(.)ident(pow)operator(()float(2.0)operator(,) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(exponent)operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(double) ident(ERFC_COEF)type([]) operator(=) operator({) + operator(-)float(.490461212346918080399845440334e-1)operator(,) + operator(-)float(.142261205103713642378247418996e0)operator(,) + float(.100355821875997955757546767129e-1)operator(,) + operator(-)float(.576876469976748476508270255092e-3)operator(,) + float(.274199312521960610344221607915e-4)operator(,) + operator(-)float(.110431755073445076041353812959e-5)operator(,) + float(.384887554203450369499613114982e-7)operator(,) + operator(-)float(.118085825338754669696317518016e-8)operator(,) + float(.323342158260509096464029309534e-10)operator(,) + operator(-)float(.799101594700454875816073747086e-12)operator(,) + float(.179907251139614556119672454866e-13)operator(,) + operator(-)float(.371863548781869263823168282095e-15)operator(,) + float(.710359900371425297116899083947e-17)operator(,) + operator(-)float(.126124551191552258324954248533e-18) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(erf)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(erf)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + + type(double) ident(result)operator(;) + type(double) ident(y) operator(=) type(Math)operator(.)ident(abs)operator(()ident(value)operator(\))operator(;) + + keyword(if) operator(()ident(y) operator(<=) float(1.49012e-08)operator(\)) operator({) + ident(result) operator(=) integer(2) operator(*) ident(value) operator(/) float(1.77245385090551602729816748334)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<=) integer(1)operator(\)) operator({) + ident(result) operator(=) ident(value) operator(*) operator(()integer(1) operator(+) ident(chebylevSerie)operator(()integer(2) operator(*) ident(value) operator(*) ident(value) operator(-) integer(1)operator(,) ident(ERFC_COEF)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<) float(6.013687357)operator(\)) operator({) + ident(result) operator(=) ident(sign)operator(()integer(1) operator(-) ident(erfc)operator(()ident(recv)operator(,) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(y)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result) operator(=) ident(sign)operator(()integer(1)operator(,) ident(value)operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(double) ident(ERFC2_COEF)type([]) operator(=) operator({) + operator(-)float(.69601346602309501127391508262e-1)operator(,) + operator(-)float(.411013393626208934898221208467e-1)operator(,) + float(.391449586668962688156114370524e-2)operator(,) + operator(-)float(.490639565054897916128093545077e-3)operator(,) + float(.715747900137703638076089414183e-4)operator(,) + operator(-)float(.115307163413123283380823284791e-4)operator(,) + float(.199467059020199763505231486771e-5)operator(,) + operator(-)float(.364266647159922287393611843071e-6)operator(,) + float(.694437261000501258993127721463e-7)operator(,) + operator(-)float(.137122090210436601953460514121e-7)operator(,) + float(.278838966100713713196386034809e-8)operator(,) + operator(-)float(.581416472433116155186479105032e-9)operator(,) + float(.123892049175275318118016881795e-9)operator(,) + operator(-)float(.269063914530674343239042493789e-10)operator(,) + float(.594261435084791098244470968384e-11)operator(,) + operator(-)float(.133238673575811957928775442057e-11)operator(,) + float(.30280468061771320171736972433e-12)operator(,) + operator(-)float(.696664881494103258879586758895e-13)operator(,) + float(.162085454105392296981289322763e-13)operator(,) + operator(-)float(.380993446525049199987691305773e-14)operator(,) + float(.904048781597883114936897101298e-15)operator(,) + operator(-)float(.2164006195089607347809812047e-15)operator(,) + float(.522210223399585498460798024417e-16)operator(,) + operator(-)float(.126972960236455533637241552778e-16)operator(,) + float(.310914550427619758383622741295e-17)operator(,) + operator(-)float(.766376292032038552400956671481e-18)operator(,) + float(.190081925136274520253692973329e-18) + operator(})operator(;) + + directive(private) directive(static) directive(final) type(double) ident(ERFCC_COEF)type([]) operator(=) operator({) + float(.715179310202924774503697709496e-1)operator(,) + operator(-)float(.265324343376067157558893386681e-1)operator(,) + float(.171115397792085588332699194606e-2)operator(,) + operator(-)float(.163751663458517884163746404749e-3)operator(,) + float(.198712935005520364995974806758e-4)operator(,) + operator(-)float(.284371241276655508750175183152e-5)operator(,) + float(.460616130896313036969379968464e-6)operator(,) + operator(-)float(.822775302587920842057766536366e-7)operator(,) + float(.159214187277090112989358340826e-7)operator(,) + operator(-)float(.329507136225284321486631665072e-8)operator(,) + float(.72234397604005554658126115389e-9)operator(,) + operator(-)float(.166485581339872959344695966886e-9)operator(,) + float(.401039258823766482077671768814e-10)operator(,) + operator(-)float(.100481621442573113272170176283e-10)operator(,) + float(.260827591330033380859341009439e-11)operator(,) + operator(-)float(.699111056040402486557697812476e-12)operator(,) + float(.192949233326170708624205749803e-12)operator(,) + operator(-)float(.547013118875433106490125085271e-13)operator(,) + float(.158966330976269744839084032762e-13)operator(,) + operator(-)float(.47268939801975548392036958429e-14)operator(,) + float(.14358733767849847867287399784e-14)operator(,) + operator(-)float(.444951056181735839417250062829e-15)operator(,) + float(.140481088476823343737305537466e-15)operator(,) + operator(-)float(.451381838776421089625963281623e-16)operator(,) + float(.147452154104513307787018713262e-16)operator(,) + operator(-)float(.489262140694577615436841552532e-17)operator(,) + float(.164761214141064673895301522827e-17)operator(,) + operator(-)float(.562681717632940809299928521323e-18)operator(,) + float(.194744338223207851429197867821e-18) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(erfc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(erfc)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + type(double) ident(value) operator(=) operator(()operator(()ident(RubyFloat)operator(\))ident(RubyKernel)operator(.)ident(new_float)operator(()ident(recv)operator(,)ident(x)operator(\))operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(double) ident(result)operator(;) + type(double) ident(y) operator(=) type(Math)operator(.)ident(abs)operator(()ident(value)operator(\))operator(;) + + keyword(if) operator(()ident(value) operator(<=) operator(-)float(6.013687357)operator(\)) operator({) + ident(result) operator(=) integer(2)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<) float(1.49012e-08)operator(\)) operator({) + ident(result) operator(=) integer(1) operator(-) integer(2) operator(*) ident(value) operator(/) float(1.77245385090551602729816748334)operator(;) + operator(}) keyword(else) operator({) + type(double) ident(ysq) operator(=) ident(y)operator(*)ident(y)operator(;) + keyword(if) operator(()ident(y) operator(<) integer(1)operator(\)) operator({) + ident(result) operator(=) integer(1) operator(-) ident(value) operator(*) operator(()integer(1) operator(+) ident(chebylevSerie)operator(()integer(2) operator(*) ident(ysq) operator(-) integer(1)operator(,) ident(ERFC_COEF)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(y) operator(<=) float(4.0)operator(\)) operator({) + ident(result) operator(=) type(Math)operator(.)ident(exp)operator(()operator(-)ident(ysq)operator(\))operator(/)ident(y)operator(*)operator(()float(0.5)operator(+)ident(chebylevSerie)operator(()operator(()float(8.0) operator(/) ident(ysq) operator(-) float(5.0)operator(\)) operator(/) float(3.0)operator(,) ident(ERFC2_COEF)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(value) operator(<) integer(0)operator(\)) ident(result) operator(=) float(2.0) operator(-) ident(result)operator(;) + keyword(if) operator(()ident(value) operator(<) integer(0)operator(\)) ident(result) operator(=) float(2.0) operator(-) ident(result)operator(;) + keyword(if) operator(()ident(value) operator(<) integer(0)operator(\)) ident(result) operator(=) float(2.0) operator(-) ident(result)operator(;) + operator(}) keyword(else) operator({) + ident(result) operator(=) type(Math)operator(.)ident(exp)operator(()operator(-)ident(ysq)operator(\)) operator(/) ident(y) operator(*) operator(()float(0.5) operator(+) ident(chebylevSerie)operator(()float(8.0) operator(/) ident(ysq) operator(-) integer(1)operator(,) ident(ERFCC_COEF)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(value) operator(<) integer(0)operator(\)) ident(result) operator(=) float(2.0) operator(-) ident(result)operator(;) + operator(}) + operator(}) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.exceptions.JumpException)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.DynamicMethod)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallbackFactory)operator(;) +keyword(import) include(org.jruby.runtime.MethodBlock)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * The RubyMethod class represents a RubyMethod object. + * + * You can get such a method by calling the "method" method of an object. + * + * Note: This was renamed from Method.java + * + * @author jpetersen + * @since 0.2.3 + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Method)delimiter(")>operator(\)) +directive(public) type(class) class(RubyMethod) directive(extends) ident(RubyObject) operator({) + directive(protected) ident(RubyModule) ident(implementationModule)operator(;) + directive(protected) type(String) ident(methodName)operator(;) + directive(protected) ident(RubyModule) ident(originModule)operator(;) + directive(protected) type(String) ident(originName)operator(;) + directive(protected) ident(DynamicMethod) ident(method)operator(;) + directive(protected) ident(IRubyObject) ident(receiver)operator(;) + + directive(protected) ident(RubyMethod)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + operator(}) + + comment(/** Create the RubyMethod class and add it to the Ruby runtime. + * + */) + directive(public) directive(static) ident(RubyClass) ident(createMethodClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + comment(// TODO: NOT_ALLOCATABLE_ALLOCATOR is probably ok here. Confirm. JRUBY-415) + ident(RubyClass) ident(methodClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Method)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setMethod)operator(()ident(methodClass)operator(\))operator(;) + + ident(methodClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyMethod)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(methodClass)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyMethod) ident(newMethod)operator(() + ident(RubyModule) ident(implementationModule)operator(,) + type(String) ident(methodName)operator(,) + ident(RubyModule) ident(originModule)operator(,) + type(String) ident(originName)operator(,) + ident(DynamicMethod) ident(method)operator(,) + ident(IRubyObject) ident(receiver)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(implementationModule)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyMethod) ident(newMethod) operator(=) keyword(new) ident(RubyMethod)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getMethod)operator(()operator(\))operator(\))operator(;) + + ident(newMethod)operator(.)ident(implementationModule) operator(=) ident(implementationModule)operator(;) + ident(newMethod)operator(.)ident(methodName) operator(=) ident(methodName)operator(;) + ident(newMethod)operator(.)ident(originModule) operator(=) ident(originModule)operator(;) + ident(newMethod)operator(.)ident(originName) operator(=) ident(originName)operator(;) + ident(newMethod)operator(.)ident(method) operator(=) ident(method)operator(.)ident(getRealMethod)operator(()operator(\))operator(;) + ident(newMethod)operator(.)ident(receiver) operator(=) ident(receiver)operator(;) + + keyword(return) ident(newMethod)operator(;) + operator(}) + + comment(/** Call the method. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(call)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(receiver)operator(,) ident(implementationModule)operator(,) ident(methodName)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(call)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(receiver)operator(,) ident(implementationModule)operator(,) ident(methodName)operator(,) ident(arg)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(call)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(receiver)operator(,) ident(implementationModule)operator(,) ident(methodName)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(call)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(receiver)operator(,) ident(implementationModule)operator(,) ident(methodName)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(call)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(method)operator(.)ident(call)operator(()ident(context)operator(,) ident(receiver)operator(,) ident(implementationModule)operator(,) ident(methodName)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** Returns the number of arguments a method accepted. + * + * @return the number of arguments of a method. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(arity)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(arity)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(method)operator(.)ident(getArity)operator(()operator(\))operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(RubyBoolean) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyMethod)operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + ident(RubyMethod) ident(otherMethod) operator(=) operator(()ident(RubyMethod)operator(\))ident(other)operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(implementationModule) operator(==) ident(otherMethod)operator(.)ident(implementationModule) operator(&&) + ident(originModule) operator(==) ident(otherMethod)operator(.)ident(originModule) operator(&&) + ident(receiver) operator(==) ident(otherMethod)operator(.)ident(receiver) operator(&&) + ident(method)operator(.)ident(getRealMethod)operator(()operator(\)) operator(==) ident(otherMethod)operator(.)ident(method)operator(.)ident(getRealMethod)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(clone)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyMethod) ident(rbClone)operator(()operator(\)) operator({) + keyword(return) ident(newMethod)operator(()ident(implementationModule)operator(,) ident(methodName)operator(,) ident(originModule)operator(,) ident(originName)operator(,) ident(method)operator(,) ident(receiver)operator(\))operator(;) + operator(}) + + comment(/** Create a Proc object. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_proc)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(to_proc)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(CallbackFactory) ident(f) operator(=) ident(runtime)operator(.)ident(callbackFactory)operator(()ident(RubyMethod)operator(.)ident(class)operator(\))operator(;) + ident(Block) ident(block) operator(=) ident(MethodBlock)operator(.)ident(createMethodBlock)operator(()ident(context)operator(,) ident(context)operator(.)ident(getCurrentScope)operator(()operator(\))operator(,) + ident(f)operator(.)ident(getBlockMethod)operator(()string<delimiter(")content(bmcall)delimiter(")>operator(\))operator(,) local_variable(this)operator(,) ident(runtime)operator(.)ident(getTopSelf)operator(()operator(\))operator(\))operator(;) + + keyword(while) operator(()keyword(true)operator(\)) operator({) + keyword(try) operator({) + comment(// FIXME: We should not be regenerating this over and over) + keyword(return) ident(mproc)operator(()ident(context)operator(,) ident(block)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(BreakJump) ident(bj)operator(\)) operator({) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(bj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(rj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(RetryJump) ident(rj)operator(\)) operator({) + comment(// Execute iterateMethod again.) + operator(}) + operator(}) + operator(}) + + comment(/** Create a Proc object which is called like a ruby method. + * + * Used by the RubyMethod#to_proc method. + * + */) + directive(private) ident(IRubyObject) ident(mproc)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(try) operator({) + ident(context)operator(.)ident(preMproc)operator(()operator(\))operator(;) + + keyword(return) ident(RubyKernel)operator(.)ident(proc)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(,) ident(block)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(postMproc)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** Delegate a block call to a bound method call. + * + * Used by the RubyMethod#to_proc method. + * + */) + directive(public) directive(static) ident(IRubyObject) ident(bmcall)operator(()ident(IRubyObject) ident(blockArg)operator(,) ident(IRubyObject) ident(arg1)operator(,) + ident(IRubyObject) ident(self)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(blockArg)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(blockArg) keyword(instanceof) ident(RubyArray)operator(\)) operator({) + comment(// ENEBO: Very wrong) + keyword(return) operator(()operator(()ident(RubyMethod)operator(\)) ident(arg1)operator(\))operator(.)ident(call)operator(()ident(context)operator(,) operator(()operator(()ident(RubyArray)operator(\)) ident(blockArg)operator(\))operator(.)ident(toJavaArray)operator(()operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + comment(// ENEBO: Very wrong) + keyword(return) operator(()operator(()ident(RubyMethod)operator(\)) ident(arg1)operator(\))operator(.)ident(call)operator(()ident(context)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(blockArg) operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(unbind)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyUnboundMethod) ident(unbind)operator(()ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(RubyUnboundMethod) ident(unboundMethod) operator(=) + ident(RubyUnboundMethod)operator(.)ident(newUnboundMethod)operator(()ident(implementationModule)operator(,) ident(methodName)operator(,) ident(originModule)operator(,) ident(originName)operator(,) ident(method)operator(\))operator(;) + ident(unboundMethod)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + + keyword(return) ident(unboundMethod)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(inspect)delimiter(")>operator(,) string<delimiter(")content(to_s)delimiter(")>operator(})operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + type(StringBuilder) ident(buf) operator(=) keyword(new) type(StringBuilder)operator(()string<delimiter(")content(#<)delimiter(")>operator(\))operator(;) + type(char) ident(delimeter) operator(=) string<delimiter(')content(#)delimiter(')>operator(;) + + ident(buf)operator(.)ident(append)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(: )delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(implementationModule)operator(.)ident(isSingleton)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(attached) operator(=) operator(()operator(()ident(MetaClass)operator(\)) ident(implementationModule)operator(\))operator(.)ident(getAttached)operator(()operator(\))operator(;) + keyword(if) operator(()ident(receiver) operator(==) keyword(null)operator(\)) operator({) + ident(buf)operator(.)ident(append)operator(()ident(implementationModule)operator(.)ident(inspect)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(receiver) operator(==) ident(attached)operator(\)) operator({) + ident(buf)operator(.)ident(append)operator(()ident(attached)operator(.)ident(inspect)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(delimeter) operator(=) string<delimiter(')content(.)delimiter(')>operator(;) + operator(}) keyword(else) operator({) + ident(buf)operator(.)ident(append)operator(()ident(receiver)operator(.)ident(inspect)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(buf)operator(.)ident(append)operator(()string<delimiter(')content(()delimiter(')>operator(\))operator(.)ident(append)operator(()ident(attached)operator(.)ident(inspect)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(')content(\))delimiter(')>operator(\))operator(;) + ident(delimeter) operator(=) string<delimiter(')content(.)delimiter(')>operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(buf)operator(.)ident(append)operator(()ident(originModule)operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(implementationModule) operator(!=) ident(originModule)operator(\)) operator({) + ident(buf)operator(.)ident(append)operator(()string<delimiter(')content(()delimiter(')>operator(\))operator(.)ident(append)operator(()ident(implementationModule)operator(.)ident(getName)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(')content(\))delimiter(')>operator(\))operator(;) + operator(}) + operator(}) + + ident(buf)operator(.)ident(append)operator(()ident(delimeter)operator(\))operator(.)ident(append)operator(()ident(methodName)operator(\))operator(.)ident(append)operator(()string<delimiter(')content(>)delimiter(')>operator(\))operator(;) + + ident(RubyString) ident(str) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buf)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(setTaint)operator(()ident(isTaint)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) +operator(}) + +comment(/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006-2007 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2007 William N Dortch <bill.dortch@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.lang.reflect.Field)operator(;) +keyword(import) include(java.lang.reflect.Method)operator(;) +keyword(import) include(java.lang.reflect.Modifier)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.Collections)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.Iterator)operator(;) +keyword(import) include(java.util.HashSet)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(java.util.Set)operator(;) +keyword(import) include(java.util.concurrent.ConcurrentHashMap)operator(;) +keyword(import) include(java.util.concurrent.locks.ReentrantLock)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyConstant)operator(;) +keyword(import) include(org.jruby.anno.JavaMethodDescriptor)operator(;) +keyword(import) include(org.jruby.anno.TypePopulator)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.compiler.ASTInspector)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.AliasMethod)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.DynamicMethod)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.FullFunctionCallbackMethod)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.SimpleCallbackMethod)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.MethodMethod)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.ProcMethod)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.UndefinedMethod)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.WrapperMethod)operator(;) +keyword(import) include(org.jruby.parser.StaticScope)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CacheMap)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(static) include(org.jruby.runtime.Visibility)operator(.)operator(*)operator(;) +keyword(import) include(static) include(org.jruby.anno.FrameField)operator(.)operator(*)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.builtin.Variable)operator(;) +keyword(import) include(org.jruby.runtime.callback.Callback)operator(;) +keyword(import) include(org.jruby.runtime.component.VariableEntry)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.ClassProvider)operator(;) +keyword(import) include(org.jruby.util.IdUtil)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.JavaMethod)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.MethodFactory)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) + +comment(/** + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Module)delimiter(")>operator(\)) +directive(public) type(class) class(RubyModule) directive(extends) ident(RubyObject) operator({) + directive(private) directive(static) directive(final) type(boolean) ident(DEBUG) operator(=) keyword(false)operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createModuleClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(moduleClass)operator(\)) operator({) + ident(moduleClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(MODULE)operator(;) + ident(moduleClass)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyModule)operator(;) + operator(}) + operator(})operator(;) + + ident(moduleClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyModule)operator(.)ident(class)operator(\))operator(;) + ident(moduleClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(ModuleKernelMethods)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(moduleClass)operator(;) + operator(}) + + directive(public) directive(static) type(class) class(ModuleKernelMethods) operator({) + annotation(@JRubyMethod) + directive(public) directive(static) ident(IRubyObject) ident(autoload)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(return) ident(RubyKernel)operator(.)ident(autoload)operator(()ident(recv)operator(,) ident(arg0)operator(,) ident(arg1)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(autoload?)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(autoload_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(RubyKernel)operator(.)ident(autoload_p)operator(()ident(context)operator(,) ident(recv)operator(,) ident(arg0)operator(\))operator(;) + operator(}) + operator(}) + + directive(static) ident(ObjectAllocator) ident(MODULE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyModule)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(MODULE)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isModule)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isClass)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) type(boolean) ident(isSingleton)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + comment(// superClass may be null.) + directive(protected) ident(RubyClass) ident(superClass)operator(;) + + directive(public) type(int) ident(index)operator(;) + + directive(public) directive(static) type(class) class(KindOf) operator({) + directive(public) directive(static) directive(final) ident(KindOf) ident(DEFAULT_KIND_OF) operator(=) keyword(new) ident(KindOf)operator(()operator(\))operator(;) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(hasModuleInHierarchy)operator(()ident(type)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(boolean) ident(isInstance)operator(()ident(IRubyObject) ident(object)operator(\)) operator({) + keyword(return) ident(kindOf)operator(.)ident(isKindOf)operator(()ident(object)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) ident(KindOf) ident(kindOf) operator(=) ident(KindOf)operator(.)ident(DEFAULT_KIND_OF)operator(;) + + directive(public) directive(final) type(int) ident(id)operator(;) + + comment(// Containing class...The parent of Object is null. Object should always be last in chain.) + directive(public) ident(RubyModule) ident(parent)operator(;) + + comment(// ClassId is the name of the class/module sans where it is located.) + comment(// If it is null, then it an anonymous class.) + directive(protected) type(String) ident(classId)operator(;) + + + comment(// CONSTANT TABLE) + + comment(// Lock used for variableTable/constantTable writes. The RubyObject variableTable) + comment(// write methods are overridden here to use this lock rather than Java) + comment(// synchronization for faster concurrent writes for modules/classes.) + directive(protected) directive(final) type(ReentrantLock) ident(variableWriteLock) operator(=) keyword(new) type(ReentrantLock)operator(()operator(\))operator(;) + + directive(protected) directive(transient) directive(volatile) ident(ConstantTableEntry)type([]) ident(constantTable) operator(=) + keyword(new) ident(ConstantTableEntry)operator([)ident(CONSTANT_TABLE_DEFAULT_CAPACITY)operator(])operator(;) + + directive(protected) directive(transient) type(int) ident(constantTableSize)operator(;) + + directive(protected) directive(transient) type(int) ident(constantTableThreshold) operator(=) + operator(()type(int)operator(\))operator(()ident(CONSTANT_TABLE_DEFAULT_CAPACITY) operator(*) ident(CONSTANT_TABLE_LOAD_FACTOR)operator(\))operator(;) + + directive(private) directive(final) type(Map)operator(<)type(String)operator(,) ident(DynamicMethod)operator(>) ident(methods) operator(=) keyword(new) type(ConcurrentHashMap)operator(<)type(String)operator(,) ident(DynamicMethod)operator(>)operator(()integer(12)operator(,) float(0.75f)operator(,) integer(1)operator(\))operator(;) + + comment(// ClassProviders return Java class/module (in #defineOrGetClassUnder and) + comment(// #defineOrGetModuleUnder\) when class/module is opened using colon syntax. ) + directive(private) directive(transient) type(List)operator(<)ident(ClassProvider)operator(>) ident(classProviders)operator(;) + + comment(/** separate path for MetaClass construction + * + */) + directive(protected) ident(RubyModule)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(metaClass)operator(,) type(boolean) ident(objectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(metaClass)operator(,) ident(objectSpace)operator(\))operator(;) + ident(id) operator(=) ident(runtime)operator(.)ident(allocModuleId)operator(()operator(\))operator(;) + comment(// if (parent == null\) parent = runtime.getObject(\);) + ident(setFlag)operator(()ident(USER7_F)operator(,) operator(!)ident(isClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** used by MODULE_ALLOCATOR and RubyClass constructors + * + */) + directive(protected) ident(RubyModule)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(metaClass)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) ident(metaClass)operator(,) ident(runtime)operator(.)ident(isObjectSpaceEnabled)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** standard path for Module construction + * + */) + directive(protected) ident(RubyModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getModule)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(needsImplementer)operator(()operator(\)) operator({) + keyword(return) ident(getFlag)operator(()ident(USER7_F)operator(\))operator(;) + operator(}) + + comment(/** rb_module_new + * + */) + directive(public) directive(static) ident(RubyModule) ident(newModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyModule)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + comment(/** rb_module_new/rb_define_module_id/rb_name_class/rb_set_class_path + * + */) + directive(public) directive(static) ident(RubyModule) ident(newModule)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(,) ident(RubyModule) ident(parent)operator(,) type(boolean) ident(setParent)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) ident(newModule)operator(()ident(runtime)operator(\))operator(;) + ident(module)operator(.)ident(setBaseName)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(setParent)operator(\)) ident(module)operator(.)ident(setParent)operator(()ident(parent)operator(\))operator(;) + ident(parent)operator(.)ident(setConstant)operator(()ident(name)operator(,) ident(module)operator(\))operator(;) + keyword(return) ident(module)operator(;) + operator(}) + + comment(// synchronized method per JRUBY-1173 (unsafe Double-Checked Locking\)) + comment(// FIXME: synchronization is still wrong in CP code) + directive(public) directive(synchronized) type(void) ident(addClassProvider)operator(()ident(ClassProvider) ident(provider)operator(\)) operator({) + keyword(if) operator(()ident(classProviders) operator(==) keyword(null)operator(\)) operator({) + type(List)operator(<)ident(ClassProvider)operator(>) ident(cp) operator(=) type(Collections)operator(.)ident(synchronizedList)operator(()keyword(new) type(ArrayList)operator(<)ident(ClassProvider)operator(>)operator(()operator(\))operator(\))operator(;) + ident(cp)operator(.)ident(add)operator(()ident(provider)operator(\))operator(;) + ident(classProviders) operator(=) ident(cp)operator(;) + operator(}) keyword(else) operator({) + directive(synchronized)operator(()ident(classProviders)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(classProviders)operator(.)ident(contains)operator(()ident(provider)operator(\))operator(\)) operator({) + ident(classProviders)operator(.)ident(add)operator(()ident(provider)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + + directive(public) type(void) ident(removeClassProvider)operator(()ident(ClassProvider) ident(provider)operator(\)) operator({) + keyword(if) operator(()ident(classProviders) operator(!=) keyword(null)operator(\)) operator({) + ident(classProviders)operator(.)ident(remove)operator(()ident(provider)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(RubyClass) ident(searchProvidersForClass)operator(()type(String) ident(name)operator(,) ident(RubyClass) ident(superClazz)operator(\)) operator({) + keyword(if) operator(()ident(classProviders) operator(!=) keyword(null)operator(\)) operator({) + directive(synchronized)operator(()ident(classProviders)operator(\)) operator({) + ident(RubyClass) ident(clazz)operator(;) + keyword(for) operator(()ident(ClassProvider) ident(classProvider)operator(:) ident(classProviders)operator(\)) operator({) + keyword(if) operator(()operator(()ident(clazz) operator(=) ident(classProvider)operator(.)ident(defineClassUnder)operator(()local_variable(this)operator(,) ident(name)operator(,) ident(superClazz)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(clazz)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(private) ident(RubyModule) ident(searchProvidersForModule)operator(()type(String) ident(name)operator(\)) operator({) + keyword(if) operator(()ident(classProviders) operator(!=) keyword(null)operator(\)) operator({) + directive(synchronized)operator(()ident(classProviders)operator(\)) operator({) + ident(RubyModule) ident(module)operator(;) + keyword(for) operator(()ident(ClassProvider) ident(classProvider)operator(:) ident(classProviders)operator(\)) operator({) + keyword(if) operator(()operator(()ident(module) operator(=) ident(classProvider)operator(.)ident(defineModuleUnder)operator(()local_variable(this)operator(,) ident(name)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(module)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** Getter for property superClass. + * @return Value of property superClass. + */) + directive(public) ident(RubyClass) ident(getSuperClass)operator(()operator(\)) operator({) + keyword(return) ident(superClass)operator(;) + operator(}) + + directive(protected) type(void) ident(setSuperClass)operator(()ident(RubyClass) ident(superClass)operator(\)) operator({) + local_variable(this)operator(.)ident(superClass) operator(=) ident(superClass)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getParent)operator(()operator(\)) operator({) + keyword(return) ident(parent)operator(;) + operator(}) + + directive(public) type(void) ident(setParent)operator(()ident(RubyModule) ident(parent)operator(\)) operator({) + local_variable(this)operator(.)ident(parent) operator(=) ident(parent)operator(;) + operator(}) + + directive(public) type(Map)operator(<)type(String)operator(,) ident(DynamicMethod)operator(>) ident(getMethods)operator(()operator(\)) operator({) + keyword(return) ident(methods)operator(;) + operator(}) + + + comment(// note that addMethod now does its own put, so any change made to) + comment(// functionality here should be made there as well ) + directive(private) type(void) ident(putMethod)operator(()type(String) ident(name)operator(,) ident(DynamicMethod) ident(method)operator(\)) operator({) + ident(getMethods)operator(()operator(\))operator(.)ident(put)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + operator(}) + + comment(/** + * Is this module one that in an included one (e.g. an IncludedModuleWrapper\). + */) + directive(public) type(boolean) ident(isIncluded)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) ident(RubyModule) ident(getNonIncludedClass)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) type(String) ident(getBaseName)operator(()operator(\)) operator({) + keyword(return) ident(classId)operator(;) + operator(}) + + directive(public) type(void) ident(setBaseName)operator(()type(String) ident(name)operator(\)) operator({) + ident(classId) operator(=) ident(name)operator(;) + operator(}) + + directive(private) directive(volatile) type(String) ident(bareName)operator(;) + directive(private) directive(volatile) type(String) ident(fullName)operator(;) + + comment(/** + * Generate a fully-qualified class name or a #-style name for anonymous and singleton classes. + * + * Ruby C equivalent = "classname" + * + * @return The generated class name + */) + directive(public) type(String) ident(getName)operator(()operator(\)) operator({) + keyword(if) operator(()ident(fullName) operator(==) keyword(null)operator(\)) operator({) + ident(fullName) operator(=) ident(calculateFullName)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(fullName)operator(;) + operator(}) + + directive(private) type(String) ident(calculateFullName)operator(()operator(\)) operator({) + keyword(if) operator(()ident(getBaseName)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(bareName) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(isClass)operator(()operator(\))operator(\)) operator({) + ident(bareName) operator(=) string<delimiter(")content(#<)delimiter(")> operator(+) string<delimiter(")content(Class)delimiter(")> operator(+) string<delimiter(")content(:01x)delimiter(")> operator(+) type(Integer)operator(.)ident(toHexString)operator(()type(System)operator(.)ident(identityHashCode)operator(()local_variable(this)operator(\))operator(\)) operator(+) string<delimiter(")content(>)delimiter(")>operator(;) + operator(}) keyword(else) operator({) + ident(bareName) operator(=) string<delimiter(")content(#<)delimiter(")> operator(+) string<delimiter(")content(Module)delimiter(")> operator(+) string<delimiter(")content(:01x)delimiter(")> operator(+) type(Integer)operator(.)ident(toHexString)operator(()type(System)operator(.)ident(identityHashCode)operator(()local_variable(this)operator(\))operator(\)) operator(+) string<delimiter(")content(>)delimiter(")>operator(;) + operator(}) + operator(}) + + keyword(return) ident(bareName)operator(;) + operator(}) + + type(String) ident(result) operator(=) ident(getBaseName)operator(()operator(\))operator(;) + ident(RubyClass) ident(objectClass) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) local_variable(this)operator(.)ident(getParent)operator(()operator(\))operator(;) ident(p) operator(!=) keyword(null) operator(&&) ident(p) operator(!=) ident(objectClass)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getParent)operator(()operator(\))operator(\)) operator({) + type(String) ident(pName) operator(=) ident(p)operator(.)ident(getBaseName)operator(()operator(\))operator(;) + comment(// This is needed when the enclosing class or module is a singleton.) + comment(// In that case, we generated a name such as null::Foo, which broke ) + comment(// Marshalling, among others. The correct thing to do in this situation ) + comment(// is to insert the generate the name of form #<Class:01xasdfasd> if ) + comment(// it's a singleton module/class, which this code accomplishes.) + keyword(if)operator(()ident(pName) operator(==) keyword(null)operator(\)) operator({) + ident(pName) operator(=) ident(p)operator(.)ident(getName)operator(()operator(\))operator(;) + operator(}) + ident(result) operator(=) ident(pName) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(result)operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** + * Create a wrapper to use for including the specified module into this one. + * + * Ruby C equivalent = "include_class_new" + * + * @return The module wrapper + */) + directive(public) ident(IncludedModuleWrapper) ident(newIncludeClass)operator(()ident(RubyClass) ident(superClazz)operator(\)) operator({) + ident(IncludedModuleWrapper) ident(includedModule) operator(=) keyword(new) ident(IncludedModuleWrapper)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(superClazz)operator(,) local_variable(this)operator(\))operator(;) + + comment(// include its parent (and in turn that module's parents\)) + keyword(if) operator(()ident(getSuperClass)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(includedModule)operator(.)ident(includeModule)operator(()ident(getSuperClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(includedModule)operator(;) + operator(}) + comment(/** + * Finds a class that is within the current module (or class\). + * + * @param name to be found in this module (or class\) + * @return the class or null if no such class + */) + directive(public) ident(RubyClass) ident(getClass)operator(()type(String) ident(name)operator(\)) operator({) + ident(IRubyObject) ident(module)operator(;) + keyword(if) operator(()operator(()ident(module) operator(=) ident(getConstantAt)operator(()ident(name)operator(\))operator(\)) keyword(instanceof) ident(RubyClass)operator(\)) operator({) + keyword(return) operator(()ident(RubyClass)operator(\))ident(module)operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(public) ident(RubyClass) ident(fastGetClass)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(IRubyObject) ident(module)operator(;) + keyword(if) operator(()operator(()ident(module) operator(=) ident(fastGetConstantAt)operator(()ident(internedName)operator(\))operator(\)) keyword(instanceof) ident(RubyClass)operator(\)) operator({) + keyword(return) operator(()ident(RubyClass)operator(\))ident(module)operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** + * Include a new module in this module or class. + * + * @param arg The module to include + */) + directive(public) directive(synchronized) type(void) ident(includeModule)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(assert) ident(arg) operator(!=) keyword(null)operator(;) + + ident(testFrozen)operator(()string<delimiter(")content(module)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)operator(()ident(arg) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Wrong argument type )delimiter(")> operator(+) ident(arg)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) + string<delimiter(")content( (expected Module\).)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyModule) ident(module) operator(=) operator(()ident(RubyModule)operator(\)) ident(arg)operator(;) + + comment(// Make sure the module we include does not already exist) + keyword(if) operator(()ident(isSame)operator(()ident(module)operator(\))operator(\)) operator({) + keyword(return)operator(;) + operator(}) + + ident(infectBy)operator(()ident(module)operator(\))operator(;) + + ident(doIncludeModule)operator(()ident(module)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(defineMethod)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + type(Visibility) ident(visibility) operator(=) ident(name)operator(.)ident(equals)operator(()string<delimiter(")content(initialize)delimiter(")>operator(\)) operator(?) + ident(PRIVATE) operator(:) ident(PUBLIC)operator(;) + ident(addMethod)operator(()ident(name)operator(,) keyword(new) ident(FullFunctionCallbackMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(visibility)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(defineAnnotatedMethod)operator(()type(Class) ident(clazz)operator(,) type(String) ident(name)operator(\)) operator({) + comment(// FIXME: This is probably not very efficient, since it loads all methods for each call) + type(boolean) ident(foundMethod) operator(=) keyword(false)operator(;) + keyword(for) operator(()type(Method) ident(method) operator(:) ident(clazz)operator(.)ident(getDeclaredMethods)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(method)operator(.)ident(getName)operator(()operator(\))operator(.)ident(equals)operator(()ident(name)operator(\)) operator(&&) ident(defineAnnotatedMethod)operator(()ident(method)operator(,) ident(MethodFactory)operator(.)ident(createFactory)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getJRubyClassLoader)operator(()operator(\))operator(\))operator(\))operator(\)) operator({) + ident(foundMethod) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()operator(!)ident(foundMethod)operator(\)) operator({) + keyword(throw) keyword(new) type(RuntimeException)operator(()string<delimiter(")content(No JRubyMethod present for method )delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(on class )delimiter(")> operator(+) ident(clazz)operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(defineAnnotatedConstants)operator(()type(Class) ident(clazz)operator(\)) operator({) + type(Field)type([]) ident(declaredFields) operator(=) ident(clazz)operator(.)ident(getDeclaredFields)operator(()operator(\))operator(;) + keyword(for) operator(()type(Field) ident(field) operator(:) ident(declaredFields)operator(\)) operator({) + keyword(if)operator(()type(Modifier)operator(.)ident(isStatic)operator(()ident(field)operator(.)ident(getModifiers)operator(()operator(\))operator(\))operator(\)) operator({) + ident(defineAnnotatedConstant)operator(()ident(field)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + directive(public) type(boolean) ident(defineAnnotatedConstant)operator(()type(Field) ident(field)operator(\)) operator({) + ident(JRubyConstant) ident(jrubyConstant) operator(=) ident(field)operator(.)ident(getAnnotation)operator(()ident(JRubyConstant)operator(.)ident(class)operator(\))operator(;) + + keyword(if) operator(()ident(jrubyConstant) operator(==) keyword(null)operator(\)) keyword(return) keyword(false)operator(;) + + type(String)type([]) ident(names) operator(=) ident(jrubyConstant)operator(.)ident(value)operator(()operator(\))operator(;) + keyword(if)operator(()ident(names)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(names) operator(=) keyword(new) type(String)type([])operator({)ident(field)operator(.)ident(getName)operator(()operator(\))operator(})operator(;) + operator(}) + + type(Class) ident(tp) operator(=) ident(field)operator(.)ident(getType)operator(()operator(\))operator(;) + ident(IRubyObject) ident(realVal)operator(;) + + keyword(try) operator({) + keyword(if)operator(()ident(tp) operator(==) type(Integer)operator(.)ident(class) operator(||) ident(tp) operator(==) type(Integer)operator(.)ident(TYPE) operator(||) ident(tp) operator(==) type(Short)operator(.)ident(class) operator(||) ident(tp) operator(==) type(Short)operator(.)ident(TYPE) operator(||) ident(tp) operator(==) type(Byte)operator(.)ident(class) operator(||) ident(tp) operator(==) type(Byte)operator(.)ident(TYPE)operator(\)) operator({) + ident(realVal) operator(=) ident(RubyNumeric)operator(.)ident(int2fix)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(field)operator(.)ident(getInt)operator(()keyword(null)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(tp) operator(==) type(Boolean)operator(.)ident(class) operator(||) ident(tp) operator(==) type(Boolean)operator(.)ident(TYPE)operator(\)) operator({) + ident(realVal) operator(=) ident(field)operator(.)ident(getBoolean)operator(()keyword(null)operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(realVal) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(catch)operator(()type(Exception) ident(e)operator(\)) operator({) + ident(realVal) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + + keyword(for)operator(()type(String) ident(name) operator(:) ident(names)operator(\)) operator({) + local_variable(this)operator(.)ident(fastSetConstant)operator(()ident(name)operator(,) ident(realVal)operator(\))operator(;) + operator(}) + + keyword(return) keyword(true)operator(;) + operator(}) + + directive(public) type(void) ident(defineAnnotatedMethods)operator(()type(Class) ident(clazz)operator(\)) operator({) + ident(defineAnnotatedMethodsIndividually)operator(()ident(clazz)operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(class) class(MethodClumper) operator({) + type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(annotatedMethods) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>)operator(()operator(\))operator(;) + type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(staticAnnotatedMethods) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>)operator(()operator(\))operator(;) + type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(annotatedMethods1_8) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>)operator(()operator(\))operator(;) + type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(staticAnnotatedMethods1_8) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>)operator(()operator(\))operator(;) + type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(annotatedMethods1_9) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>)operator(()operator(\))operator(;) + type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(staticAnnotatedMethods1_9) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>)operator(()operator(\))operator(;) + + directive(public) type(void) ident(clump)operator(()type(Class) ident(cls)operator(\)) operator({) + type(Method)type([]) ident(declaredMethods) operator(=) ident(cls)operator(.)ident(getDeclaredMethods)operator(()operator(\))operator(;) + keyword(for) operator(()type(Method) ident(method)operator(:) ident(declaredMethods)operator(\)) operator({) + ident(JRubyMethod) ident(anno) operator(=) ident(method)operator(.)ident(getAnnotation)operator(()ident(JRubyMethod)operator(.)ident(class)operator(\))operator(;) + keyword(if) operator(()ident(anno) operator(==) keyword(null)operator(\)) keyword(continue)operator(;) + + ident(JavaMethodDescriptor) ident(desc) operator(=) keyword(new) ident(JavaMethodDescriptor)operator(()ident(method)operator(\))operator(;) + + type(String) ident(name) operator(=) ident(anno)operator(.)ident(name)operator(()operator(\))operator(.)ident(length) operator(==) integer(0) operator(?) ident(method)operator(.)ident(getName)operator(()operator(\)) operator(:) ident(anno)operator(.)ident(name)operator(()operator(\))operator([)integer(0)operator(])operator(;) + + type(List)operator(<)ident(JavaMethodDescriptor)operator(>) ident(methodDescs)operator(;) + type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(methodsHash) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(desc)operator(.)ident(isStatic)operator(\)) operator({) + keyword(if) operator(()ident(anno)operator(.)ident(compat)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(RUBY1_8)operator(\)) operator({) + ident(methodsHash) operator(=) ident(staticAnnotatedMethods1_8)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(anno)operator(.)ident(compat)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) operator({) + ident(methodsHash) operator(=) ident(staticAnnotatedMethods1_9)operator(;) + operator(}) keyword(else) operator({) + ident(methodsHash) operator(=) ident(staticAnnotatedMethods)operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(anno)operator(.)ident(compat)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(RUBY1_8)operator(\)) operator({) + ident(methodsHash) operator(=) ident(annotatedMethods1_8)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(anno)operator(.)ident(compat)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) operator({) + ident(methodsHash) operator(=) ident(annotatedMethods1_9)operator(;) + operator(}) keyword(else) operator({) + ident(methodsHash) operator(=) ident(annotatedMethods)operator(;) + operator(}) + operator(}) + + ident(methodDescs) operator(=) ident(methodsHash)operator(.)ident(get)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(methodDescs) operator(==) keyword(null)operator(\)) operator({) + ident(methodDescs) operator(=) keyword(new) type(ArrayList)operator(<)ident(JavaMethodDescriptor)operator(>)operator(()operator(\))operator(;) + ident(methodsHash)operator(.)ident(put)operator(()ident(name)operator(,) ident(methodDescs)operator(\))operator(;) + operator(}) + + ident(methodDescs)operator(.)ident(add)operator(()ident(desc)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(getAnnotatedMethods)operator(()operator(\)) operator({) + keyword(return) ident(annotatedMethods)operator(;) + operator(}) + + directive(public) type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(getAnnotatedMethods1_8)operator(()operator(\)) operator({) + keyword(return) ident(annotatedMethods1_8)operator(;) + operator(}) + + directive(public) type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(getAnnotatedMethods1_9)operator(()operator(\)) operator({) + keyword(return) ident(annotatedMethods1_9)operator(;) + operator(}) + + directive(public) type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(getStaticAnnotatedMethods)operator(()operator(\)) operator({) + keyword(return) ident(staticAnnotatedMethods)operator(;) + operator(}) + + directive(public) type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(getStaticAnnotatedMethods1_8)operator(()operator(\)) operator({) + keyword(return) ident(staticAnnotatedMethods1_8)operator(;) + operator(}) + + directive(public) type(Map)operator(<)type(String)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>)operator(>) ident(getStaticAnnotatedMethods1_9)operator(()operator(\)) operator({) + keyword(return) ident(staticAnnotatedMethods1_9)operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(defineAnnotatedMethodsIndividually)operator(()type(Class) ident(clazz)operator(\)) operator({) + type(String) ident(x) operator(=) ident(clazz)operator(.)ident(getSimpleName)operator(()operator(\))operator(;) + ident(TypePopulator) ident(populator) operator(=) keyword(null)operator(;) + + keyword(if) operator(()ident(RubyInstanceConfig)operator(.)ident(FULL_TRACE_ENABLED)operator(\)) operator({) + comment(// we need full traces, use default (slow\) populator) + keyword(if) operator(()ident(DEBUG)operator(\)) type(System)operator(.)ident(out)operator(.)ident(println)operator(()string<delimiter(")content(trace mode, using default populator)delimiter(")>operator(\))operator(;) + ident(populator) operator(=) ident(TypePopulator)operator(.)ident(DEFAULT)operator(;) + operator(}) keyword(else) operator({) + keyword(try) operator({) + type(String) ident(qualifiedName) operator(=) string<delimiter(")content(org.jruby.gen.)delimiter(")> operator(+) ident(clazz)operator(.)ident(getCanonicalName)operator(()operator(\))operator(.)ident(replace)operator(()string<delimiter(')content(.)delimiter(')>operator(,) string<delimiter(')content($)delimiter(')>operator(\))operator(;) + + keyword(if) operator(()ident(DEBUG)operator(\)) type(System)operator(.)ident(out)operator(.)ident(println)operator(()string<delimiter(")content(looking for )delimiter(")> operator(+) ident(qualifiedName) operator(+) string<delimiter(")content($Populator)delimiter(")>operator(\))operator(;) + + type(Class) ident(populatorClass) operator(=) type(Class)operator(.)ident(forName)operator(()ident(qualifiedName) operator(+) string<delimiter(")content($Populator)delimiter(")>operator(\))operator(;) + ident(populator) operator(=) operator(()ident(TypePopulator)operator(\))ident(populatorClass)operator(.)ident(newInstance)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(Throwable) ident(t)operator(\)) operator({) + keyword(if) operator(()ident(DEBUG)operator(\)) type(System)operator(.)ident(out)operator(.)ident(println)operator(()string<delimiter(")content(Could not find it, using default populator)delimiter(")>operator(\))operator(;) + ident(populator) operator(=) ident(TypePopulator)operator(.)ident(DEFAULT)operator(;) + operator(}) + operator(}) + + ident(populator)operator(.)ident(populate)operator(()local_variable(this)operator(,) ident(clazz)operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(private) type(void) ident(defineAnnotatedMethodsIndexed)operator(()type(Class) ident(clazz)operator(\)) operator({) + ident(MethodFactory) ident(methodFactory) operator(=) ident(MethodFactory)operator(.)ident(createFactory)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getJRubyClassLoader)operator(()operator(\))operator(\))operator(;) + ident(methodFactory)operator(.)ident(defineIndexedAnnotatedMethods)operator(()local_variable(this)operator(,) ident(clazz)operator(,) ident(methodDefiningCallback)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(MethodFactory)operator(.)ident(MethodDefiningCallback) ident(methodDefiningCallback) operator(=) keyword(new) ident(MethodFactory)operator(.)ident(MethodDefiningCallback)operator(()operator(\)) operator({) + directive(public) type(void) ident(define)operator(()ident(RubyModule) ident(module)operator(,) ident(JavaMethodDescriptor) ident(desc)operator(,) ident(DynamicMethod) ident(dynamicMethod)operator(\)) operator({) + ident(JRubyMethod) ident(jrubyMethod) operator(=) ident(desc)operator(.)ident(anno)operator(;) + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(frame)operator(()operator(\))operator(\)) operator({) + keyword(for) operator(()type(String) ident(name) operator(:) ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator(\)) operator({) + ident(ASTInspector)operator(.)ident(FRAME_AWARE_METHODS)operator(.)ident(add)operator(()ident(name)operator(\))operator(;) + operator(}) + operator(}) + keyword(if)operator(()ident(jrubyMethod)operator(.)ident(compat)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(BOTH) operator(||) + ident(module)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getCompatVersion)operator(()operator(\)) operator(==) ident(jrubyMethod)operator(.)ident(compat)operator(()operator(\))operator(\)) operator({) + ident(RubyModule) ident(singletonClass)operator(;) + + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(meta)operator(()operator(\))operator(\)) operator({) + ident(singletonClass) operator(=) ident(module)operator(.)ident(getSingletonClass)operator(()operator(\))operator(;) + ident(dynamicMethod)operator(.)ident(setImplementationClass)operator(()ident(singletonClass)operator(\))operator(;) + + type(String) ident(baseName)operator(;) + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(baseName) operator(=) ident(desc)operator(.)ident(name)operator(;) + ident(singletonClass)operator(.)ident(addMethod)operator(()ident(baseName)operator(,) ident(dynamicMethod)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(baseName) operator(=) ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator([)integer(0)operator(])operator(;) + keyword(for) operator(()type(String) ident(name) operator(:) ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator(\)) operator({) + ident(singletonClass)operator(.)ident(addMethod)operator(()ident(name)operator(,) ident(dynamicMethod)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(alias)operator(()operator(\))operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + keyword(for) operator(()type(String) ident(alias) operator(:) ident(jrubyMethod)operator(.)ident(alias)operator(()operator(\))operator(\)) operator({) + ident(singletonClass)operator(.)ident(defineAlias)operator(()ident(alias)operator(,) ident(baseName)operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + type(String) ident(baseName)operator(;) + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(baseName) operator(=) ident(desc)operator(.)ident(name)operator(;) + ident(module)operator(.)ident(addMethod)operator(()ident(baseName)operator(,) ident(dynamicMethod)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(baseName) operator(=) ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator([)integer(0)operator(])operator(;) + keyword(for) operator(()type(String) ident(name) operator(:) ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator(\)) operator({) + ident(module)operator(.)ident(addMethod)operator(()ident(name)operator(,) ident(dynamicMethod)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(alias)operator(()operator(\))operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + keyword(for) operator(()type(String) ident(alias) operator(:) ident(jrubyMethod)operator(.)ident(alias)operator(()operator(\))operator(\)) operator({) + ident(module)operator(.)ident(defineAlias)operator(()ident(alias)operator(,) ident(baseName)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(module)operator(()operator(\))operator(\)) operator({) + ident(singletonClass) operator(=) ident(module)operator(.)ident(getSingletonClass)operator(()operator(\))operator(;) + comment(// module/singleton methods are all defined public) + ident(DynamicMethod) ident(moduleMethod) operator(=) ident(dynamicMethod)operator(.)ident(dup)operator(()operator(\))operator(;) + ident(moduleMethod)operator(.)ident(setVisibility)operator(()ident(PUBLIC)operator(\))operator(;) + + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(baseName) operator(=) ident(desc)operator(.)ident(name)operator(;) + ident(singletonClass)operator(.)ident(addMethod)operator(()ident(desc)operator(.)ident(name)operator(,) ident(moduleMethod)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(baseName) operator(=) ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator([)integer(0)operator(])operator(;) + keyword(for) operator(()type(String) ident(name) operator(:) ident(jrubyMethod)operator(.)ident(name)operator(()operator(\))operator(\)) operator({) + ident(singletonClass)operator(.)ident(addMethod)operator(()ident(name)operator(,) ident(moduleMethod)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(jrubyMethod)operator(.)ident(alias)operator(()operator(\))operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + keyword(for) operator(()type(String) ident(alias) operator(:) ident(jrubyMethod)operator(.)ident(alias)operator(()operator(\))operator(\)) operator({) + ident(singletonClass)operator(.)ident(defineAlias)operator(()ident(alias)operator(,) ident(baseName)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + operator(})operator(;) + + directive(public) type(boolean) ident(defineAnnotatedMethod)operator(()type(String) ident(name)operator(,) type(List)operator(<)ident(JavaMethodDescriptor)operator(>) ident(methods)operator(,) ident(MethodFactory) ident(methodFactory)operator(\)) operator({) + ident(JavaMethodDescriptor) ident(desc) operator(=) ident(methods)operator(.)ident(get)operator(()integer(0)operator(\))operator(;) + keyword(if) operator(()ident(methods)operator(.)ident(size)operator(()operator(\)) operator(==) integer(1)operator(\)) operator({) + keyword(return) ident(defineAnnotatedMethod)operator(()ident(desc)operator(,) ident(methodFactory)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(DynamicMethod) ident(dynamicMethod) operator(=) ident(methodFactory)operator(.)ident(getAnnotatedMethod)operator(()local_variable(this)operator(,) ident(methods)operator(\))operator(;) + ident(methodDefiningCallback)operator(.)ident(define)operator(()local_variable(this)operator(,) ident(desc)operator(,) ident(dynamicMethod)operator(\))operator(;) + + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + + directive(public) type(boolean) ident(defineAnnotatedMethod)operator(()type(Method) ident(method)operator(,) ident(MethodFactory) ident(methodFactory)operator(\)) operator({) + ident(JRubyMethod) ident(jrubyMethod) operator(=) ident(method)operator(.)ident(getAnnotation)operator(()ident(JRubyMethod)operator(.)ident(class)operator(\))operator(;) + + keyword(if) operator(()ident(jrubyMethod) operator(==) keyword(null)operator(\)) keyword(return) keyword(false)operator(;) + + keyword(if)operator(()ident(jrubyMethod)operator(.)ident(compat)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(BOTH) operator(||) + ident(getRuntime)operator(()operator(\))operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getCompatVersion)operator(()operator(\)) operator(==) ident(jrubyMethod)operator(.)ident(compat)operator(()operator(\))operator(\)) operator({) + ident(JavaMethodDescriptor) ident(desc) operator(=) keyword(new) ident(JavaMethodDescriptor)operator(()ident(method)operator(\))operator(;) + ident(DynamicMethod) ident(dynamicMethod) operator(=) ident(methodFactory)operator(.)ident(getAnnotatedMethod)operator(()local_variable(this)operator(,) ident(desc)operator(\))operator(;) + ident(methodDefiningCallback)operator(.)ident(define)operator(()local_variable(this)operator(,) ident(desc)operator(,) ident(dynamicMethod)operator(\))operator(;) + + keyword(return) keyword(true)operator(;) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) type(boolean) ident(defineAnnotatedMethod)operator(()ident(JavaMethodDescriptor) ident(desc)operator(,) ident(MethodFactory) ident(methodFactory)operator(\)) operator({) + ident(JRubyMethod) ident(jrubyMethod) operator(=) ident(desc)operator(.)ident(anno)operator(;) + + keyword(if) operator(()ident(jrubyMethod) operator(==) keyword(null)operator(\)) keyword(return) keyword(false)operator(;) + + keyword(if)operator(()ident(jrubyMethod)operator(.)ident(compat)operator(()operator(\)) operator(==) ident(CompatVersion)operator(.)ident(BOTH) operator(||) + ident(getRuntime)operator(()operator(\))operator(.)ident(getInstanceConfig)operator(()operator(\))operator(.)ident(getCompatVersion)operator(()operator(\)) operator(==) ident(jrubyMethod)operator(.)ident(compat)operator(()operator(\))operator(\)) operator({) + ident(DynamicMethod) ident(dynamicMethod) operator(=) ident(methodFactory)operator(.)ident(getAnnotatedMethod)operator(()local_variable(this)operator(,) ident(desc)operator(\))operator(;) + ident(methodDefiningCallback)operator(.)ident(define)operator(()local_variable(this)operator(,) ident(desc)operator(,) ident(dynamicMethod)operator(\))operator(;) + + keyword(return) keyword(true)operator(;) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) type(void) ident(defineFastMethod)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + type(Visibility) ident(visibility) operator(=) ident(name)operator(.)ident(equals)operator(()string<delimiter(")content(initialize)delimiter(")>operator(\)) operator(?) + ident(PRIVATE) operator(:) ident(PUBLIC)operator(;) + ident(addMethod)operator(()ident(name)operator(,) keyword(new) ident(SimpleCallbackMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(visibility)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(defineFastMethod)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(,) type(Visibility) ident(visibility)operator(\)) operator({) + ident(addMethod)operator(()ident(name)operator(,) keyword(new) ident(SimpleCallbackMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(visibility)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(definePrivateMethod)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + ident(addMethod)operator(()ident(name)operator(,) keyword(new) ident(FullFunctionCallbackMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(PRIVATE)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(defineFastPrivateMethod)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + ident(addMethod)operator(()ident(name)operator(,) keyword(new) ident(SimpleCallbackMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(PRIVATE)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(defineFastProtectedMethod)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + ident(addMethod)operator(()ident(name)operator(,) keyword(new) ident(SimpleCallbackMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(PROTECTED)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(undefineMethod)operator(()type(String) ident(name)operator(\)) operator({) + ident(addMethod)operator(()ident(name)operator(,) ident(UndefinedMethod)operator(.)ident(getInstance)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_undef + * + */) + directive(public) type(void) ident(undef)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\)) ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) keyword(new) type(SecurityException)operator(()string<delimiter(")content(Insecure: can't undef)delimiter(")>operator(\))operator(;) + operator(}) + ident(testFrozen)operator(()string<delimiter(")content(module)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(name)operator(.)ident(equals)operator(()string<delimiter(")content(__id__)delimiter(")>operator(\)) operator(||) ident(name)operator(.)ident(equals)operator(()string<delimiter(")content(__send__)delimiter(")>operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(UNDEFINING_BAD)operator(,) string<delimiter(")content(undefining `)delimiter(")>operator(+) ident(name) operator(+)string<delimiter(")content(' may cause serious problem)delimiter(")>operator(\))operator(;) + operator(}) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + type(String) ident(s0) operator(=) string<delimiter(")content( class)delimiter(")>operator(;) + ident(RubyModule) ident(c) operator(=) local_variable(this)operator(;) + + keyword(if) operator(()ident(c)operator(.)ident(isSingleton)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(obj) operator(=) operator(()operator(()ident(MetaClass)operator(\))ident(c)operator(\))operator(.)ident(getAttached)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(obj) operator(!=) keyword(null) operator(&&) ident(obj) keyword(instanceof) ident(RubyModule)operator(\)) operator({) + ident(c) operator(=) operator(()ident(RubyModule)operator(\)) ident(obj)operator(;) + ident(s0) operator(=) string<delimiter(")delimiter(")>operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(c)operator(.)ident(isModule)operator(()operator(\))operator(\)) operator({) + ident(s0) operator(=) string<delimiter(")content( module)delimiter(")>operator(;) + operator(}) + + keyword(throw) ident(runtime)operator(.)ident(newNameError)operator(()string<delimiter(")content(Undefined method )delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content( for)delimiter(")> operator(+) ident(s0) operator(+) string<delimiter(")content( ')delimiter(")> operator(+) ident(c)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(')delimiter(")>operator(,) ident(name)operator(\))operator(;) + operator(}) + ident(addMethod)operator(()ident(name)operator(,) ident(UndefinedMethod)operator(.)ident(getInstance)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(isSingleton)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(singleton) operator(=) operator(()operator(()ident(MetaClass)operator(\))local_variable(this)operator(\))operator(.)ident(getAttached)operator(()operator(\))operator(;) + ident(singleton)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(singleton_method_undefined)delimiter(")>operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(method_undefined)delimiter(")>operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(include?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(include_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(arg)operator(.)ident(isModule)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(arg)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getModule)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) ident(p) operator(!=) keyword(null)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()operator(()ident(p) keyword(instanceof) ident(IncludedModuleWrapper)operator(\)) operator(&&) operator(()operator(()ident(IncludedModuleWrapper)operator(\)) ident(p)operator(\))operator(.)ident(getNonIncludedClass)operator(()operator(\)) operator(==) ident(arg)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(// TODO: Consider a better way of synchronizing ) + directive(public) type(void) ident(addMethod)operator(()type(String) ident(name)operator(,) ident(DynamicMethod) ident(method)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\)) ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't define method)delimiter(")>operator(\))operator(;) + operator(}) + ident(testFrozen)operator(()string<delimiter(")content(class/module)delimiter(")>operator(\))operator(;) + + comment(// We can safely reference methods here instead of doing getMethods(\) since if we) + comment(// are adding we are not using a IncludedModuleWrapper.) + directive(synchronized)operator(()ident(getMethods)operator(()operator(\))operator(\)) operator({) + comment(// If we add a method which already is cached in this class, then we should update the ) + comment(// cachemap so it stays up to date.) + ident(DynamicMethod) ident(existingMethod) operator(=) ident(getMethods)operator(()operator(\))operator(.)ident(put)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + keyword(if) operator(()ident(existingMethod) operator(!=) keyword(null)operator(\)) operator({) + ident(runtime)operator(.)ident(getCacheMap)operator(()operator(\))operator(.)ident(remove)operator(()ident(existingMethod)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + directive(public) type(void) ident(removeMethod)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\)) ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't remove method)delimiter(")>operator(\))operator(;) + operator(}) + ident(testFrozen)operator(()string<delimiter(")content(class/module)delimiter(")>operator(\))operator(;) + + comment(// We can safely reference methods here instead of doing getMethods(\) since if we) + comment(// are adding we are not using a IncludedModuleWrapper.) + directive(synchronized)operator(()ident(getMethods)operator(()operator(\))operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) operator(()ident(DynamicMethod)operator(\)) ident(getMethods)operator(()operator(\))operator(.)ident(remove)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(method) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNameError)operator(()string<delimiter(")content(method ')delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(' not defined in )delimiter(")> operator(+) ident(getName)operator(()operator(\))operator(,) ident(name)operator(\))operator(;) + operator(}) + + ident(runtime)operator(.)ident(getCacheMap)operator(()operator(\))operator(.)ident(remove)operator(()ident(method)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isSingleton)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(singleton) operator(=) operator(()operator(()ident(MetaClass)operator(\))local_variable(this)operator(\))operator(.)ident(getAttached)operator(()operator(\))operator(;) + ident(singleton)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(singleton_method_removed)delimiter(")>operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(method_removed)delimiter(")>operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Search through this module and supermodules for method definitions. Cache superclass definitions in this class. + * + * @param name The name of the method to search for + * @return The method, or UndefinedMethod if not found + */) + directive(public) ident(DynamicMethod) ident(searchMethod)operator(()type(String) ident(name)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(getMethods)operator(()operator(\))operator(.)ident(get)operator(()ident(name)operator(\))operator(;) + + keyword(if) operator(()ident(method) operator(!=) keyword(null)operator(\)) keyword(return) ident(method)operator(;) + + keyword(return) ident(superClass) operator(==) keyword(null) operator(?) ident(UndefinedMethod)operator(.)ident(getInstance)operator(()operator(\)) operator(:) ident(superClass)operator(.)ident(searchMethod)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Search through this module and supermodules for method definitions. Cache superclass definitions in this class. + * + * @param name The name of the method to search for + * @return The method, or UndefinedMethod if not found + */) + directive(public) ident(DynamicMethod) ident(retrieveMethod)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(getMethods)operator(()operator(\))operator(.)ident(get)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Search through this module and supermodules for method definitions. Cache superclass definitions in this class. + * + * @param name The name of the method to search for + * @return The method, or UndefinedMethod if not found + */) + directive(public) ident(RubyModule) ident(findImplementer)operator(()ident(RubyModule) ident(clazz)operator(\)) operator({) + keyword(for) operator(()ident(RubyModule) ident(searchModule) operator(=) local_variable(this)operator(;) ident(searchModule) operator(!=) keyword(null)operator(;) ident(searchModule) operator(=) ident(searchModule)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(searchModule)operator(.)ident(isSame)operator(()ident(clazz)operator(\))operator(\)) operator({) + keyword(return) ident(searchModule)operator(;) + operator(}) + operator(}) + + keyword(return) keyword(null)operator(;) + operator(}) + + directive(public) type(void) ident(addModuleFunction)operator(()type(String) ident(name)operator(,) ident(DynamicMethod) ident(method)operator(\)) operator({) + ident(addMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + ident(getSingletonClass)operator(()operator(\))operator(.)ident(addMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + operator(}) + + comment(/** rb_define_module_function + * + */) + directive(public) type(void) ident(defineModuleFunction)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + ident(definePrivateMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + operator(}) + + comment(/** rb_define_module_function + * + */) + directive(public) type(void) ident(definePublicModuleFunction)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + ident(defineMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + operator(}) + + comment(/** rb_define_module_function + * + */) + directive(public) type(void) ident(defineFastModuleFunction)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + ident(defineFastPrivateMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineFastMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + operator(}) + + comment(/** rb_define_module_function + * + */) + directive(public) type(void) ident(defineFastPublicModuleFunction)operator(()type(String) ident(name)operator(,) type(Callback) ident(method)operator(\)) operator({) + ident(defineFastMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineFastMethod)operator(()ident(name)operator(,) ident(method)operator(\))operator(;) + operator(}) + + comment(/** rb_alias + * + */) + directive(public) directive(synchronized) type(void) ident(defineAlias)operator(()type(String) ident(name)operator(,) type(String) ident(oldName)operator(\)) operator({) + ident(testFrozen)operator(()string<delimiter(")content(module)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(oldName)operator(.)ident(equals)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return)operator(;) + operator(}) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()local_variable(this) operator(==) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + operator(}) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(oldName)operator(\))operator(;) + ident(DynamicMethod) ident(oldMethod) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(isModule)operator(()operator(\))operator(\)) operator({) + ident(method) operator(=) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(searchMethod)operator(()ident(oldName)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNameError)operator(()string<delimiter(")content(undefined method `)delimiter(")> operator(+) ident(oldName) operator(+) string<delimiter(")content(' for )delimiter(")> operator(+) + operator(()ident(isModule)operator(()operator(\)) operator(?) string<delimiter(")content(module)delimiter(")> operator(:) string<delimiter(")content(class)delimiter(")>operator(\)) operator(+) string<delimiter(")content( `)delimiter(")> operator(+) ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(')delimiter(")>operator(,) ident(oldName)operator(\))operator(;) + operator(}) + operator(}) + ident(CacheMap) ident(cacheMap) operator(=) ident(runtime)operator(.)ident(getCacheMap)operator(()operator(\))operator(;) + ident(cacheMap)operator(.)ident(remove)operator(()ident(method)operator(\))operator(;) + ident(cacheMap)operator(.)ident(remove)operator(()ident(oldMethod)operator(\))operator(;) + keyword(if) operator(()ident(oldMethod) operator(!=) ident(oldMethod)operator(.)ident(getRealMethod)operator(()operator(\))operator(\)) operator({) + ident(cacheMap)operator(.)ident(remove)operator(()ident(oldMethod)operator(.)ident(getRealMethod)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(putMethod)operator(()ident(name)operator(,) keyword(new) ident(AliasMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(oldName)operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(synchronized) type(void) ident(defineAliases)operator(()type(List)operator(<)type(String)operator(>) ident(aliases)operator(,) type(String) ident(oldName)operator(\)) operator({) + ident(testFrozen)operator(()string<delimiter(")content(module)delimiter(")>operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()local_variable(this) operator(==) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + operator(}) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(oldName)operator(\))operator(;) + keyword(if) operator(()ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(isModule)operator(()operator(\))operator(\)) operator({) + ident(method) operator(=) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(searchMethod)operator(()ident(oldName)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNameError)operator(()string<delimiter(")content(undefined method `)delimiter(")> operator(+) ident(oldName) operator(+) string<delimiter(")content(' for )delimiter(")> operator(+) + operator(()ident(isModule)operator(()operator(\)) operator(?) string<delimiter(")content(module)delimiter(")> operator(:) string<delimiter(")content(class)delimiter(")>operator(\)) operator(+) string<delimiter(")content( `)delimiter(")> operator(+) ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(')delimiter(")>operator(,) ident(oldName)operator(\))operator(;) + operator(}) + operator(}) + ident(CacheMap) ident(cacheMap) operator(=) ident(runtime)operator(.)ident(getCacheMap)operator(()operator(\))operator(;) + ident(cacheMap)operator(.)ident(remove)operator(()ident(method)operator(\))operator(;) + keyword(for) operator(()type(String) ident(name)operator(:) ident(aliases)operator(\)) operator({) + keyword(if) operator(()ident(oldName)operator(.)ident(equals)operator(()ident(name)operator(\))operator(\)) keyword(continue)operator(;) + ident(DynamicMethod) ident(oldMethod) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(cacheMap)operator(.)ident(remove)operator(()ident(oldMethod)operator(\))operator(;) + keyword(if) operator(()ident(oldMethod) operator(!=) ident(oldMethod)operator(.)ident(getRealMethod)operator(()operator(\))operator(\)) operator({) + ident(cacheMap)operator(.)ident(remove)operator(()ident(oldMethod)operator(.)ident(getRealMethod)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(putMethod)operator(()ident(name)operator(,) keyword(new) ident(AliasMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(oldName)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** this method should be used only by interpreter or compiler + * + */) + directive(public) ident(RubyClass) ident(defineOrGetClassUnder)operator(()type(String) ident(name)operator(,) ident(RubyClass) ident(superClazz)operator(\)) operator({) + comment(// This method is intended only for defining new classes in Ruby code,) + comment(// so it uses the allocator of the specified superclass or default to) + comment(// the Object allocator. It should NOT be used to define classes that require a native allocator.) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(classObj) operator(=) ident(getConstantAt)operator(()ident(name)operator(\))operator(;) + ident(RubyClass) ident(clazz)operator(;) + + keyword(if) operator(()ident(classObj) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(classObj) keyword(instanceof) ident(RubyClass)operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()ident(name) operator(+) string<delimiter(")content( is not a class)delimiter(")>operator(\))operator(;) + ident(clazz) operator(=) operator(()ident(RubyClass)operator(\))ident(classObj)operator(;) + + keyword(if) operator(()ident(superClazz) operator(!=) keyword(null)operator(\)) operator({) + ident(RubyClass) ident(tmp) operator(=) ident(clazz)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + keyword(while) operator(()ident(tmp) operator(!=) keyword(null) operator(&&) ident(tmp)operator(.)ident(isIncluded)operator(()operator(\))operator(\)) ident(tmp) operator(=) ident(tmp)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) comment(// need to skip IncludedModuleWrappers) + keyword(if) operator(()ident(tmp) operator(!=) keyword(null)operator(\)) ident(tmp) operator(=) ident(tmp)operator(.)ident(getRealClass)operator(()operator(\))operator(;) + keyword(if) operator(()ident(tmp) operator(!=) ident(superClazz)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(superclass mismatch for class )delimiter(")> operator(+) ident(name)operator(\))operator(;) + comment(// superClazz = null;) + operator(}) + + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(extending class prohibited)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(classProviders) operator(!=) keyword(null) operator(&&) operator(()ident(clazz) operator(=) ident(searchProvidersForClass)operator(()ident(name)operator(,) ident(superClazz)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + comment(// reopen a java class) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(superClazz) operator(==) keyword(null)operator(\)) ident(superClazz) operator(=) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(;) + ident(clazz) operator(=) ident(RubyClass)operator(.)ident(newClass)operator(()ident(runtime)operator(,) ident(superClazz)operator(,) ident(name)operator(,) ident(superClazz)operator(.)ident(getAllocator)operator(()operator(\))operator(,) local_variable(this)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + keyword(return) ident(clazz)operator(;) + operator(}) + + comment(/** this method should be used only by interpreter or compiler + * + */) + directive(public) ident(RubyModule) ident(defineOrGetModuleUnder)operator(()type(String) ident(name)operator(\)) operator({) + comment(// This method is intended only for defining new modules in Ruby code) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(moduleObj) operator(=) ident(getConstantAt)operator(()ident(name)operator(\))operator(;) + ident(RubyModule) ident(module)operator(;) + keyword(if) operator(()ident(moduleObj) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(moduleObj)operator(.)ident(isModule)operator(()operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()ident(name) operator(+) string<delimiter(")content( is not a module)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newSecurityError)operator(()string<delimiter(")content(extending module prohibited)delimiter(")>operator(\))operator(;) + ident(module) operator(=) operator(()ident(RubyModule)operator(\))ident(moduleObj)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(classProviders) operator(!=) keyword(null) operator(&&) operator(()ident(module) operator(=) ident(searchProvidersForModule)operator(()ident(name)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + comment(// reopen a java module) + operator(}) keyword(else) operator({) + ident(module) operator(=) ident(RubyModule)operator(.)ident(newModule)operator(()ident(runtime)operator(,) ident(name)operator(,) local_variable(this)operator(,) keyword(true)operator(\))operator(;) + operator(}) + keyword(return) ident(module)operator(;) + operator(}) + + comment(/** rb_define_class_under + * this method should be used only as an API to define/open nested classes + */) + directive(public) ident(RubyClass) ident(defineClassUnder)operator(()type(String) ident(name)operator(,) ident(RubyClass) ident(superClass)operator(,) ident(ObjectAllocator) ident(allocator)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(defineClassUnder)operator(()ident(name)operator(,) ident(superClass)operator(,) ident(allocator)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** rb_define_module_under + * this method should be used only as an API to define/open nested module + */) + directive(public) ident(RubyModule) ident(defineModuleUnder)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(defineModuleUnder)operator(()ident(name)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(// FIXME: create AttrReaderMethod, AttrWriterMethod, for faster attr access) + directive(private) type(void) ident(addAccessor)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(internedName)operator(,) type(boolean) ident(readable)operator(,) type(boolean) ident(writeable)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + + directive(final) ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + comment(// Check the visibility of the previous frame, which will be the frame in which the class is being eval'ed) + type(Visibility) ident(attributeScope) operator(=) ident(context)operator(.)ident(getCurrentVisibility)operator(()operator(\))operator(;) + keyword(if) operator(()ident(attributeScope) operator(==) ident(PRIVATE)operator(\)) operator({) + comment(//FIXME warning) + operator(}) keyword(else) keyword(if) operator(()ident(attributeScope) operator(==) ident(MODULE_FUNCTION)operator(\)) operator({) + ident(attributeScope) operator(=) ident(PRIVATE)operator(;) + comment(// FIXME warning) + operator(}) + directive(final) type(String) ident(variableName) operator(=) operator(()string<delimiter(")content(@)delimiter(")> operator(+) ident(internedName)operator(\))operator(.)ident(intern)operator(()operator(\))operator(;) + keyword(if) operator(()ident(readable)operator(\)) operator({) + comment(// FIXME: should visibility be set to current visibility?) + ident(addMethod)operator(()ident(internedName)operator(,) keyword(new) ident(JavaMethod)operator(()local_variable(this)operator(,) ident(PUBLIC)operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(0)operator(\)) ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(runtime)operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(0)operator(\))operator(;) + + ident(IRubyObject) ident(variable) operator(=) ident(self)operator(.)ident(getInstanceVariables)operator(()operator(\))operator(.)ident(fastGetInstanceVariable)operator(()ident(variableName)operator(\))operator(;) + + keyword(return) ident(variable) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(variable)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(Arity) ident(getArity)operator(()operator(\)) operator({) + keyword(return) ident(Arity)operator(.)ident(noArguments)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(method_added)delimiter(")>operator(,) ident(runtime)operator(.)ident(fastNewSymbol)operator(()ident(internedName)operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(writeable)operator(\)) operator({) + ident(internedName) operator(=) operator(()ident(internedName) operator(+) string<delimiter(")content(=)delimiter(")>operator(\))operator(.)ident(intern)operator(()operator(\))operator(;) + comment(// FIXME: should visibility be set to current visibility?) + ident(addMethod)operator(()ident(internedName)operator(,) keyword(new) ident(JavaMethod)operator(()local_variable(this)operator(,) ident(PUBLIC)operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + comment(// ENEBO: Can anyone get args to be anything but length 1?) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(1)operator(\)) ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(runtime)operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(1)operator(\))operator(;) + + keyword(return) ident(self)operator(.)ident(getInstanceVariables)operator(()operator(\))operator(.)ident(fastSetInstanceVariable)operator(()ident(variableName)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(Arity) ident(getArity)operator(()operator(\)) operator({) + keyword(return) ident(Arity)operator(.)ident(singleArgument)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(method_added)delimiter(")>operator(,) ident(runtime)operator(.)ident(fastNewSymbol)operator(()ident(internedName)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** set_method_visibility + * + */) + directive(public) type(void) ident(setMethodVisibility)operator(()ident(IRubyObject)type([]) ident(methods)operator(,) type(Visibility) ident(visibility)operator(\)) operator({) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't change method visibility)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(methods)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(exportMethod)operator(()ident(methods)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(,) ident(visibility)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_export_method + * + */) + directive(public) type(void) ident(exportMethod)operator(()type(String) ident(name)operator(,) type(Visibility) ident(visibility)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + operator(}) + + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + + keyword(if) operator(()ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(undefined method ')delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(' for )delimiter(")> operator(+) + operator(()ident(isModule)operator(()operator(\)) operator(?) string<delimiter(")content(module)delimiter(")> operator(:) string<delimiter(")content(class)delimiter(")>operator(\)) operator(+) string<delimiter(")content( ')delimiter(")> operator(+) ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(')delimiter(")>operator(,) ident(name)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(method)operator(.)ident(getVisibility)operator(()operator(\)) operator(!=) ident(visibility)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(method)operator(.)ident(getImplementationClass)operator(()operator(\))operator(\)) operator({) + ident(method)operator(.)ident(setVisibility)operator(()ident(visibility)operator(\))operator(;) + operator(}) keyword(else) operator({) + comment(// FIXME: Why was this using a FullFunctionCallbackMethod before that did callSuper?) + ident(addMethod)operator(()ident(name)operator(,) keyword(new) ident(WrapperMethod)operator(()local_variable(this)operator(,) ident(method)operator(,) ident(visibility)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** + * MRI: rb_method_boundp + * + */) + directive(public) type(boolean) ident(isMethodBound)operator(()type(String) ident(name)operator(,) type(boolean) ident(checkVisibility)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(return) operator(!)operator(()ident(checkVisibility) operator(&&) ident(method)operator(.)ident(getVisibility)operator(()operator(\)) operator(==) ident(PRIVATE)operator(\))operator(;) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(newMethod)operator(()ident(IRubyObject) ident(receiver)operator(,) type(String) ident(name)operator(,) type(boolean) ident(bound)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(undefined method `)delimiter(")> operator(+) ident(name) operator(+) + string<delimiter(")content(' for class `)delimiter(")> operator(+) local_variable(this)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(')delimiter(")>operator(,) ident(name)operator(\))operator(;) + operator(}) + + ident(RubyModule) ident(implementationModule) operator(=) ident(method)operator(.)ident(getImplementationClass)operator(()operator(\))operator(;) + ident(RubyModule) ident(originModule) operator(=) local_variable(this)operator(;) + keyword(while) operator(()ident(originModule) operator(!=) ident(implementationModule) operator(&&) ident(originModule)operator(.)ident(isSingleton)operator(()operator(\))operator(\)) operator({) + ident(originModule) operator(=) operator(()operator(()ident(MetaClass)operator(\))ident(originModule)operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(;) + operator(}) + + ident(RubyMethod) ident(newMethod) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(bound)operator(\)) operator({) + ident(newMethod) operator(=) ident(RubyMethod)operator(.)ident(newMethod)operator(()ident(implementationModule)operator(,) ident(name)operator(,) ident(originModule)operator(,) ident(name)operator(,) ident(method)operator(,) ident(receiver)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(newMethod) operator(=) ident(RubyUnboundMethod)operator(.)ident(newUnboundMethod)operator(()ident(implementationModule)operator(,) ident(name)operator(,) ident(originModule)operator(,) ident(name)operator(,) ident(method)operator(\))operator(;) + operator(}) + ident(newMethod)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + + keyword(return) ident(newMethod)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(define_method)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(IRubyObject) ident(define_method)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(String) ident(name) operator(=) ident(arg0)operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(;) + ident(DynamicMethod) ident(newMethod) operator(=) keyword(null)operator(;) + type(Visibility) ident(visibility) operator(=) ident(context)operator(.)ident(getCurrentVisibility)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(visibility) operator(==) ident(MODULE_FUNCTION)operator(\)) ident(visibility) operator(=) ident(PRIVATE)operator(;) + ident(RubyProc) ident(proc) operator(=) ident(runtime)operator(.)ident(newProc)operator(()ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA)operator(,) ident(block)operator(\))operator(;) + + comment(// a normal block passed to define_method changes to do arity checking; make it a lambda) + ident(proc)operator(.)ident(getBlock)operator(()operator(\))operator(.)ident(type) operator(=) ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA)operator(;) + + ident(newMethod) operator(=) ident(createProcMethod)operator(()ident(name)operator(,) ident(visibility)operator(,) ident(proc)operator(\))operator(;) + + ident(RuntimeHelpers)operator(.)ident(addInstanceMethod)operator(()local_variable(this)operator(,) ident(name)operator(,) ident(newMethod)operator(,) ident(context)operator(.)ident(getPreviousVisibility)operator(()operator(\))operator(,) ident(context)operator(,) ident(runtime)operator(\))operator(;) + + keyword(return) ident(proc)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(define_method)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(IRubyObject) ident(define_method)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(body)operator(;) + type(String) ident(name) operator(=) ident(arg0)operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(;) + ident(DynamicMethod) ident(newMethod) operator(=) keyword(null)operator(;) + type(Visibility) ident(visibility) operator(=) ident(context)operator(.)ident(getCurrentVisibility)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(visibility) operator(==) ident(MODULE_FUNCTION)operator(\)) ident(visibility) operator(=) ident(PRIVATE)operator(;) + keyword(if) operator(()ident(runtime)operator(.)ident(getProc)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(arg1)operator(\))operator(\)) operator({) + comment(// double-testing args.length here, but it avoids duplicating the proc-setup code in two places) + ident(RubyProc) ident(proc) operator(=) operator(()ident(RubyProc)operator(\))ident(arg1)operator(;) + ident(body) operator(=) ident(proc)operator(;) + + ident(newMethod) operator(=) ident(createProcMethod)operator(()ident(name)operator(,) ident(visibility)operator(,) ident(proc)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(runtime)operator(.)ident(getMethod)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(arg1)operator(\))operator(\)) operator({) + ident(RubyMethod) ident(method) operator(=) operator(()ident(RubyMethod)operator(\))ident(arg1)operator(;) + ident(body) operator(=) ident(method)operator(;) + + ident(newMethod) operator(=) keyword(new) ident(MethodMethod)operator(()local_variable(this)operator(,) ident(method)operator(.)ident(unbind)operator(()keyword(null)operator(\))operator(,) ident(visibility)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type )delimiter(")> operator(+) ident(arg1)operator(.)ident(getType)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( (expected Proc/Method\))delimiter(")>operator(\))operator(;) + operator(}) + + ident(RuntimeHelpers)operator(.)ident(addInstanceMethod)operator(()local_variable(this)operator(,) ident(name)operator(,) ident(newMethod)operator(,) ident(context)operator(.)ident(getPreviousVisibility)operator(()operator(\))operator(,) ident(context)operator(,) ident(runtime)operator(\))operator(;) + + keyword(return) ident(body)operator(;) + operator(}) + annotation(@Deprecated) + directive(public) ident(IRubyObject) ident(define_method)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(define_method)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(define_method)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(default)operator(:) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong # of arguments()delimiter(")> operator(+) ident(args)operator(.)ident(length) operator(+) string<delimiter(")content( for 2\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(DynamicMethod) ident(createProcMethod)operator(()type(String) ident(name)operator(,) type(Visibility) ident(visibility)operator(,) ident(RubyProc) ident(proc)operator(\)) operator({) + ident(Block) ident(block) operator(=) ident(proc)operator(.)ident(getBlock)operator(()operator(\))operator(;) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(getFrame)operator(()operator(\))operator(.)ident(setKlazz)operator(()local_variable(this)operator(\))operator(;) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(getFrame)operator(()operator(\))operator(.)ident(setName)operator(()ident(name)operator(\))operator(;) + + ident(StaticScope) ident(scope) operator(=) ident(block)operator(.)ident(getBody)operator(()operator(\))operator(.)ident(getStaticScope)operator(()operator(\))operator(;) + + comment(// for zsupers in define_method (blech!\) we tell the proc scope to act as the "argument" scope) + ident(scope)operator(.)ident(setArgumentScope)operator(()keyword(true)operator(\))operator(;) + + ident(Arity) ident(arity) operator(=) ident(block)operator(.)ident(arity)operator(()operator(\))operator(;) + comment(// just using required is broken...but no more broken than before zsuper refactoring) + ident(scope)operator(.)ident(setRequiredArgs)operator(()ident(arity)operator(.)ident(required)operator(()operator(\))operator(\))operator(;) + + keyword(if)operator(()operator(!)ident(arity)operator(.)ident(isFixed)operator(()operator(\))operator(\)) operator({) + ident(scope)operator(.)ident(setRestArg)operator(()ident(arity)operator(.)ident(required)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) keyword(new) ident(ProcMethod)operator(()local_variable(this)operator(,) ident(proc)operator(,) ident(visibility)operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) ident(IRubyObject) ident(executeUnder)operator(()ident(ThreadContext) ident(context)operator(,) type(Callback) ident(method)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(context)operator(.)ident(preExecuteUnder)operator(()local_variable(this)operator(,) ident(block)operator(\))operator(;) + keyword(try) operator({) + keyword(return) ident(method)operator(.)ident(execute)operator(()local_variable(this)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(postExecuteUnder)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(name)delimiter(")>operator(\)) + directive(public) ident(RubyString) ident(name)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(getBaseName)operator(()operator(\)) operator(==) keyword(null) operator(?) string<delimiter(")delimiter(")> operator(:) ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(cloneMethods)operator(()ident(RubyModule) ident(clone)operator(\)) operator({) + ident(RubyModule) ident(realType) operator(=) local_variable(this)operator(.)ident(getNonIncludedClass)operator(()operator(\))operator(;) + keyword(for) operator(()type(Map)operator(.)ident(Entry)operator(<)type(String)operator(,) ident(DynamicMethod)operator(>) ident(entry) operator(:) ident(getMethods)operator(()operator(\))operator(.)ident(entrySet)operator(()operator(\))operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(entry)operator(.)ident(getValue)operator(()operator(\))operator(;) + comment(// Do not clone cached methods) + comment(// FIXME: MRI copies all methods here) + keyword(if) operator(()ident(method)operator(.)ident(getImplementationClass)operator(()operator(\)) operator(==) ident(realType) operator(||) ident(method) keyword(instanceof) ident(UndefinedMethod)operator(\)) operator({) + + comment(// A cloned method now belongs to a new class. Set it.) + comment(// TODO: Make DynamicMethod immutable) + ident(DynamicMethod) ident(clonedMethod) operator(=) ident(method)operator(.)ident(dup)operator(()operator(\))operator(;) + ident(clonedMethod)operator(.)ident(setImplementationClass)operator(()ident(clone)operator(\))operator(;) + ident(clone)operator(.)ident(putMethod)operator(()ident(entry)operator(.)ident(getKey)operator(()operator(\))operator(,) ident(clonedMethod)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(clone)operator(;) + operator(}) + + comment(/** rb_mod_init_copy + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(original)operator(\)) operator({) + local_variable(super)operator(.)ident(initialize_copy)operator(()ident(original)operator(\))operator(;) + + ident(RubyModule) ident(originalModule) operator(=) operator(()ident(RubyModule)operator(\))ident(original)operator(;) + + keyword(if) operator(()operator(!)ident(getMetaClass)operator(()operator(\))operator(.)ident(isSingleton)operator(()operator(\))operator(\)) ident(setMetaClass)operator(()ident(originalModule)operator(.)ident(getSingletonClassClone)operator(()operator(\))operator(\))operator(;) + ident(setSuperClass)operator(()ident(originalModule)operator(.)ident(getSuperClass)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(originalModule)operator(.)ident(hasVariables)operator(()operator(\))operator(\))operator({) + ident(syncVariables)operator(()ident(originalModule)operator(.)ident(getVariableList)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(originalModule)operator(.)ident(cloneMethods)operator(()local_variable(this)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_mod_included_modules + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(included_modules)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(included_modules)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) ident(getSuperClass)operator(()operator(\))operator(;) ident(p) operator(!=) keyword(null)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(p)operator(.)ident(isIncluded)operator(()operator(\))operator(\)) operator({) + ident(ary)operator(.)ident(append)operator(()ident(p)operator(.)ident(getNonIncludedClass)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(ary)operator(;) + operator(}) + + comment(/** rb_mod_ancestors + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ancestors)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(ancestors)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(getAncestorList)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) ident(RubyArray) ident(ancestors)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(getAncestorList)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(List)operator(<)ident(IRubyObject)operator(>) ident(getAncestorList)operator(()operator(\)) operator({) + type(ArrayList)operator(<)ident(IRubyObject)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)ident(IRubyObject)operator(>)operator(()operator(\))operator(;) + + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) ident(p) operator(!=) keyword(null)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if)operator(()operator(!)ident(p)operator(.)ident(isSingleton)operator(()operator(\))operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(p)operator(.)ident(getNonIncludedClass)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(list)operator(;) + operator(}) + + directive(public) type(boolean) ident(hasModuleInHierarchy)operator(()ident(RubyModule) ident(type)operator(\)) operator({) + comment(// XXX: This check previously used callMethod("=="\) to check for equality between classes) + comment(// when scanning the hierarchy. However the == check may be safe; we should only ever have) + comment(// one instance bound to a given type/constant. If it's found to be unsafe, examine ways) + comment(// to avoid the == call.) + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) ident(p) operator(!=) keyword(null)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(p)operator(.)ident(getNonIncludedClass)operator(()operator(\)) operator(==) ident(type)operator(\)) keyword(return) keyword(true)operator(;) + operator(}) + + keyword(return) keyword(false)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(hashCode)operator(()operator(\)) operator({) + keyword(return) ident(id)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(id)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_to_s + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(if)operator(()ident(isSingleton)operator(()operator(\))operator(\))operator({) + ident(IRubyObject) ident(attached) operator(=) operator(()operator(()ident(MetaClass)operator(\))local_variable(this)operator(\))operator(.)ident(getAttached)operator(()operator(\))operator(;) + type(StringBuilder) ident(buffer) operator(=) keyword(new) type(StringBuilder)operator(()string<delimiter(")content(#<Class:)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(attached) operator(!=) keyword(null)operator(\)) operator({) comment(// FIXME: figure out why we get null sometimes) + keyword(if)operator(()ident(attached) keyword(instanceof) ident(RubyClass) operator(||) ident(attached) keyword(instanceof) ident(RubyModule)operator(\))operator({) + ident(buffer)operator(.)ident(append)operator(()ident(attached)operator(.)ident(inspect)operator(()operator(\))operator(\))operator(;) + operator(})keyword(else)operator({) + ident(buffer)operator(.)ident(append)operator(()ident(attached)operator(.)ident(anyToString)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buffer)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_mod_eqq + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(===)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(RubyBoolean) ident(op_eqq)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isInstance)operator(()ident(obj)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) local_variable(super)operator(.)ident(op_equal)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_freeze + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(freeze)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(freeze)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(to_s)operator(()operator(\))operator(;) + keyword(return) local_variable(super)operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_le + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_le)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(obj) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(compared with non class/module)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(isKindOfModule)operator(()operator(()ident(RubyModule)operator(\)) ident(obj)operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(()operator(()ident(RubyModule)operator(\)) ident(obj)operator(\))operator(.)ident(isKindOfModule)operator(()local_variable(this)operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_mod_lt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_lt)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) ident(obj) operator(==) local_variable(this) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\)) operator(:) ident(op_le)operator(()ident(obj)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_ge + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_ge)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(obj) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(compared with non class/module)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) operator(()operator(()ident(RubyModule)operator(\)) ident(obj)operator(\))operator(.)ident(op_le)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_gt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_gt)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) local_variable(this) operator(==) ident(obj) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\)) operator(:) ident(op_ge)operator(()ident(obj)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_cmp + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(obj)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(obj) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(RubyModule) ident(module) operator(=) operator(()ident(RubyModule)operator(\)) ident(obj)operator(;) + + keyword(if) operator(()ident(module)operator(.)ident(isKindOfModule)operator(()local_variable(this)operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()local_variable(this)operator(.)ident(isKindOfModule)operator(()ident(module)operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()operator(-)integer(1)operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(isKindOfModule)operator(()ident(RubyModule) ident(type)operator(\)) operator({) + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) ident(p) operator(!=) keyword(null)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(p)operator(.)ident(isSame)operator(()ident(type)operator(\))operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + + keyword(return) keyword(false)operator(;) + operator(}) + + directive(protected) type(boolean) ident(isSame)operator(()ident(RubyModule) ident(module)operator(\)) operator({) + keyword(return) local_variable(this) operator(==) ident(module)operator(;) + operator(}) + + comment(/** rb_mod_initialize + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + comment(// class and module bodies default to public, so make the block's visibility public. JRUBY-1185.) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setVisibility)operator(()ident(PUBLIC)operator(\))operator(;) + ident(block)operator(.)ident(yield)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) local_variable(this)operator(,) local_variable(this)operator(,) local_variable(this)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(addReadWriteAttribute)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(\)) operator({) + ident(addAccessor)operator(()ident(context)operator(,) ident(name)operator(.)ident(intern)operator(()operator(\))operator(,) keyword(true)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(addReadAttribute)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(\)) operator({) + ident(addAccessor)operator(()ident(context)operator(,) ident(name)operator(.)ident(intern)operator(()operator(\))operator(,) keyword(true)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(addWriteAttribute)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(\)) operator({) + ident(addAccessor)operator(()ident(context)operator(,) ident(name)operator(.)ident(intern)operator(()operator(\))operator(,) keyword(false)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_attr + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(attr)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(IRubyObject) ident(attr)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(boolean) ident(writeable) operator(=) ident(args)operator(.)ident(length) operator(>) integer(1) operator(?) ident(args)operator([)integer(1)operator(])operator(.)ident(isTrue)operator(()operator(\)) operator(:) keyword(false)operator(;) + + ident(addAccessor)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(,) keyword(true)operator(,) ident(writeable)operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * @deprecated + */) + directive(public) ident(IRubyObject) ident(attr_reader)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(attr_reader)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_attr_reader + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(attr_reader)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(IRubyObject) ident(attr_reader)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(addAccessor)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(,) keyword(true)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_mod_attr_writer + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(attr_writer)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(IRubyObject) ident(attr_writer)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(addAccessor)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(,) keyword(false)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * @deprecated + */) + directive(public) ident(IRubyObject) ident(attr_accessor)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(attr_accessor)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_attr_accessor + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(attr_accessor)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(reads) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(IRubyObject) ident(attr_accessor)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + comment(// This is almost always already interned, since it will be called with a symbol in most cases) + comment(// but when created from Java code, we might get an argument that needs to be interned.) + comment(// addAccessor has as a precondition that the string MUST be interned) + ident(addAccessor)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(,) keyword(true)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Get a list of all instance methods names of the provided visibility unless not is true, then + * get all methods which are not the provided + * + * @param args passed into one of the Ruby instance_method methods + * @param visibility to find matching instance methods against + * @param not if true only find methods not matching supplied visibility + * @return a RubyArray of instance method names + */) + directive(private) ident(RubyArray) ident(instance_methods)operator(()ident(IRubyObject)type([]) ident(args)operator(,) directive(final) type(Visibility) ident(visibility)operator(,) type(boolean) ident(not)operator(\)) operator({) + type(boolean) ident(includeSuper) operator(=) ident(args)operator(.)ident(length) operator(>) integer(0) operator(?) ident(args)operator([)integer(0)operator(])operator(.)ident(isTrue)operator(()operator(\)) operator(:) keyword(true)operator(;) + ident(RubyArray) ident(ary) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()operator(\))operator(;) + type(Set)operator(<)type(String)operator(>) ident(seen) operator(=) keyword(new) type(HashSet)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + + keyword(for) operator(()ident(RubyModule) ident(type) operator(=) local_variable(this)operator(;) ident(type) operator(!=) keyword(null)operator(;) ident(type) operator(=) ident(type)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + ident(RubyModule) ident(realType) operator(=) ident(type)operator(.)ident(getNonIncludedClass)operator(()operator(\))operator(;) + keyword(for) operator(()type(Iterator) ident(iter) operator(=) ident(type)operator(.)ident(getMethods)operator(()operator(\))operator(.)ident(entrySet)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(Map)operator(.)ident(Entry) ident(entry) operator(=) operator(()type(Map)operator(.)ident(Entry)operator(\)) ident(iter)operator(.)ident(next)operator(()operator(\))operator(;) + ident(DynamicMethod) ident(method) operator(=) operator(()ident(DynamicMethod)operator(\)) ident(entry)operator(.)ident(getValue)operator(()operator(\))operator(;) + type(String) ident(methodName) operator(=) operator(()type(String)operator(\)) ident(entry)operator(.)ident(getKey)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!) ident(seen)operator(.)ident(contains)operator(()ident(methodName)operator(\))operator(\)) operator({) + ident(seen)operator(.)ident(add)operator(()ident(methodName)operator(\))operator(;) + + keyword(if) operator(()ident(method)operator(.)ident(getImplementationClass)operator(()operator(\)) operator(==) ident(realType) operator(&&) + operator(()operator(!)ident(not) operator(&&) ident(method)operator(.)ident(getVisibility)operator(()operator(\)) operator(==) ident(visibility) operator(||) operator(()ident(not) operator(&&) ident(method)operator(.)ident(getVisibility)operator(()operator(\)) operator(!=) ident(visibility)operator(\))operator(\)) operator(&&) + operator(!) ident(method)operator(.)ident(isUndefined)operator(()operator(\))operator(\)) operator({) + + ident(ary)operator(.)ident(append)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(methodName)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + keyword(if) operator(()operator(!)ident(includeSuper)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + + keyword(return) ident(ary)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyArray) ident(instance_methods)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(instance_methods)operator(()ident(args)operator(,) ident(PRIVATE)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(public_instance_methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyArray) ident(public_instance_methods)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(instance_methods)operator(()ident(args)operator(,) ident(PUBLIC)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_method)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(instance_method)operator(()ident(IRubyObject) ident(symbol)operator(\)) operator({) + keyword(return) ident(newMethod)operator(()keyword(null)operator(,) ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** rb_class_protected_instance_methods + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(protected_instance_methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyArray) ident(protected_instance_methods)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(instance_methods)operator(()ident(args)operator(,) ident(PROTECTED)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** rb_class_private_instance_methods + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(private_instance_methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyArray) ident(private_instance_methods)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(instance_methods)operator(()ident(args)operator(,) ident(PRIVATE)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_append_features + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(append_features)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(RubyModule) ident(append_features)operator(()ident(IRubyObject) ident(module)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(module) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) operator({) + comment(// MRI error message says Class, even though Module is ok ) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(module)operator(,)ident(getRuntime)operator(()operator(\))operator(.)ident(getClassClass)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(()operator(()ident(RubyModule)operator(\)) ident(module)operator(\))operator(.)ident(includeModule)operator(()local_variable(this)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_mod_extend_object + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(extend_object)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(extend_object)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(obj)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(includeModule)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + + comment(/** rb_mod_include + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(include)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(RubyModule) ident(include)operator(()ident(IRubyObject)type([]) ident(modules)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + comment(// MRI checks all types first:) + keyword(for) operator(()type(int) ident(i) operator(=) ident(modules)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + ident(IRubyObject) ident(obj) operator(=) ident(modules)operator([)ident(i)operator(])operator(;) + keyword(if) operator(()operator(!)ident(obj)operator(.)ident(isModule)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(obj)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getModule)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) ident(modules)operator(.)ident(length) operator(-) integer(1)operator(;) ident(i) operator(>=) integer(0)operator(;) ident(i)operator(--)operator(\)) operator({) + ident(modules)operator([)ident(i)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(append_features)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + ident(modules)operator([)ident(i)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(included)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(included)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(included)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(extended)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(extended)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(setVisibility)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) type(Visibility) ident(visibility)operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't change method visibility)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + comment(// Note: we change current frames visibility here because the methods which call) + comment(// this method are all "fast" (e.g. they do not created their own frame\).) + ident(context)operator(.)ident(setCurrentVisibility)operator(()ident(visibility)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(setMethodVisibility)operator(()ident(args)operator(,) ident(visibility)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_mod_public + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(public)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(writes) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(RubyModule) ident(rbPublic)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(setVisibility)operator(()ident(context)operator(,) ident(args)operator(,) ident(PUBLIC)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_mod_protected + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(protected)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(writes) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(RubyModule) ident(rbProtected)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(setVisibility)operator(()ident(context)operator(,) ident(args)operator(,) ident(PROTECTED)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_mod_private + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(private)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(writes) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(RubyModule) ident(rbPrivate)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(setVisibility)operator(()ident(context)operator(,) ident(args)operator(,) ident(PRIVATE)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_mod_modfunc + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(module_function)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(,) ident(writes) operator(=) ident(VISIBILITY)operator(\)) + directive(public) ident(RubyModule) ident(module_function)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't change method visibility)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(context)operator(.)ident(setCurrentVisibility)operator(()ident(MODULE_FUNCTION)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(setMethodVisibility)operator(()ident(args)operator(,) ident(PRIVATE)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + type(String) ident(name) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(;) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(name)operator(\))operator(;) + ident(assert) operator(!)ident(method)operator(.)ident(isUndefined)operator(()operator(\)) operator(:) string<delimiter(")content(undefined method ')delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(')delimiter(")>operator(;) + ident(getSingletonClass)operator(()operator(\))operator(.)ident(addMethod)operator(()ident(name)operator(,) keyword(new) ident(WrapperMethod)operator(()ident(getSingletonClass)operator(()operator(\))operator(,) ident(method)operator(,) ident(PUBLIC)operator(\))operator(\))operator(;) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(singleton_method_added)delimiter(")>operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastNewSymbol)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(method_added)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(method_added)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(nothing)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(method_removed)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(method_removed)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(nothing)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(method_undefined)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(method_undefined)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(nothing)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(method_defined?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(method_defined_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(symbol)operator(\)) operator({) + keyword(return) ident(isMethodBound)operator(()ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(,) keyword(true)operator(\)) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(public_method_defined?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(public_method_defined)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(symbol)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()operator(!)ident(method)operator(.)ident(isUndefined)operator(()operator(\)) operator(&&) ident(method)operator(.)ident(getVisibility)operator(()operator(\)) operator(==) ident(PUBLIC)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(protected_method_defined?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(protected_method_defined)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(symbol)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()operator(!)ident(method)operator(.)ident(isUndefined)operator(()operator(\)) operator(&&) ident(method)operator(.)ident(getVisibility)operator(()operator(\)) operator(==) ident(PROTECTED)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(private_method_defined?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(private_method_defined)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(symbol)operator(\)) operator({) + ident(DynamicMethod) ident(method) operator(=) ident(searchMethod)operator(()ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()operator(!)ident(method)operator(.)ident(isUndefined)operator(()operator(\)) operator(&&) ident(method)operator(.)ident(getVisibility)operator(()operator(\)) operator(==) ident(PRIVATE)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(public_class_method)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyModule) ident(public_class_method)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(getMetaClass)operator(()operator(\))operator(.)ident(setMethodVisibility)operator(()ident(args)operator(,) ident(PUBLIC)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(private_class_method)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyModule) ident(private_class_method)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(getMetaClass)operator(()operator(\))operator(.)ident(setMethodVisibility)operator(()ident(args)operator(,) ident(PRIVATE)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(alias_method)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(RubyModule) ident(alias_method)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(newId)operator(,) ident(IRubyObject) ident(oldId)operator(\)) operator({) + type(String) ident(newName) operator(=) ident(newId)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + ident(defineAlias)operator(()ident(newName)operator(,) ident(oldId)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + ident(RubySymbol) ident(newSym) operator(=) ident(newId) keyword(instanceof) ident(RubySymbol) operator(?) operator(()ident(RubySymbol)operator(\))ident(newId) operator(:) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newSymbol)operator(()ident(newName)operator(\))operator(;) + keyword(if) operator(()ident(isSingleton)operator(()operator(\))operator(\)) operator({) + operator(()operator(()ident(MetaClass)operator(\))local_variable(this)operator(\))operator(.)ident(getAttached)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(singleton_method_added)delimiter(")>operator(,) ident(newSym)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(method_added)delimiter(")>operator(,) ident(newSym)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(undef_method)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(RubyModule) ident(undef_method)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(undef)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(module_eval)delimiter(")>operator(,) string<delimiter(")content(class_eval)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(module_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(module_eval)delimiter(")>operator(,) string<delimiter(")content(class_eval)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(module_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(arg0)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(module_eval)delimiter(")>operator(,) string<delimiter(")content(class_eval)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(module_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(module_eval)delimiter(")>operator(,) string<delimiter(")content(class_eval)delimiter(")>operator(})operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(module_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@Deprecated) + directive(public) ident(IRubyObject) ident(module_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(remove_method)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(RubyModule) ident(remove_method)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(for)operator(()type(int) ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(args)operator(.)ident(length)operator(;)ident(i)operator(++)operator(\)) operator({) + ident(removeMethod)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(marshalTo)operator(()ident(RubyModule) ident(module)operator(,) ident(MarshalStream) ident(output)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(output)operator(.)ident(registerLinkTarget)operator(()ident(module)operator(\))operator(;) + ident(output)operator(.)ident(writeString)operator(()ident(MarshalStream)operator(.)ident(getPathFromClass)operator(()ident(module)operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyModule) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + type(String) ident(name) operator(=) ident(RubyString)operator(.)ident(byteListToString)operator(()ident(input)operator(.)ident(unmarshalString)operator(()operator(\))operator(\))operator(;) + ident(RubyModule) ident(result) operator(=) ident(UnmarshalStream)operator(.)ident(getModuleFromPath)operator(()ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(name)operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/* Module class methods */) + + comment(/** + * Return an array of nested modules or classes. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nesting)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(nesting)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyModule) ident(object) operator(=) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(;) + ident(StaticScope) ident(scope) operator(=) ident(context)operator(.)ident(getCurrentScope)operator(()operator(\))operator(.)ident(getStaticScope)operator(()operator(\))operator(;) + ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(for) operator(()ident(StaticScope) ident(current) operator(=) ident(scope)operator(;) ident(current)operator(.)ident(getModule)operator(()operator(\)) operator(!=) ident(object)operator(;) ident(current) operator(=) ident(current)operator(.)ident(getPreviousCRefScope)operator(()operator(\))operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(current)operator(.)ident(getModule)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) type(void) ident(doIncludeModule)operator(()ident(RubyModule) ident(includedModule)operator(\)) operator({) + type(boolean) ident(skip) operator(=) keyword(false)operator(;) + + ident(RubyModule) ident(currentModule) operator(=) local_variable(this)operator(;) + keyword(while) operator(()ident(includedModule) operator(!=) keyword(null)operator(\)) operator({) + + keyword(if) operator(()ident(getNonIncludedClass)operator(()operator(\)) operator(==) ident(includedModule)operator(.)ident(getNonIncludedClass)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(cyclic include detected)delimiter(")>operator(\))operator(;) + operator(}) + + type(boolean) ident(superclassSeen) operator(=) keyword(false)operator(;) + + comment(// scan class hierarchy for module) + keyword(for) operator(()ident(RubyModule) ident(superClass) operator(=) local_variable(this)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) ident(superClass) operator(!=) keyword(null)operator(;) ident(superClass) operator(=) ident(superClass)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(superClass) keyword(instanceof) ident(IncludedModuleWrapper)operator(\)) operator({) + keyword(if) operator(()ident(superClass)operator(.)ident(getNonIncludedClass)operator(()operator(\)) operator(==) ident(includedModule)operator(.)ident(getNonIncludedClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()operator(!)ident(superclassSeen)operator(\)) operator({) + ident(currentModule) operator(=) ident(superClass)operator(;) + operator(}) + ident(skip) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(superclassSeen) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()operator(!)ident(skip)operator(\)) operator({) + + comment(// blow away caches for any methods that are redefined by module) + ident(getRuntime)operator(()operator(\))operator(.)ident(getCacheMap)operator(()operator(\))operator(.)ident(moduleIncluded)operator(()ident(currentModule)operator(,) ident(includedModule)operator(\))operator(;) + + comment(// In the current logic, if we get here we know that module is not an) + comment(// IncludedModuleWrapper, so there's no need to fish out the delegate. But just) + comment(// in case the logic should change later, let's do it anyway:) + ident(currentModule)operator(.)ident(setSuperClass)operator(()keyword(new) ident(IncludedModuleWrapper)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(currentModule)operator(.)ident(getSuperClass)operator(()operator(\))operator(,) + ident(includedModule)operator(.)ident(getNonIncludedClass)operator(()operator(\))operator(\))operator(\))operator(;) + ident(currentModule) operator(=) ident(currentModule)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + operator(}) + + ident(includedModule) operator(=) ident(includedModule)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + ident(skip) operator(=) keyword(false)operator(;) + operator(}) + operator(}) + + + comment(//) + comment(////////////////// CLASS VARIABLE RUBY METHODS ////////////////) + comment(//) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(class_variable_defined?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(class_variable_defined_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(var)operator(\)) operator({) + type(String) ident(internedName) operator(=) ident(validateClassVariable)operator(()ident(var)operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(intern)operator(()operator(\))operator(\))operator(;) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + keyword(do) operator({) + keyword(if) operator(()ident(module)operator(.)ident(fastHasClassVariable)operator(()ident(internedName)operator(\))operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_mod_cvar_get + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(class_variable_get)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(class_variable_get)operator(()ident(IRubyObject) ident(var)operator(\)) operator({) + keyword(return) ident(fastGetClassVar)operator(()ident(validateClassVariable)operator(()ident(var)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(.)ident(intern)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_mod_cvar_set + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(class_variable_set)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(class_variable_set)operator(()ident(IRubyObject) ident(var)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(return) ident(fastSetClassVar)operator(()ident(validateClassVariable)operator(()ident(var)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(.)ident(intern)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_remove_cvar + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(remove_class_variable)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(remove_class_variable)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(name)operator(\)) operator({) + type(String) ident(javaName) operator(=) ident(validateClassVariable)operator(()ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + ident(IRubyObject) ident(value)operator(;) + + keyword(if) operator(()operator(()ident(value) operator(=) ident(deleteClassVariable)operator(()ident(javaName)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + keyword(if) operator(()ident(fastIsClassVarDefined)operator(()ident(javaName)operator(\))operator(\)) operator({) + keyword(throw) ident(cannotRemoveError)operator(()ident(javaName)operator(\))operator(;) + operator(}) + + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(class variable )delimiter(")> operator(+) ident(javaName) operator(+) string<delimiter(")content( not defined for )delimiter(")> operator(+) ident(getName)operator(()operator(\))operator(,) ident(javaName)operator(\))operator(;) + operator(}) + + comment(/** rb_mod_class_variables + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(class_variables)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(class_variables)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(Set)operator(<)type(String)operator(>) ident(names) operator(=) keyword(new) type(HashSet)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) ident(p) operator(!=) keyword(null)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(for) operator(()type(String) ident(name) operator(:) ident(p)operator(.)ident(getClassVariableNameList)operator(()operator(\))operator(\)) operator({) + ident(names)operator(.)ident(add)operator(()ident(name)operator(\))operator(;) + operator(}) + operator(}) + + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(ary) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(for) operator(()type(String) ident(name) operator(:) ident(names)operator(\)) operator({) + ident(ary)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(ary)operator(;) + operator(}) + + + comment(//) + comment(////////////////// CONSTANT RUBY METHODS ////////////////) + comment(//) + + comment(/** rb_mod_const_defined + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(const_defined?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(const_defined_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(symbol)operator(\)) operator({) + comment(// Note: includes part of fix for JRUBY-1339) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(fastIsConstantDefined)operator(()ident(validateConstant)operator(()ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(.)ident(intern)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_mod_const_get + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(const_get)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(const_get)operator(()ident(IRubyObject) ident(symbol)operator(\)) operator({) + keyword(return) ident(fastGetConstant)operator(()ident(validateConstant)operator(()ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(.)ident(intern)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_mod_const_set + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(const_set)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(const_set)operator(()ident(IRubyObject) ident(symbol)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(return) ident(fastSetConstant)operator(()ident(validateConstant)operator(()ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(.)ident(intern)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(remove_const)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(remove_const)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(name)operator(\)) operator({) + type(String) ident(id) operator(=) ident(validateConstant)operator(()ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + ident(IRubyObject) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(deleteConstant)operator(()ident(id)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(value) operator(!=) ident(UNDEF)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(removeAutoLoadFor)operator(()ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(id)operator(\))operator(;) + comment(// FIXME: I'm not sure this is right, but the old code returned) + comment(// the undef, which definitely isn't right...) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(hasConstantInHierarchy)operator(()ident(id)operator(\))operator(\)) operator({) + keyword(throw) ident(cannotRemoveError)operator(()ident(id)operator(\))operator(;) + operator(}) + + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(constant )delimiter(")> operator(+) ident(id) operator(+) string<delimiter(")content( not defined for )delimiter(")> operator(+) ident(getName)operator(()operator(\))operator(,) ident(id)operator(\))operator(;) + operator(}) + + directive(private) type(boolean) ident(hasConstantInHierarchy)operator(()directive(final) type(String) ident(name)operator(\)) operator({) + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) ident(p) operator(!=) keyword(null)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(p)operator(.)ident(hasConstant)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** + * Base implementation of Module#const_missing, throws NameError for specific missing constant. + * + * @param name The constant name which was found to be missing + * @return Nothing! Absolutely nothing! (though subclasses might choose to return something\) + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(const_missing)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(const_missing)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(name)operator(,) ident(Block) ident(block)operator(\)) operator({) + comment(/* Uninitialized constant */) + keyword(if) operator(()local_variable(this) operator(!=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(uninitialized constant )delimiter(")> operator(+) ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(,) string<delimiter(")delimiter(")> operator(+) ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(uninitialized constant )delimiter(")> operator(+) ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(,) ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_mod_constants + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(constants)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(constants)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(array) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + ident(RubyModule) ident(objectClass) operator(=) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getModule)operator(()operator(\)) operator(==) local_variable(this)operator(\)) operator({) + + keyword(for) operator(()type(String) ident(name) operator(:) ident(objectClass)operator(.)ident(getStoredConstantNameList)operator(()operator(\))operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + + operator(}) keyword(else) keyword(if) operator(()ident(objectClass) operator(==) local_variable(this)operator(\)) operator({) + + keyword(for) operator(()type(String) ident(name) operator(:) ident(getStoredConstantNameList)operator(()operator(\))operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + + operator(}) keyword(else) operator({) + type(Set)operator(<)type(String)operator(>) ident(names) operator(=) keyword(new) type(HashSet)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + keyword(for) operator(()ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) ident(p) operator(!=) keyword(null)operator(;) ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(objectClass) operator(!=) ident(p)operator(\)) operator({) + keyword(for) operator(()type(String) ident(name) operator(:) ident(p)operator(.)ident(getStoredConstantNameList)operator(()operator(\))operator(\)) operator({) + ident(names)operator(.)ident(add)operator(()ident(name)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(for) operator(()type(String) ident(name) operator(:) ident(names)operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(array)operator(;) + operator(}) + + + comment(//) + comment(////////////////// CLASS VARIABLE API METHODS ////////////////) + comment(//) + + comment(/** + * Set the named class variable to the given value, provided taint and freeze allow setting it. + * + * Ruby C equivalent = "rb_cvar_set" + * + * @param name The variable name to set + * @param value The value to set it to + */) + directive(public) ident(IRubyObject) ident(setClassVar)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + keyword(do) operator({) + keyword(if) operator(()ident(module)operator(.)ident(hasClassVariable)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(module)operator(.)ident(storeClassVariable)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(return) ident(storeClassVariable)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastSetClassVar)operator(()directive(final) type(String) ident(internedName)operator(,) directive(final) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + keyword(do) operator({) + keyword(if) operator(()ident(module)operator(.)ident(fastHasClassVariable)operator(()ident(internedName)operator(\))operator(\)) operator({) + keyword(return) ident(module)operator(.)ident(fastStoreClassVariable)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + operator(}) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(return) ident(fastStoreClassVariable)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** + * Retrieve the specified class variable, searching through this module, included modules, and supermodules. + * + * Ruby C equivalent = "rb_cvar_get" + * + * @param name The name of the variable to retrieve + * @return The variable's value, or throws NameError if not found + */) + directive(public) ident(IRubyObject) ident(getClassVar)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(name)operator(\))operator(;) + ident(IRubyObject) ident(value)operator(;) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + + keyword(do) operator({) + keyword(if) operator(()operator(()ident(value) operator(=) ident(module)operator(.)ident(variableTableFetch)operator(()ident(name)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) keyword(return) ident(value)operator(;) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(uninitialized class variable )delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content( in )delimiter(")> operator(+) ident(getName)operator(()operator(\))operator(,) ident(name)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastGetClassVar)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(internedName)operator(\))operator(;) + ident(IRubyObject) ident(value)operator(;) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + + keyword(do) operator({) + keyword(if) operator(()operator(()ident(value) operator(=) ident(module)operator(.)ident(variableTableFastFetch)operator(()ident(internedName)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) keyword(return) ident(value)operator(;) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(uninitialized class variable )delimiter(")> operator(+) ident(internedName) operator(+) string<delimiter(")content( in )delimiter(")> operator(+) ident(getName)operator(()operator(\))operator(,) ident(internedName)operator(\))operator(;) + operator(}) + + comment(/** + * Is class var defined? + * + * Ruby C equivalent = "rb_cvar_defined" + * + * @param name The class var to determine "is defined?" + * @return true if true, false if false + */) + directive(public) type(boolean) ident(isClassVarDefined)operator(()type(String) ident(name)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + keyword(do) operator({) + keyword(if) operator(()ident(module)operator(.)ident(hasClassVariable)operator(()ident(name)operator(\))operator(\)) keyword(return) keyword(true)operator(;) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) type(boolean) ident(fastIsClassVarDefined)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + keyword(do) operator({) + keyword(if) operator(()ident(module)operator(.)ident(fastHasClassVariable)operator(()ident(internedName)operator(\))operator(\)) keyword(return) keyword(true)operator(;) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(return) keyword(false)operator(;) + operator(}) + + + comment(/** rb_mod_remove_cvar + * + * FIXME: any good reason to have two identical methods? (same as remove_class_variable\) + */) + directive(public) ident(IRubyObject) ident(removeCvar)operator(()ident(IRubyObject) ident(name)operator(\)) operator({) comment(// Wrong Parameter ?) + type(String) ident(internedName) operator(=) ident(validateClassVariable)operator(()ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + ident(IRubyObject) ident(value)operator(;) + + keyword(if) operator(()operator(()ident(value) operator(=) ident(deleteClassVariable)operator(()ident(internedName)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + keyword(if) operator(()ident(fastIsClassVarDefined)operator(()ident(internedName)operator(\))operator(\)) operator({) + keyword(throw) ident(cannotRemoveError)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(class variable )delimiter(")> operator(+) ident(internedName) operator(+) string<delimiter(")content( not defined for )delimiter(")> operator(+) ident(getName)operator(()operator(\))operator(,) ident(internedName)operator(\))operator(;) + operator(}) + + + comment(//) + comment(////////////////// CONSTANT API METHODS ////////////////) + comment(//) + + directive(public) ident(IRubyObject) ident(getConstantAt)operator(()type(String) ident(name)operator(\)) operator({) + ident(IRubyObject) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(fetchConstant)operator(()ident(name)operator(\))operator(\)) operator(!=) ident(UNDEF)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + ident(deleteConstant)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(autoload)operator(()ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(name)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastGetConstantAt)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(IRubyObject) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(fastFetchConstant)operator(()ident(internedName)operator(\))operator(\)) operator(!=) ident(UNDEF)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + ident(deleteConstant)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(autoload)operator(()ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(internedName)operator(\))operator(;) + operator(}) + + comment(/** + * Retrieve the named constant, invoking 'const_missing' should that be appropriate. + * + * @param name The constant to retrieve + * @return The value for the constant, or null if not found + */) + directive(public) ident(IRubyObject) ident(getConstant)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(name)operator(\))operator(;) + type(boolean) ident(retryForModule) operator(=) keyword(false)operator(;) + ident(IRubyObject) ident(value)operator(;) + ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) + + ident(retry)operator(:) keyword(while) operator(()keyword(true)operator(\)) operator({) + keyword(while) operator(()ident(p) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()operator(()ident(value) operator(=) ident(p)operator(.)ident(constantTableFetch)operator(()ident(name)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(value) operator(!=) ident(UNDEF)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + ident(p)operator(.)ident(deleteConstant)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(autoload)operator(() + ident(p)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(name)operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + keyword(continue)operator(;) + operator(}) + ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(retryForModule) operator(&&) operator(!)ident(isClass)operator(()operator(\))operator(\)) operator({) + ident(retryForModule) operator(=) keyword(true)operator(;) + ident(p) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + keyword(continue) ident(retry)operator(;) + operator(}) + + keyword(break)operator(;) + operator(}) + + keyword(return) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) + string<delimiter(")content(const_missing)delimiter(")>operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newSymbol)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastGetConstant)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(internedName)operator(\))operator(;) + type(boolean) ident(retryForModule) operator(=) keyword(false)operator(;) + ident(IRubyObject) ident(value)operator(;) + ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) + + ident(retry)operator(:) keyword(while) operator(()keyword(true)operator(\)) operator({) + keyword(while) operator(()ident(p) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()operator(()ident(value) operator(=) ident(p)operator(.)ident(constantTableFastFetch)operator(()ident(internedName)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(value) operator(!=) ident(UNDEF)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + ident(p)operator(.)ident(deleteConstant)operator(()ident(internedName)operator(\))operator(;) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(autoload)operator(() + ident(p)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(internedName)operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + keyword(continue)operator(;) + operator(}) + ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(retryForModule) operator(&&) operator(!)ident(isClass)operator(()operator(\))operator(\)) operator({) + ident(retryForModule) operator(=) keyword(true)operator(;) + ident(p) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + keyword(continue) ident(retry)operator(;) + operator(}) + + keyword(break)operator(;) + operator(}) + + keyword(return) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) + string<delimiter(")content(const_missing)delimiter(")>operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(fastNewSymbol)operator(()ident(internedName)operator(\))operator(\))operator(;) + operator(}) + + comment(// not actually called anywhere (all known uses call the fast version\)) + directive(public) ident(IRubyObject) ident(getConstantFrom)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(fastGetConstantFrom)operator(()ident(name)operator(.)ident(intern)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastGetConstantFrom)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(internedName)operator(\))operator(;) + ident(RubyClass) ident(objectClass) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + ident(IRubyObject) ident(value)operator(;) + + ident(RubyModule) ident(p) operator(=) local_variable(this)operator(;) + + keyword(while) operator(()ident(p) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()operator(()ident(value) operator(=) ident(p)operator(.)ident(constantTableFastFetch)operator(()ident(internedName)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(value) operator(!=) ident(UNDEF)operator(\)) operator({) + keyword(if) operator(()ident(p) operator(==) ident(objectClass) operator(&&) local_variable(this) operator(!=) ident(objectClass)operator(\)) operator({) + type(String) ident(badCName) operator(=) ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(internedName)operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(CONSTANT_BAD_REFERENCE)operator(,) string<delimiter(")content(toplevel constant )delimiter(")> operator(+) + ident(internedName) operator(+) string<delimiter(")content( referenced by )delimiter(")> operator(+) ident(badCName)operator(,) ident(badCName)operator(\))operator(;) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + ident(p)operator(.)ident(deleteConstant)operator(()ident(internedName)operator(\))operator(;) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(autoload)operator(() + ident(p)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(internedName)operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + keyword(continue)operator(;) + operator(}) + ident(p) operator(=) ident(p)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) + string<delimiter(")content(const_missing)delimiter(")>operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(fastNewSymbol)operator(()ident(internedName)operator(\))operator(\))operator(;) + operator(}) + comment(/** + * Set the named constant on this module. Also, if the value provided is another Module and + * that module has not yet been named, assign it the specified name. + * + * @param name The name to assign + * @param value The value to assign to it; if an unnamed Module, also set its basename to name + * @return The result of setting the variable. + */) + directive(public) ident(IRubyObject) ident(setConstant)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(IRubyObject) ident(oldValue)operator(;) + keyword(if) operator(()operator(()ident(oldValue) operator(=) ident(fetchConstant)operator(()ident(name)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(oldValue) operator(==) ident(UNDEF)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(removeAutoLoadFor)operator(()ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(name)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(CONSTANT_ALREADY_INITIALIZED)operator(,) string<delimiter(")content(already initialized constant )delimiter(")> operator(+) ident(name)operator(,) ident(name)operator(\))operator(;) + operator(}) + operator(}) + + ident(storeConstant)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + + comment(// if adding a module under a constant name, set that module's basename to the constant name) + keyword(if) operator(()ident(value) keyword(instanceof) ident(RubyModule)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) operator(()ident(RubyModule)operator(\))ident(value)operator(;) + keyword(if) operator(()ident(module)operator(.)ident(getBaseName)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(module)operator(.)ident(setBaseName)operator(()ident(name)operator(\))operator(;) + ident(module)operator(.)ident(setParent)operator(()local_variable(this)operator(\))operator(;) + operator(}) + comment(/* + module.setParent(this\); + */) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastSetConstant)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(IRubyObject) ident(oldValue)operator(;) + keyword(if) operator(()operator(()ident(oldValue) operator(=) ident(fastFetchConstant)operator(()ident(internedName)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(oldValue) operator(==) ident(UNDEF)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(removeAutoLoadFor)operator(()ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(internedName)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(CONSTANT_ALREADY_INITIALIZED)operator(,) string<delimiter(")content(already initialized constant )delimiter(")> operator(+) ident(internedName)operator(,) ident(internedName)operator(\))operator(;) + operator(}) + operator(}) + + ident(fastStoreConstant)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + + comment(// if adding a module under a constant name, set that module's basename to the constant name) + keyword(if) operator(()ident(value) keyword(instanceof) ident(RubyModule)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) operator(()ident(RubyModule)operator(\))ident(value)operator(;) + keyword(if) operator(()ident(module)operator(.)ident(getBaseName)operator(()operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(module)operator(.)ident(setBaseName)operator(()ident(internedName)operator(\))operator(;) + ident(module)operator(.)ident(setParent)operator(()local_variable(this)operator(\))operator(;) + operator(}) + comment(/* + module.setParent(this\); + */) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + comment(/** rb_define_const + * + */) + directive(public) type(void) ident(defineConstant)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(value) operator(!=) keyword(null)operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getClassClass)operator(()operator(\))operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(IdUtil)operator(.)ident(isValidConstantName)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(bad constant name )delimiter(")> operator(+) ident(name)operator(,) ident(name)operator(\))operator(;) + operator(}) + + ident(setConstant)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(// Fix for JRUBY-1339 - search hierarchy for constant) + comment(/** rb_const_defined_at + * + */) + directive(public) type(boolean) ident(isConstantDefined)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(name)operator(\))operator(;) + type(boolean) ident(isObject) operator(=) local_variable(this) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + + keyword(do) operator({) + type(Object) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(module)operator(.)ident(constantTableFetch)operator(()ident(name)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(value) operator(!=) ident(UNDEF)operator(\)) keyword(return) keyword(true)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(autoloadFor)operator(() + ident(module)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(name)operator(\)) operator(!=) keyword(null)operator(;) + operator(}) + + operator(}) keyword(while) operator(()ident(isObject) operator(&&) operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null) operator(\))operator(;) + + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) type(boolean) ident(fastIsConstantDefined)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(internedName)operator(\))operator(;) + type(boolean) ident(isObject) operator(=) local_variable(this) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + + keyword(do) operator({) + type(Object) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(module)operator(.)ident(constantTableFastFetch)operator(()ident(internedName)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(value) operator(!=) ident(UNDEF)operator(\)) keyword(return) keyword(true)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(autoloadFor)operator(() + ident(module)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(::)delimiter(")> operator(+) ident(internedName)operator(\)) operator(!=) keyword(null)operator(;) + operator(}) + + operator(}) keyword(while) operator(()ident(isObject) operator(&&) operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null) operator(\))operator(;) + + keyword(return) keyword(false)operator(;) + operator(}) + + comment(//) + comment(////////////////// COMMON CONSTANT / CVAR METHODS ////////////////) + comment(//) + + directive(private) ident(RaiseException) ident(cannotRemoveError)operator(()type(String) ident(id)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(cannot remove )delimiter(")> operator(+) ident(id) operator(+) string<delimiter(")content( for )delimiter(")> operator(+) ident(getName)operator(()operator(\))operator(,) ident(id)operator(\))operator(;) + operator(}) + + + comment(//) + comment(////////////////// INTERNAL MODULE VARIABLE API METHODS ////////////////) + comment(//) + + comment(/** + * Behaves similarly to {@link #getClassVar(String\)}. Searches this + * class/module <em>and its ancestors</em> for the specified internal + * variable. + * + * @param name the internal variable name + * @return the value of the specified internal variable if found, else null + * @see #setInternalModuleVariable(String, IRubyObject\) + */) + directive(public) type(boolean) ident(hasInternalModuleVariable)operator(()directive(final) type(String) ident(name)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + keyword(do) operator({) + keyword(if) operator(()ident(module)operator(.)ident(hasInternalVariable)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(return) keyword(false)operator(;) + operator(}) + comment(/** + * Behaves similarly to {@link #getClassVar(String\)}. Searches this + * class/module <em>and its ancestors</em> for the specified internal + * variable. + * + * @param name the internal variable name + * @return the value of the specified internal variable if found, else null + * @see #setInternalModuleVariable(String, IRubyObject\) + */) + directive(public) ident(IRubyObject) ident(searchInternalModuleVariable)operator(()directive(final) type(String) ident(name)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + ident(IRubyObject) ident(value)operator(;) + keyword(do) operator({) + keyword(if) operator(()operator(()ident(value) operator(=) ident(module)operator(.)ident(getInternalVariable)operator(()ident(name)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** + * Behaves similarly to {@link #setClassVar(String, IRubyObject\)}. If the + * specified internal variable is found in this class/module <em>or an ancestor</em>, + * it is set where found. Otherwise it is set in this module. + * + * @param name the internal variable name + * @param value the internal variable value + * @see #searchInternalModuleVariable(String\) + */) + directive(public) type(void) ident(setInternalModuleVariable)operator(()directive(final) type(String) ident(name)operator(,) directive(final) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(RubyModule) ident(module) operator(=) local_variable(this)operator(;) + keyword(do) operator({) + keyword(if) operator(()ident(module)operator(.)ident(hasInternalVariable)operator(()ident(name)operator(\))operator(\)) operator({) + ident(module)operator(.)ident(setInternalVariable)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + keyword(return)operator(;) + operator(}) + operator(}) keyword(while) operator(()operator(()ident(module) operator(=) ident(module)operator(.)ident(getSuperClass)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\))operator(;) + + ident(setInternalVariable)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(//) + comment(////////////////// LOW-LEVEL CLASS VARIABLE INTERFACE ////////////////) + comment(//) + comment(// fetch/store/list class variables for this module) + comment(//) + + directive(public) type(boolean) ident(hasClassVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(variableTableContains)operator(()ident(name)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(fastHasClassVariable)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(variableTableFastContains)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fetchClassVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(variableTableFetch)operator(()ident(name)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastFetchClassVariable)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(variableTableFastFetch)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(storeClassVariable)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(name)operator(\)) operator(&&) ident(value) operator(!=) keyword(null)operator(;) + ident(ensureClassVariablesSettable)operator(()operator(\))operator(;) + keyword(return) ident(variableTableStore)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastStoreClassVariable)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(internedName)operator(\)) operator(&&) ident(value) operator(!=) keyword(null)operator(;) + ident(ensureClassVariablesSettable)operator(()operator(\))operator(;) + keyword(return) ident(variableTableFastStore)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(deleteClassVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(name)operator(\))operator(;) + ident(ensureClassVariablesSettable)operator(()operator(\))operator(;) + keyword(return) ident(variableTableRemove)operator(()ident(name)operator(\))operator(;) + operator(}) + + directive(public) type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(getClassVariableList)operator(()operator(\)) operator({) + type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>)operator(()operator(\))operator(;) + ident(VariableTableEntry)type([]) ident(table) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(==) keyword(null)operator(\)) ident(readValue) operator(=) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + ident(list)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()ident(e)operator(.)ident(name)operator(,) ident(readValue)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + directive(public) type(List)operator(<)type(String)operator(>) ident(getClassVariableNameList)operator(()operator(\)) operator({) + type(ArrayList)operator(<)type(String)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + ident(VariableTableEntry)type([]) ident(table) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(IdUtil)operator(.)ident(isClassVariable)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(e)operator(.)ident(name)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + directive(protected) directive(static) directive(final) type(String) ident(ERR_INSECURE_SET_CLASS_VAR) operator(=) string<delimiter(")content(Insecure: can't modify class variable)delimiter(")>operator(;) + directive(protected) directive(static) directive(final) type(String) ident(ERR_FROZEN_CVAR_TYPE) operator(=) string<delimiter(")content(class/module )delimiter(")>operator(;) + + directive(protected) directive(final) type(String) ident(validateClassVariable)operator(()type(String) ident(name)operator(\)) operator({) + keyword(if) operator(()ident(IdUtil)operator(.)ident(isValidClassVariableName)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(name)operator(;) + operator(}) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(`)delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(' is not allowed as a class variable name)delimiter(")>operator(,) ident(name)operator(\))operator(;) + operator(}) + + directive(protected) directive(final) type(void) ident(ensureClassVariablesSettable)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isFrozen)operator(()operator(\)) operator(&&) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(<) integer(4) operator(||) ident(isTaint)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(return)operator(;) + operator(}) + + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSecurityError)operator(()ident(ERR_INSECURE_SET_CONSTANT)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isFrozen)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyModule)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newFrozenError)operator(()ident(ERR_FROZEN_CONST_TYPE)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newFrozenError)operator(()string<delimiter(")delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(//) + comment(////////////////// LOW-LEVEL CONSTANT INTERFACE ////////////////) + comment(//) + comment(// fetch/store/list constants for this module) + comment(//) + + directive(public) type(boolean) ident(hasConstant)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(constantTableContains)operator(()ident(name)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(fastHasConstant)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(constantTableFastContains)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + comment(// returns the stored value without processing undefs (autoloads\)) + directive(public) ident(IRubyObject) ident(fetchConstant)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(constantTableFetch)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(// returns the stored value without processing undefs (autoloads\)) + directive(public) ident(IRubyObject) ident(fastFetchConstant)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(constantTableFastFetch)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(storeConstant)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(name)operator(\)) operator(&&) ident(value) operator(!=) keyword(null)operator(;) + ident(ensureConstantsSettable)operator(()operator(\))operator(;) + keyword(return) ident(constantTableStore)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(fastStoreConstant)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(internedName)operator(\)) operator(&&) ident(value) operator(!=) keyword(null)operator(;) + ident(ensureConstantsSettable)operator(()operator(\))operator(;) + keyword(return) ident(constantTableFastStore)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(// removes and returns the stored value without processing undefs (autoloads\)) + directive(public) ident(IRubyObject) ident(deleteConstant)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isConstant)operator(()ident(name)operator(\))operator(;) + ident(ensureConstantsSettable)operator(()operator(\))operator(;) + keyword(return) ident(constantTableRemove)operator(()ident(name)operator(\))operator(;) + operator(}) + + directive(public) type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(getStoredConstantList)operator(()operator(\)) operator({) + type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>)operator(()operator(\))operator(;) + ident(ConstantTableEntry)type([]) ident(table) operator(=) ident(constantTableGetTable)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(e)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + directive(public) type(List)operator(<)type(String)operator(>) ident(getStoredConstantNameList)operator(()operator(\)) operator({) + type(ArrayList)operator(<)type(String)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + ident(ConstantTableEntry)type([]) ident(table) operator(=) ident(constantTableGetTable)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(e)operator(.)ident(name)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + directive(protected) directive(static) directive(final) type(String) ident(ERR_INSECURE_SET_CONSTANT) operator(=) string<delimiter(")content(Insecure: can't modify constant)delimiter(")>operator(;) + directive(protected) directive(static) directive(final) type(String) ident(ERR_FROZEN_CONST_TYPE) operator(=) string<delimiter(")content(class/module )delimiter(")>operator(;) + + directive(protected) directive(final) type(String) ident(validateConstant)operator(()type(String) ident(name)operator(\)) operator({) + keyword(if) operator(()ident(IdUtil)operator(.)ident(isValidConstantName)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(name)operator(;) + operator(}) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(wrong constant name )delimiter(")> operator(+) ident(name)operator(,) ident(name)operator(\))operator(;) + operator(}) + + directive(protected) directive(final) type(void) ident(ensureConstantsSettable)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isFrozen)operator(()operator(\)) operator(&&) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(<) integer(4) operator(||) ident(isTaint)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(return)operator(;) + operator(}) + + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newSecurityError)operator(()ident(ERR_INSECURE_SET_CONSTANT)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isFrozen)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyModule)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newFrozenError)operator(()ident(ERR_FROZEN_CONST_TYPE)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newFrozenError)operator(()string<delimiter(")delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + + comment(//) + comment(////////////////// VARIABLE TABLE METHODS ////////////////) + comment(//) + comment(// Overridden to use variableWriteLock in place of synchronization ) + comment(//) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableStore)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + ident(VariableTableEntry) ident(e)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(table) operator(=) keyword(new) ident(VariableTableEntry)operator([)ident(VARIABLE_TABLE_DEFAULT_CAPACITY)operator(])operator(;) + ident(e) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(hash)operator(,) ident(name)operator(.)ident(intern)operator(()operator(\))operator(,) ident(value)operator(,) keyword(null)operator(\))operator(;) + ident(table)operator([)ident(hash) operator(&) operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(-) integer(1)operator(\))operator(]) operator(=) ident(e)operator(;) + ident(variableTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(*) ident(VARIABLE_TABLE_LOAD_FACTOR)operator(\))operator(;) + ident(variableTableSize) operator(=) integer(1)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) + keyword(return) ident(value)operator(;) + operator(}) + type(int) ident(potentialNewSize)operator(;) + keyword(if) operator(()operator(()ident(potentialNewSize) operator(=) ident(variableTableSize) operator(+) integer(1)operator(\)) operator(>) ident(variableTableThreshold)operator(\)) operator({) + ident(table) operator(=) ident(variableTableRehash)operator(()operator(\))operator(;) + operator(}) + type(int) ident(index)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(table)operator([)ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + ident(e)operator(.)ident(value) operator(=) ident(value)operator(;) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + comment(// external volatile value initialization intended to obviate the need for) + comment(// readValueUnderLock technique used in ConcurrentHashMap. may be a little) + comment(// slower, but better to pay a price on first write rather than all reads.) + ident(e) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(hash)operator(,) ident(name)operator(.)ident(intern)operator(()operator(\))operator(,) ident(value)operator(,) ident(table)operator([)ident(index)operator(])operator(\))operator(;) + ident(table)operator([)ident(index)operator(]) operator(=) ident(e)operator(;) + ident(variableTableSize) operator(=) ident(potentialNewSize)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) comment(// write-volatile) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableFastStore)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( not interned)delimiter(")>operator(;) + type(int) ident(hash) operator(=) ident(internedName)operator(.)ident(hashCode)operator(()operator(\))operator(;) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + ident(VariableTableEntry) ident(e)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(table) operator(=) keyword(new) ident(VariableTableEntry)operator([)ident(VARIABLE_TABLE_DEFAULT_CAPACITY)operator(])operator(;) + ident(e) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(hash)operator(,) ident(internedName)operator(,) ident(value)operator(,) keyword(null)operator(\))operator(;) + ident(table)operator([)ident(hash) operator(&) operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(-) integer(1)operator(\))operator(]) operator(=) ident(e)operator(;) + ident(variableTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(*) ident(VARIABLE_TABLE_LOAD_FACTOR)operator(\))operator(;) + ident(variableTableSize) operator(=) integer(1)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) + keyword(return) ident(value)operator(;) + operator(}) + type(int) ident(potentialNewSize)operator(;) + keyword(if) operator(()operator(()ident(potentialNewSize) operator(=) ident(variableTableSize) operator(+) integer(1)operator(\)) operator(>) ident(variableTableThreshold)operator(\)) operator({) + ident(table) operator(=) ident(variableTableRehash)operator(()operator(\))operator(;) + operator(}) + type(int) ident(index)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(table)operator([)ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + ident(e)operator(.)ident(value) operator(=) ident(value)operator(;) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + comment(// external volatile value initialization intended to obviate the need for) + comment(// readValueUnderLock technique used in ConcurrentHashMap. may be a little) + comment(// slower, but better to pay a price on first write rather than all reads.) + ident(e) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(hash)operator(,) ident(internedName)operator(,) ident(value)operator(,) ident(table)operator([)ident(index)operator(])operator(\))operator(;) + ident(table)operator([)ident(index)operator(]) operator(=) ident(e)operator(;) + ident(variableTableSize) operator(=) ident(potentialNewSize)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) comment(// write-volatile) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableRemove)operator(()type(String) ident(name)operator(\)) operator({) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + type(int) ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(;) + ident(VariableTableEntry) ident(first) operator(=) ident(table)operator([)ident(index)operator(])operator(;) + ident(VariableTableEntry) ident(e)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(first)operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + ident(IRubyObject) ident(oldValue) operator(=) ident(e)operator(.)ident(value)operator(;) + comment(// All entries following removed node can stay) + comment(// in list, but all preceding ones need to be) + comment(// cloned.) + ident(VariableTableEntry) ident(newFirst) operator(=) ident(e)operator(.)ident(next)operator(;) + keyword(for) operator(()ident(VariableTableEntry) ident(p) operator(=) ident(first)operator(;) ident(p) operator(!=) ident(e)operator(;) ident(p) operator(=) ident(p)operator(.)ident(next)operator(\)) operator({) + ident(newFirst) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(p)operator(.)ident(hash)operator(,) ident(p)operator(.)ident(name)operator(,) ident(p)operator(.)ident(value)operator(,) ident(newFirst)operator(\))operator(;) + operator(}) + ident(table)operator([)ident(index)operator(]) operator(=) ident(newFirst)operator(;) + ident(variableTableSize)operator(--)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) comment(// write-volatile ) + keyword(return) ident(oldValue)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@Override) + directive(protected) ident(IRubyObject) ident(variableTableReadLocked)operator(()ident(VariableTableEntry) ident(entry)operator(\)) operator({) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + keyword(return) ident(entry)operator(.)ident(value)operator(;) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Override) + directive(protected) type(void) ident(variableTableSync)operator(()type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(vars)operator(\)) operator({) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(variableTableSize) operator(=) integer(0)operator(;) + ident(variableTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(*) ident(VARIABLE_TABLE_LOAD_FACTOR)operator(\))operator(;) + ident(variableTable) operator(=) keyword(new) ident(VariableTableEntry)operator([)ident(VARIABLE_TABLE_DEFAULT_CAPACITY)operator(])operator(;) + keyword(for) operator(()ident(Variable)operator(<)ident(IRubyObject)operator(>) ident(var) operator(:) ident(vars)operator(\)) operator({) + ident(assert) operator(!)ident(var)operator(.)ident(isConstant)operator(()operator(\)) operator(&&) ident(var)operator(.)ident(getValue)operator(()operator(\)) operator(!=) keyword(null)operator(;) + ident(variableTableStore)operator(()ident(var)operator(.)ident(getName)operator(()operator(\))operator(,) ident(var)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Override) + directive(public) type(void) ident(syncVariables)operator(()type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(variables)operator(\)) operator({) + type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(constants) operator(=) keyword(new) type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>)operator(()ident(variables)operator(.)ident(size)operator(()operator(\))operator(\))operator(;) + ident(Variable)operator(<)ident(IRubyObject)operator(>) ident(var)operator(;) + keyword(for) operator(()type(Iterator)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(iter) operator(=) ident(variables)operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;) operator(\)) operator({) + keyword(if) operator(()operator(()ident(var) operator(=) ident(iter)operator(.)ident(next)operator(()operator(\))operator(\))operator(.)ident(isConstant)operator(()operator(\))operator(\)) operator({) + ident(constants)operator(.)ident(add)operator(()ident(var)operator(\))operator(;) + ident(iter)operator(.)ident(remove)operator(()operator(\))operator(;) + operator(}) + operator(}) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(variableTableSync)operator(()ident(variables)operator(\))operator(;) + ident(constantTableSync)operator(()ident(constants)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Override) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + annotation(@Deprecated) comment(// born deprecated) + directive(public) type(Map) ident(getVariableMap)operator(()operator(\)) operator({) + type(Map) ident(map) operator(=) ident(variableTableGetMap)operator(()operator(\))operator(;) + ident(constantTableGetMap)operator(()ident(map)operator(\))operator(;) + keyword(return) ident(map)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(hasVariables)operator(()operator(\)) operator({) + keyword(return) ident(variableTableGetSize)operator(()operator(\)) operator(>) integer(0) operator(||) ident(constantTableGetSize)operator(()operator(\)) operator(>) integer(0)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getVariableCount)operator(()operator(\)) operator({) + keyword(return) ident(variableTableGetSize)operator(()operator(\)) operator(+) ident(constantTableGetSize)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(getVariableList)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(vtable) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + ident(ConstantTableEntry)type([]) ident(ctable) operator(=) ident(constantTableGetTable)operator(()operator(\))operator(;) + type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>)operator(()operator(\))operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(vtable)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(vtable)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(==) keyword(null)operator(\)) ident(readValue) operator(=) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + ident(list)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()ident(e)operator(.)ident(name)operator(,) ident(readValue)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) ident(ctable)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) ident(ctable)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(e)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(List)operator(<)type(String)operator(>) ident(getVariableNameList)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(vtable) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + ident(ConstantTableEntry)type([]) ident(ctable) operator(=) ident(constantTableGetTable)operator(()operator(\))operator(;) + type(ArrayList)operator(<)type(String)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(vtable)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(vtable)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(e)operator(.)ident(name)operator(\))operator(;) + operator(}) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) ident(ctable)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) ident(ctable)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(e)operator(.)ident(name)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + + comment(//) + comment(////////////////// CONSTANT TABLE METHODS, ETC. ////////////////) + comment(//) + + directive(protected) directive(static) directive(final) type(int) ident(CONSTANT_TABLE_DEFAULT_CAPACITY) operator(=) integer(8)operator(;) comment(// MUST be power of 2!) + directive(protected) directive(static) directive(final) type(int) ident(CONSTANT_TABLE_MAXIMUM_CAPACITY) operator(=) integer(1) operator(<)operator(<) integer(30)operator(;) + directive(protected) directive(static) directive(final) type(float) ident(CONSTANT_TABLE_LOAD_FACTOR) operator(=) float(0.75f)operator(;) + + directive(protected) directive(static) directive(final) type(class) class(ConstantTableEntry) directive(implements) ident(Variable)operator(<)ident(IRubyObject)operator(>) operator({) + directive(final) type(int) ident(hash)operator(;) + directive(final) type(String) ident(name)operator(;) + directive(final) ident(IRubyObject) ident(value)operator(;) + directive(final) ident(ConstantTableEntry) ident(next)operator(;) + + comment(// constant table entry values are final; if a constant is redefined, the) + comment(// entry will be removed and replaced with a new entry.) + ident(ConstantTableEntry)operator(() + type(int) ident(hash)operator(,) + type(String) ident(name)operator(,) + ident(IRubyObject) ident(value)operator(,) + ident(ConstantTableEntry) ident(next)operator(\)) operator({) + local_variable(this)operator(.)ident(hash) operator(=) ident(hash)operator(;) + local_variable(this)operator(.)ident(name) operator(=) ident(name)operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + local_variable(this)operator(.)ident(next) operator(=) ident(next)operator(;) + operator(}) + + directive(public) type(String) ident(getName)operator(()operator(\)) operator({) + keyword(return) ident(name)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(getValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + directive(public) directive(final) type(boolean) ident(isClassVariable)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) directive(final) type(boolean) ident(isConstant)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + directive(public) directive(final) type(boolean) ident(isInstanceVariable)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(public) directive(final) type(boolean) ident(isRubyVariable)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + + directive(protected) type(boolean) ident(constantTableContains)operator(()type(String) ident(name)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) operator(()ident(table) operator(=) ident(constantTable)operator(\))operator([)ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(protected) type(boolean) ident(constantTableFastContains)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) operator(()ident(table) operator(=) ident(constantTable)operator(\))operator([)ident(internedName)operator(.)ident(hashCode)operator(()operator(\)) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(constantTableFetch)operator(()type(String) ident(name)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) operator(()ident(table) operator(=) ident(constantTable)operator(\))operator([)ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(e)operator(.)ident(value)operator(;) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(constantTableFastFetch)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) operator(()ident(table) operator(=) ident(constantTable)operator(\))operator([)ident(internedName)operator(.)ident(hashCode)operator(()operator(\)) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + keyword(return) ident(e)operator(.)ident(value)operator(;) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(constantTableStore)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + ident(ConstantTableEntry) ident(e)operator(;) + ident(ConstantTableEntry) ident(first)operator(;) + type(int) ident(potentialNewSize)operator(;) + keyword(if) operator(()operator(()ident(potentialNewSize) operator(=) ident(constantTableSize) operator(+) integer(1)operator(\)) operator(>) ident(constantTableThreshold)operator(\)) operator({) + ident(table) operator(=) ident(constantTableRehash)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(table) operator(=) ident(constantTable)operator(;) + operator(}) + type(int) ident(index)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(first) operator(=) ident(table)operator([)ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + comment(// if value is unchanged, do nothing) + keyword(if) operator(()ident(value) operator(==) ident(e)operator(.)ident(value)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + comment(// create new entry, prepend to any trailing entries) + ident(ConstantTableEntry) ident(newFirst) operator(=) keyword(new) ident(ConstantTableEntry)operator(()ident(e)operator(.)ident(hash)operator(,) ident(e)operator(.)ident(name)operator(,) ident(value)operator(,) ident(e)operator(.)ident(next)operator(\))operator(;) + comment(// all entries before this one must be cloned) + keyword(for) operator(()ident(ConstantTableEntry) ident(n) operator(=) ident(first)operator(;) ident(n) operator(!=) ident(e)operator(;) ident(n) operator(=) ident(n)operator(.)ident(next)operator(\)) operator({) + ident(newFirst) operator(=) keyword(new) ident(ConstantTableEntry)operator(()ident(n)operator(.)ident(hash)operator(,) ident(n)operator(.)ident(name)operator(,) ident(n)operator(.)ident(value)operator(,) ident(newFirst)operator(\))operator(;) + operator(}) + ident(table)operator([)ident(index)operator(]) operator(=) ident(newFirst)operator(;) + ident(constantTable) operator(=) ident(table)operator(;) comment(// write-volatile) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + ident(table)operator([)ident(index)operator(]) operator(=) keyword(new) ident(ConstantTableEntry)operator(()ident(hash)operator(,) ident(name)operator(.)ident(intern)operator(()operator(\))operator(,) ident(value)operator(,) ident(table)operator([)ident(index)operator(])operator(\))operator(;) + ident(constantTableSize) operator(=) ident(potentialNewSize)operator(;) + ident(constantTable) operator(=) ident(table)operator(;) comment(// write-volatile) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(constantTableFastStore)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( not interned)delimiter(")>operator(;) + type(int) ident(hash) operator(=) ident(internedName)operator(.)ident(hashCode)operator(()operator(\))operator(;) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + ident(ConstantTableEntry) ident(e)operator(;) + ident(ConstantTableEntry) ident(first)operator(;) + type(int) ident(potentialNewSize)operator(;) + keyword(if) operator(()operator(()ident(potentialNewSize) operator(=) ident(constantTableSize) operator(+) integer(1)operator(\)) operator(>) ident(constantTableThreshold)operator(\)) operator({) + ident(table) operator(=) ident(constantTableRehash)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(table) operator(=) ident(constantTable)operator(;) + operator(}) + type(int) ident(index)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(first) operator(=) ident(table)operator([)ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + comment(// if value is unchanged, do nothing) + keyword(if) operator(()ident(value) operator(==) ident(e)operator(.)ident(value)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + comment(// create new entry, prepend to any trailing entries) + ident(ConstantTableEntry) ident(newFirst) operator(=) keyword(new) ident(ConstantTableEntry)operator(()ident(e)operator(.)ident(hash)operator(,) ident(e)operator(.)ident(name)operator(,) ident(value)operator(,) ident(e)operator(.)ident(next)operator(\))operator(;) + comment(// all entries before this one must be cloned) + keyword(for) operator(()ident(ConstantTableEntry) ident(n) operator(=) ident(first)operator(;) ident(n) operator(!=) ident(e)operator(;) ident(n) operator(=) ident(n)operator(.)ident(next)operator(\)) operator({) + ident(newFirst) operator(=) keyword(new) ident(ConstantTableEntry)operator(()ident(n)operator(.)ident(hash)operator(,) ident(n)operator(.)ident(name)operator(,) ident(n)operator(.)ident(value)operator(,) ident(newFirst)operator(\))operator(;) + operator(}) + ident(table)operator([)ident(index)operator(]) operator(=) ident(newFirst)operator(;) + ident(constantTable) operator(=) ident(table)operator(;) comment(// write-volatile) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + ident(table)operator([)ident(index)operator(]) operator(=) keyword(new) ident(ConstantTableEntry)operator(()ident(hash)operator(,) ident(internedName)operator(,) ident(value)operator(,) ident(table)operator([)ident(index)operator(])operator(\))operator(;) + ident(constantTableSize) operator(=) ident(potentialNewSize)operator(;) + ident(constantTable) operator(=) ident(table)operator(;) comment(// write-volatile) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(constantTableRemove)operator(()type(String) ident(name)operator(\)) operator({) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(constantTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + type(int) ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(;) + ident(ConstantTableEntry) ident(first) operator(=) ident(table)operator([)ident(index)operator(])operator(;) + ident(ConstantTableEntry) ident(e)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(first)operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + ident(IRubyObject) ident(oldValue) operator(=) ident(e)operator(.)ident(value)operator(;) + comment(// All entries following removed node can stay) + comment(// in list, but all preceding ones need to be) + comment(// cloned.) + ident(ConstantTableEntry) ident(newFirst) operator(=) ident(e)operator(.)ident(next)operator(;) + keyword(for) operator(()ident(ConstantTableEntry) ident(p) operator(=) ident(first)operator(;) ident(p) operator(!=) ident(e)operator(;) ident(p) operator(=) ident(p)operator(.)ident(next)operator(\)) operator({) + ident(newFirst) operator(=) keyword(new) ident(ConstantTableEntry)operator(()ident(p)operator(.)ident(hash)operator(,) ident(p)operator(.)ident(name)operator(,) ident(p)operator(.)ident(value)operator(,) ident(newFirst)operator(\))operator(;) + operator(}) + ident(table)operator([)ident(index)operator(]) operator(=) ident(newFirst)operator(;) + ident(constantTableSize)operator(--)operator(;) + ident(constantTable) operator(=) ident(table)operator(;) comment(// write-volatile ) + keyword(return) ident(oldValue)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + + directive(protected) ident(ConstantTableEntry)type([]) ident(constantTableGetTable)operator(()operator(\)) operator({) + keyword(return) ident(constantTable)operator(;) + operator(}) + + directive(protected) type(int) ident(constantTableGetSize)operator(()operator(\)) operator({) + keyword(if) operator(()ident(constantTable) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(constantTableSize)operator(;) + operator(}) + keyword(return) integer(0)operator(;) + operator(}) + + directive(protected) type(void) ident(constantTableSync)operator(()type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(vars)operator(\)) operator({) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(variableWriteLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(constantTableSize) operator(=) integer(0)operator(;) + ident(constantTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(CONSTANT_TABLE_DEFAULT_CAPACITY) operator(*) ident(CONSTANT_TABLE_LOAD_FACTOR)operator(\))operator(;) + ident(constantTable) operator(=) keyword(new) ident(ConstantTableEntry)operator([)ident(CONSTANT_TABLE_DEFAULT_CAPACITY)operator(])operator(;) + keyword(for) operator(()ident(Variable)operator(<)ident(IRubyObject)operator(>) ident(var) operator(:) ident(vars)operator(\)) operator({) + ident(assert) ident(var)operator(.)ident(isConstant)operator(()operator(\)) operator(&&) ident(var)operator(.)ident(getValue)operator(()operator(\)) operator(!=) keyword(null)operator(;) + ident(constantTableStore)operator(()ident(var)operator(.)ident(getName)operator(()operator(\))operator(,) ident(var)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(// MUST be called from synchronized/locked block!) + comment(// should only be called by constantTableStore/constantTableFastStore) + directive(private) directive(final) ident(ConstantTableEntry)type([]) ident(constantTableRehash)operator(()operator(\)) operator({) + ident(ConstantTableEntry)type([]) ident(oldTable) operator(=) ident(constantTable)operator(;) + type(int) ident(oldCapacity)operator(;) + keyword(if) operator(()operator(()ident(oldCapacity) operator(=) ident(oldTable)operator(.)ident(length)operator(\)) operator(>=) ident(CONSTANT_TABLE_MAXIMUM_CAPACITY)operator(\)) operator({) + keyword(return) ident(oldTable)operator(;) + operator(}) + + type(int) ident(newCapacity) operator(=) ident(oldCapacity) operator(<)operator(<) integer(1)operator(;) + ident(ConstantTableEntry)type([]) ident(newTable) operator(=) keyword(new) ident(ConstantTableEntry)operator([)ident(newCapacity)operator(])operator(;) + ident(constantTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(newCapacity) operator(*) ident(CONSTANT_TABLE_LOAD_FACTOR)operator(\))operator(;) + type(int) ident(sizeMask) operator(=) ident(newCapacity) operator(-) integer(1)operator(;) + ident(ConstantTableEntry) ident(e)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(oldCapacity)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + comment(// We need to guarantee that any existing reads of old Map can) + comment(// proceed. So we cannot yet null out each bin.) + ident(e) operator(=) ident(oldTable)operator([)ident(i)operator(])operator(;) + + keyword(if) operator(()ident(e) operator(!=) keyword(null)operator(\)) operator({) + ident(ConstantTableEntry) ident(next) operator(=) ident(e)operator(.)ident(next)operator(;) + type(int) ident(idx) operator(=) ident(e)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + + comment(// Single node on list) + keyword(if) operator(()ident(next) operator(==) keyword(null)operator(\)) + ident(newTable)operator([)ident(idx)operator(]) operator(=) ident(e)operator(;) + + keyword(else) operator({) + comment(// Reuse trailing consecutive sequence at same slot) + ident(ConstantTableEntry) ident(lastRun) operator(=) ident(e)operator(;) + type(int) ident(lastIdx) operator(=) ident(idx)operator(;) + keyword(for) operator(()ident(ConstantTableEntry) ident(last) operator(=) ident(next)operator(;) + ident(last) operator(!=) keyword(null)operator(;) + ident(last) operator(=) ident(last)operator(.)ident(next)operator(\)) operator({) + type(int) ident(k) operator(=) ident(last)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + keyword(if) operator(()ident(k) operator(!=) ident(lastIdx)operator(\)) operator({) + ident(lastIdx) operator(=) ident(k)operator(;) + ident(lastRun) operator(=) ident(last)operator(;) + operator(}) + operator(}) + ident(newTable)operator([)ident(lastIdx)operator(]) operator(=) ident(lastRun)operator(;) + + comment(// Clone all remaining nodes) + keyword(for) operator(()ident(ConstantTableEntry) ident(p) operator(=) ident(e)operator(;) ident(p) operator(!=) ident(lastRun)operator(;) ident(p) operator(=) ident(p)operator(.)ident(next)operator(\)) operator({) + type(int) ident(k) operator(=) ident(p)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + ident(ConstantTableEntry) ident(m) operator(=) keyword(new) ident(ConstantTableEntry)operator(()ident(p)operator(.)ident(hash)operator(,) ident(p)operator(.)ident(name)operator(,) ident(p)operator(.)ident(value)operator(,) ident(newTable)operator([)ident(k)operator(])operator(\))operator(;) + ident(newTable)operator([)ident(k)operator(]) operator(=) ident(m)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + ident(constantTable) operator(=) ident(newTable)operator(;) + keyword(return) ident(newTable)operator(;) + operator(}) + + + comment(/** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + directive(protected) type(Map) ident(constantTableGetMap)operator(()operator(\)) operator({) + type(HashMap) ident(map) operator(=) keyword(new) type(HashMap)operator(()operator(\))operator(;) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(constantTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(map)operator(.)ident(put)operator(()ident(e)operator(.)ident(name)operator(,) ident(e)operator(.)ident(value)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(map)operator(;) + operator(}) + + comment(/** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + directive(protected) type(Map) ident(constantTableGetMap)operator(()type(Map) ident(map)operator(\)) operator({) + ident(ConstantTableEntry)type([]) ident(table)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(constantTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(ConstantTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(map)operator(.)ident(put)operator(()ident(e)operator(.)ident(name)operator(,) ident(e)operator(.)ident(value)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(map)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) + +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(static) include(org.jruby.runtime.Visibility.PRIVATE)operator(;) +keyword(import) include(static) include(org.jruby.runtime.Visibility.PROTECTED)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.exceptions.JumpException)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallType)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.Sprintf)operator(;) + +comment(/** + * @author Anders Bengtsson + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(NameError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(StandardError)delimiter(")>operator(\)) +directive(public) type(class) class(RubyNameError) directive(extends) ident(RubyException) operator({) + directive(private) ident(IRubyObject) ident(name)operator(;) + + comment(/** + * Nested class whose instances act as thunks reacting to to_str method + * called from (Exception#to_str, Exception#message\) + * MRI equivalent: rb_cNameErrorMesg, class name: "message", construction method: "!", + * to_str implementation: "name_err_mesg_to_str" + * + * TODO: this class should not be lookupable + */) + annotation(@JRubyClass)operator(()ident(name) operator(=) string<delimiter(")content(NameError::Message)delimiter(")>operator(,) ident(parent) operator(=) string<delimiter(")content(Object)delimiter(")>operator(\)) + directive(public) directive(static) directive(final) type(class) class(RubyNameErrorMessage) directive(extends) ident(RubyObject) operator({) + + directive(static) ident(ObjectAllocator) ident(NAMEERRORMESSAGE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(IRubyObject) ident(dummy) operator(=) keyword(new) ident(RubyObject)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\))operator(;) + keyword(return) keyword(new) ident(RubyNameErrorMessage)operator(()ident(runtime)operator(,) ident(dummy)operator(,) ident(dummy)operator(,) type(Visibility)operator(.)ident(PRIVATE)operator(,) ident(CallType)operator(.)ident(VARIABLE)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(final) ident(IRubyObject) ident(object)operator(;) + directive(private) directive(final) ident(IRubyObject) ident(method)operator(;) + directive(private) directive(final) type(Visibility) ident(visibility)operator(;) + directive(private) directive(final) ident(CallType) ident(callType)operator(;) + + ident(RubyNameErrorMessage)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(object)operator(,) ident(IRubyObject) ident(method)operator(,) type(Visibility) ident(visibility)operator(,) ident(CallType) ident(callType)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getNameErrorMessage)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + local_variable(this)operator(.)ident(object) operator(=) ident(object)operator(;) + local_variable(this)operator(.)ident(method) operator(=) ident(method)operator(;) + local_variable(this)operator(.)ident(visibility) operator(=) ident(visibility)operator(;) + local_variable(this)operator(.)ident(callType) operator(=) ident(callType)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(_load)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(load)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(arg)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(_dump)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(dump)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(to_str)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_str)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_str)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(String) ident(format) operator(=) keyword(null)operator(;) + + keyword(if) operator(()ident(visibility) operator(==) ident(PRIVATE)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(private method `%s' called for %s)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(visibility) operator(==) ident(PROTECTED)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(protected method `%s' called for %s)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(callType) operator(==) ident(CallType)operator(.)ident(VARIABLE)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(undefined local variable or method `%s' for %s)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(callType) operator(==) ident(CallType)operator(.)ident(SUPER)operator(\)) operator({) + ident(format) operator(=) string<delimiter(")content(super: no superclass method `%s')delimiter(")>operator(;) + operator(}) + + keyword(if) operator(()ident(format) operator(==) keyword(null)operator(\)) ident(format) operator(=) string<delimiter(")content(undefined method `%s' for %s)delimiter(")>operator(;) + + type(String) ident(description) operator(=) keyword(null)operator(;) + + keyword(if) operator(()ident(object)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(description) operator(=) string<delimiter(")content(nil)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(object) keyword(instanceof) ident(RubyBoolean) operator(&&) ident(object)operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(description) operator(=) string<delimiter(")content(true)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(object) keyword(instanceof) ident(RubyBoolean) operator(&&) operator(!)ident(object)operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(description) operator(=) string<delimiter(")content(false)delimiter(")>operator(;) + operator(}) keyword(else) operator({) + keyword(try) operator({) + ident(description) operator(=) ident(RubyObject)operator(.)ident(inspect)operator(()ident(context)operator(,) ident(object)operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()ident(JumpException) ident(e)operator(\)) operator({)operator(}) + + keyword(if) operator(()ident(description) operator(==) keyword(null) operator(||) ident(description)operator(.)ident(length)operator(()operator(\)) operator(>) integer(65)operator(\)) ident(description) operator(=) ident(object)operator(.)ident(anyToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(description)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0) operator(||) operator(()ident(description)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(&&) ident(description)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(!=) string<delimiter(')content(#)delimiter(')>operator(\))operator(\)) operator({) + ident(description) operator(=) ident(description) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(object)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(;) + operator(}) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(arr) operator(=) ident(runtime)operator(.)ident(newArray)operator(()ident(method)operator(,) ident(runtime)operator(.)ident(newString)operator(()ident(description)operator(\))operator(\))operator(;) + ident(RubyString) ident(msg) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(Sprintf)operator(.)ident(sprintf)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(format)operator(\))operator(,) ident(arr)operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(object)operator(.)ident(isTaint)operator(()operator(\))operator(\)) ident(msg)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(msg)operator(;) + operator(}) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(NAMEERROR_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyNameError)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createNameErrorClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(standardErrorClass)operator(\)) operator({) + ident(RubyClass) ident(nameErrorClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(NameError)delimiter(")>operator(,) ident(standardErrorClass)operator(,) ident(NAMEERROR_ALLOCATOR)operator(\))operator(;) + ident(nameErrorClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyNameError)operator(.)ident(class)operator(\))operator(;) + keyword(return) ident(nameErrorClass)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(createNameErrorMessageClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(nameErrorClass)operator(\)) operator({) + ident(RubyClass) ident(messageClass) operator(=) ident(nameErrorClass)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Message)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(RubyNameErrorMessage)operator(.)ident(NAMEERRORMESSAGE_ALLOCATOR)operator(\))operator(;) + ident(messageClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyNameErrorMessage)operator(.)ident(class)operator(\))operator(;) + keyword(return) ident(messageClass)operator(;) + operator(}) + + directive(protected) ident(RubyNameError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) ident(exceptionClass)operator(,) ident(exceptionClass)operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RubyNameError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(,) type(String) ident(message)operator(\)) operator({) + local_variable(this)operator(()ident(runtime)operator(,) ident(exceptionClass)operator(,) ident(message)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyNameError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(,) type(String) ident(message)operator(,) type(String) ident(name)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(exceptionClass)operator(,) ident(message)operator(\))operator(;) + local_variable(this)operator(.)ident(name) operator(=) ident(name) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(newString)operator(()ident(name)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exception)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyException) ident(newRubyNameError)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyClass) ident(klass) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + + ident(RubyException) ident(newError) operator(=) operator(()ident(RubyException)operator(\)) ident(klass)operator(.)ident(allocate)operator(()operator(\))operator(;) + + ident(newError)operator(.)ident(callInit)operator(()ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + + keyword(return) ident(newError)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(name) operator(=) ident(args)operator([)ident(args)operator(.)ident(length) operator(-) integer(1)operator(])operator(;) + type(int) ident(newLength) operator(=) ident(args)operator(.)ident(length) operator(>) integer(2) operator(?) ident(args)operator(.)ident(length) operator(-) integer(2) operator(:) ident(args)operator(.)ident(length) operator(-) integer(1)operator(;) + + ident(IRubyObject) type([])ident(tmpArgs) operator(=) keyword(new) ident(IRubyObject)operator([)ident(newLength)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(0)operator(,) ident(tmpArgs)operator(,) integer(0)operator(,) ident(newLength)operator(\))operator(;) + ident(args) operator(=) ident(tmpArgs)operator(;) + operator(}) keyword(else) operator({) + ident(name) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + local_variable(super)operator(.)ident(initialize)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(if) operator(()ident(message)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(message)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + ident(RubyString) ident(str) operator(=) ident(message)operator(.)ident(convertToString)operator(()operator(\))operator(;) + keyword(if) operator(()ident(str) operator(!=) ident(message)operator(\)) ident(message) operator(=) ident(str)operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(message)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(message)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(name)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(name)operator(()operator(\)) operator({) + keyword(return) ident(name)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(NilClass)delimiter(")>operator(\)) +directive(public) type(class) class(RubyNil) directive(extends) ident(RubyObject) operator({) + directive(public) ident(RubyNil)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getNilClass)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + ident(flags) operator(|=) ident(NIL_F) operator(|) ident(FALSE_F)operator(;) + operator(}) + + directive(public) directive(static) directive(final) ident(ObjectAllocator) ident(NIL_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createNilClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(nilClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(NilClass)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(NIL_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setNilClass)operator(()ident(nilClass)operator(\))operator(;) + ident(nilClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(NIL)operator(;) + + ident(nilClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyNil)operator(.)ident(class)operator(\))operator(;) + + ident(nilClass)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(undefineMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + + comment(// FIXME: This is causing a verification error for some reason) + comment(//nilClass.dispatcher = callbackFactory.createDispatcher(nilClass\);) + + keyword(return) ident(nilClass)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(NIL)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isImmediate)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyClass) ident(getSingletonClass)operator(()operator(\)) operator({) + keyword(return) ident(metaClass)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(Class)operator(<)operator(?)operator(>) ident(getJavaClass)operator(()operator(\)) operator({) + keyword(return) type(void)operator(.)ident(class)operator(;) + operator(}) + + comment(// Methods of the Nil Class (nil_*\):) + + comment(/** nil_to_i + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_i)delimiter(")>operator(\)) + directive(public) directive(static) ident(RubyFixnum) ident(to_i)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * nil_to_f + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_f)delimiter(")>operator(\)) + directive(public) directive(static) ident(RubyFloat) ident(to_f)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) float(0.0)ident(D)operator(\))operator(;) + operator(}) + + comment(/** nil_to_s + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) directive(static) ident(RubyString) ident(to_s)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** nil_to_a + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_a)delimiter(")>operator(\)) + directive(public) directive(static) ident(RubyArray) ident(to_a)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newEmptyArray)operator(()operator(\))operator(;) + operator(}) + + comment(/** nil_inspect + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) directive(static) ident(RubyString) ident(inspect)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(nil)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** nil_type + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(type)delimiter(")>operator(\)) + directive(public) directive(static) ident(RubyClass) ident(type)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNilClass)operator(()operator(\))operator(;) + operator(}) + + comment(/** nil_and + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(&)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(op_and)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** nil_or + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(|)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(op_or)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(obj)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** nil_xor + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(^)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(op_xor)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(obj)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nil?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(nil_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyFixnum) ident(id)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(4)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(taint)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(freeze)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** nilclass_to_c + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_c)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(to_c)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(RubyComplex)operator(.)ident(newComplexCanonicalize)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** nilclass_to_r + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_r)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(to_r)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalCanonicalize)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Koichiro Ohba <koichiro@meadowy.org> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.nio.ByteBuffer)operator(;) +keyword(import) include(java.nio.CharBuffer)operator(;) +keyword(import) include(java.nio.charset.CharacterCodingException)operator(;) +keyword(import) include(java.nio.charset.Charset)operator(;) +keyword(import) include(java.nio.charset.CharsetDecoder)operator(;) +keyword(import) include(java.nio.charset.CharsetEncoder)operator(;) +keyword(import) include(java.nio.charset.UnsupportedCharsetException)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) + +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.KCode)operator(;) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(NKF)delimiter(")>operator(\)) +directive(public) type(class) class(RubyNKF) operator({) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(AUTO) operator(=) keyword(new) ident(NKFCharset)operator(()integer(0)operator(,) string<delimiter(")content(x-JISAutoDetect)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(JIS) operator(=) keyword(new) ident(NKFCharset)operator(()integer(1)operator(,) string<delimiter(")content(iso-2022-jp)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(EUC) operator(=) keyword(new) ident(NKFCharset)operator(()integer(2)operator(,) string<delimiter(")content(EUC-JP)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(SJIS) operator(=) keyword(new) ident(NKFCharset)operator(()integer(3)operator(,) string<delimiter(")content(Windows-31J)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(BINARY) operator(=) keyword(new) ident(NKFCharset)operator(()integer(4)operator(,) keyword(null)operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(NOCONV) operator(=) keyword(new) ident(NKFCharset)operator(()integer(4)operator(,) keyword(null)operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(UNKNOWN) operator(=) keyword(new) ident(NKFCharset)operator(()integer(0)operator(,) keyword(null)operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(ASCII) operator(=) keyword(new) ident(NKFCharset)operator(()integer(5)operator(,) string<delimiter(")content(iso-8859-1)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(UTF8) operator(=) keyword(new) ident(NKFCharset)operator(()integer(6)operator(,) string<delimiter(")content(UTF-8)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(UTF16) operator(=) keyword(new) ident(NKFCharset)operator(()integer(8)operator(,) string<delimiter(")content(UTF-16)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(UTF32) operator(=) keyword(new) ident(NKFCharset)operator(()integer(12)operator(,) string<delimiter(")content(UTF-32)delimiter(")>operator(\))operator(;) + directive(public) directive(static) directive(final) ident(NKFCharset) ident(OTHER) operator(=) keyword(new) ident(NKFCharset)operator(()integer(16)operator(,) keyword(null)operator(\))operator(;) + + directive(public) directive(static) type(class) class(NKFCharset) operator({) + directive(private) directive(final) type(int) ident(value)operator(;) + directive(private) directive(final) type(String) ident(charset)operator(;) + + directive(public) ident(NKFCharset)operator(()type(int) ident(v)operator(,) type(String) ident(c)operator(\)) operator({) + ident(value) operator(=) ident(v)operator(;) + ident(charset) operator(=) ident(c)operator(;) + operator(}) + + directive(public) type(int) ident(getValue)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + directive(public) type(String) ident(getCharset)operator(()operator(\)) operator({) + keyword(return) ident(charset)operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(void) ident(createNKF)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(nkfModule) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(NKF)delimiter(")>operator(\))operator(;) + + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(AUTO)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(AUTO)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(JIS)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(JIS)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(EUC)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(EUC)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(SJIS)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(SJIS)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(BINARY)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(BINARY)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(NOCONV)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(NOCONV)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(UNKNOWN)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(UNKNOWN)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(ASCII)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(ASCII)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(UTF8)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(UTF8)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(UTF16)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(UTF16)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(UTF32)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(UTF32)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + ident(nkfModule)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OTHER)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(OTHER)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(\))operator(;) + + ident(RubyString) ident(version) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(2.0.7 (JRuby 2007-05-11\))delimiter(")>operator(\))operator(;) + ident(RubyString) ident(nkfVersion) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(2.0.7)delimiter(")>operator(\))operator(;) + ident(RubyString) ident(nkfDate) operator(=) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(2007-05-11)delimiter(")>operator(\))operator(;) + + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + + ident(version)operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(nkfVersion)operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(nkfDate)operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + + ident(nkfModule)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyNKF)operator(.)ident(class)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(guess)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(guess)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(s)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(s)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(s)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( into String)delimiter(")>operator(\))operator(;) + operator(}) + ident(ByteList) ident(bytes) operator(=) ident(s)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + type(ByteBuffer) ident(buf) operator(=) type(ByteBuffer)operator(.)ident(wrap)operator(()ident(bytes)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(begin)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + type(CharsetDecoder) ident(decoder) operator(=) type(Charset)operator(.)ident(forName)operator(()string<delimiter(")content(x-JISAutoDetect)delimiter(")>operator(\))operator(.)ident(newDecoder)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(decoder)operator(.)ident(decode)operator(()ident(buf)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(CharacterCodingException) ident(e)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(UNKNOWN)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(decoder)operator(.)ident(isCharsetDetected)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(UNKNOWN)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + type(Charset) ident(charset) operator(=) ident(decoder)operator(.)ident(detectedCharset)operator(()operator(\))operator(;) + type(String) ident(name) operator(=) ident(charset)operator(.)ident(name)operator(()operator(\))operator(;) +comment(// System.out.println("detect: " + name + "\\n"\);) + keyword(if) operator(()string<delimiter(")content(Shift_JIS)delimiter(")>operator(.)ident(equals)operator(()ident(name)operator(\))operator(\)) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(SJIS)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()string<delimiter(")content(windows-31j)delimiter(")>operator(.)ident(equals)operator(()ident(name)operator(\))operator(\)) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(SJIS)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + keyword(else) keyword(if) operator(()string<delimiter(")content(EUC-JP)delimiter(")>operator(.)ident(equals)operator(()ident(name)operator(\))operator(\)) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(EUC)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + keyword(else) keyword(if) operator(()string<delimiter(")content(ISO-2022-JP)delimiter(")>operator(.)ident(equals)operator(()ident(name)operator(\))operator(\)) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(JIS)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + keyword(else) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(UNKNOWN)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(guess1)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(guess1)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + keyword(return) ident(guess)operator(()ident(context)operator(,) ident(recv)operator(,) ident(str)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(guess2)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(guess2)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + keyword(return) ident(guess)operator(()ident(context)operator(,) ident(recv)operator(,) ident(str)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nkf)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(nkf)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(opt)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(opt)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(opt)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( into String)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(str)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't convert )delimiter(")> operator(+) ident(str)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( into String)delimiter(")>operator(\))operator(;) + operator(}) + + type(Map)operator(<)type(String)operator(,) ident(NKFCharset)operator(>) ident(options) operator(=) ident(parseOpt)operator(()ident(opt)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + + ident(NKFCharset) ident(nc) operator(=) ident(options)operator(.)ident(get)operator(()string<delimiter(")content(input)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(nc)operator(.)ident(getValue)operator(()operator(\)) operator(==) ident(AUTO)operator(.)ident(getValue)operator(()operator(\))operator(\)) operator({) + ident(KCode) ident(kcode) operator(=) ident(runtime)operator(.)ident(getKCode)operator(()operator(\))operator(;) + keyword(if) operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(SJIS)operator(\)) operator({) + ident(nc) operator(=) ident(SJIS)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(EUC)operator(\)) operator({) + ident(nc) operator(=) ident(EUC)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(UTF8)operator(\)) operator({) + ident(nc) operator(=) ident(UTF8)operator(;) + operator(}) + operator(}) + type(String) ident(decodeCharset) operator(=) ident(nc)operator(.)ident(getCharset)operator(()operator(\))operator(;) + type(String) ident(encodeCharset) operator(=) ident(options)operator(.)ident(get)operator(()string<delimiter(")content(output)delimiter(")>operator(\))operator(.)ident(getCharset)operator(()operator(\))operator(;) + + keyword(return) ident(convert)operator(()ident(context)operator(,) ident(decodeCharset)operator(,) ident(encodeCharset)operator(,) ident(str)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(decodeCharset)operator(,) + type(String) ident(encodeCharset)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(CharsetDecoder) ident(decoder)operator(;) + type(CharsetEncoder) ident(encoder)operator(;) + keyword(try) operator({) + ident(decoder) operator(=) type(Charset)operator(.)ident(forName)operator(()ident(decodeCharset)operator(\))operator(.)ident(newDecoder)operator(()operator(\))operator(;) + ident(encoder) operator(=) type(Charset)operator(.)ident(forName)operator(()ident(encodeCharset)operator(\))operator(.)ident(newEncoder)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(UnsupportedCharsetException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid encoding)delimiter(")>operator(\))operator(;) + operator(}) + + ident(ByteList) ident(bytes) operator(=) ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + type(ByteBuffer) ident(buf) operator(=) type(ByteBuffer)operator(.)ident(wrap)operator(()ident(bytes)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(begin)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + keyword(try) operator({) + type(CharBuffer) ident(cbuf) operator(=) ident(decoder)operator(.)ident(decode)operator(()ident(buf)operator(\))operator(;) + ident(buf) operator(=) ident(encoder)operator(.)ident(encode)operator(()ident(cbuf)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(CharacterCodingException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid encoding)delimiter(")>operator(\))operator(;) + operator(}) + type(byte)type([]) ident(arr) operator(=) ident(buf)operator(.)ident(array)operator(()operator(\))operator(;) + + keyword(return) ident(runtime)operator(.)ident(newString)operator(()keyword(new) ident(ByteList)operator(()ident(arr)operator(,) integer(0)operator(,) ident(buf)operator(.)ident(limit)operator(()operator(\))operator(\))operator(\))operator(;) + + operator(}) + + directive(private) directive(static) type(int) ident(optionUTF)operator(()type(String) ident(s)operator(,) type(int) ident(i)operator(\)) operator({) + type(int) ident(n) operator(=) integer(8)operator(;) + keyword(if) operator(()ident(i)operator(+)integer(1) operator(<) ident(s)operator(.)ident(length)operator(()operator(\)) operator(&&) type(Character)operator(.)ident(isDigit)operator(()ident(s)operator(.)ident(charAt)operator(()ident(i)operator(+)integer(1)operator(\))operator(\))operator(\)) operator({) + ident(n) operator(=) type(Character)operator(.)ident(digit)operator(()ident(s)operator(.)ident(charAt)operator(()ident(i)operator(+)integer(1)operator(\))operator(,) integer(10)operator(\))operator(;) + keyword(if) operator(()ident(i)operator(+)integer(2) operator(<) ident(s)operator(.)ident(length)operator(()operator(\)) operator(&&) type(Character)operator(.)ident(isDigit)operator(()ident(s)operator(.)ident(charAt)operator(()ident(i)operator(+)integer(2)operator(\))operator(\))operator(\)) operator({) + ident(n) operator(*=) integer(10)operator(;) + ident(n) operator(+=) type(Character)operator(.)ident(digit)operator(()ident(s)operator(.)ident(charAt)operator(()ident(i)operator(+)integer(2)operator(\))operator(,) integer(10)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(n)operator(;) + operator(}) + + directive(private) directive(static) type(Map)operator(<)type(String)operator(,) ident(NKFCharset)operator(>) ident(parseOpt)operator(()type(String) ident(s)operator(\)) operator({) + type(Map)operator(<)type(String)operator(,) ident(NKFCharset)operator(>) ident(options) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) ident(NKFCharset)operator(>)operator(()operator(\))operator(;) + + comment(// default options) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(input)delimiter(")>operator(,) ident(AUTO)operator(\))operator(;) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(output)delimiter(")>operator(,) ident(JIS)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(s)operator(.)ident(length)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(switch) operator(()ident(s)operator(.)ident(charAt)operator(()ident(i)operator(\))operator(\)) operator({) + keyword(case) string<delimiter(')content(b)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(u)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(j)delimiter(')>operator(:) comment(// iso-2022-jp) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(output)delimiter(")>operator(,) ident(JIS)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(s)delimiter(')>operator(:) comment(// Shift_JIS) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(output)delimiter(")>operator(,) ident(SJIS)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(e)delimiter(')>operator(:) comment(// EUC-JP) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(output)delimiter(")>operator(,) ident(EUC)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(w)delimiter(')>operator(:) comment(// UTF-8) + operator({) + type(int) ident(n) operator(=) ident(optionUTF)operator(()ident(s)operator(,) ident(i)operator(\))operator(;) + keyword(if) operator(()ident(n) operator(==) integer(32)operator(\)) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(output)delimiter(")>operator(,) ident(UTF32)operator(\))operator(;) + keyword(else) keyword(if) operator(()ident(n) operator(==) integer(16)operator(\)) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(output)delimiter(")>operator(,) ident(UTF16)operator(\))operator(;) + keyword(else) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(output)delimiter(")>operator(,) ident(UTF8)operator(\))operator(;) + operator(}) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(J)delimiter(')>operator(:) comment(// iso-2022-jp) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(input)delimiter(")>operator(,) ident(JIS)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(S)delimiter(')>operator(:) comment(// Shift_JIS) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(input)delimiter(")>operator(,) ident(SJIS)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(E)delimiter(')>operator(:) comment(// EUC-JP) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(input)delimiter(")>operator(,) ident(EUC)operator(\))operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(W)delimiter(')>operator(:) comment(// UTF-8) + operator({) + type(int) ident(n) operator(=) ident(optionUTF)operator(()ident(s)operator(,) ident(i)operator(\))operator(;) + keyword(if) operator(()ident(n) operator(==) integer(32)operator(\)) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(input)delimiter(")>operator(,) ident(UTF32)operator(\))operator(;) + keyword(else) keyword(if) operator(()ident(n) operator(==) integer(16)operator(\)) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(input)delimiter(")>operator(,) ident(UTF16)operator(\))operator(;) + keyword(else) + ident(options)operator(.)ident(put)operator(()string<delimiter(")content(input)delimiter(")>operator(,) ident(UTF8)operator(\))operator(;) + operator(}) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(t)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(r)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(h)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(m)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(M)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(l)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(f)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(F)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(Z)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(X)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(x)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(B)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(T)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(d)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(c)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(I)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(L)delimiter(')>operator(:) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) + keyword(if) operator(()ident(s)operator(.)ident(charAt)operator(()ident(i)operator(+)integer(1)operator(\)) operator(==) string<delimiter(')content(-)delimiter(')>operator(\)) operator({) + comment(// long name option) + operator(}) + keyword(default)operator(:) + operator(}) + operator(}) + keyword(return) ident(options)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) + +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(NoMethodError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(NameError)delimiter(")>operator(\)) +directive(public) type(class) class(RubyNoMethodError) directive(extends) ident(RubyNameError) operator({) + directive(private) ident(IRubyObject) ident(args)operator(;) + + directive(private) directive(static) directive(final) ident(ObjectAllocator) ident(NOMETHODERROR_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyNoMethodError)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createNoMethodErrorClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(nameErrorClass)operator(\)) operator({) + ident(RubyClass) ident(noMethodErrorClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(NoMethodError)delimiter(")>operator(,) ident(nameErrorClass)operator(,) ident(NOMETHODERROR_ALLOCATOR)operator(\))operator(;) + + ident(noMethodErrorClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyNoMethodError)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(noMethodErrorClass)operator(;) + operator(}) + + directive(protected) ident(RubyNoMethodError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(exceptionClass)operator(,) ident(exceptionClass)operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + local_variable(this)operator(.)ident(args) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(RubyNoMethodError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(,) type(String) ident(message)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(args)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(exceptionClass)operator(,) ident(message)operator(,) ident(name)operator(\))operator(;) + local_variable(this)operator(.)ident(args) operator(=) ident(args)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(3)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(2)operator(\)) operator({) + local_variable(this)operator(.)ident(args) operator(=) ident(args)operator([)ident(args)operator(.)ident(length) operator(-) integer(1)operator(])operator(;) + ident(IRubyObject) type([])ident(tmpArgs) operator(=) keyword(new) ident(IRubyObject)operator([)ident(args)operator(.)ident(length) operator(-) integer(1)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(0)operator(,) ident(tmpArgs)operator(,) integer(0)operator(,) ident(tmpArgs)operator(.)ident(length)operator(\))operator(;) + ident(args) operator(=) ident(tmpArgs)operator(;) + operator(}) keyword(else) operator({) + local_variable(this)operator(.)ident(args) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + local_variable(super)operator(.)ident(initialize)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(args)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(args)operator(()operator(\)) operator({) + keyword(return) ident(args)operator(;) + operator(}) + +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2006 Antti Karanta <Antti.Karanta@napa.fi> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(static) include(org.jruby.util.Numeric.f_abs)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_arg)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_negative_p)operator(;) + +keyword(import) include(java.math.BigInteger)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.Convert)operator(;) + +comment(/** + * Base class for all numerical types in ruby. + */) +comment(// TODO: Numeric.new works in Ruby and it does here too. However trying to use) +comment(// that instance in a numeric operation should generate an ArgumentError. Doing) +comment(// this seems so pathological I do not see the need to fix this now.) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Numeric)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Comparable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyNumeric) directive(extends) ident(RubyObject) operator({) + + directive(public) directive(static) ident(RubyClass) ident(createNumericClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(numeric) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Numeric)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(NUMERIC_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setNumeric)operator(()ident(numeric)operator(\))operator(;) + + ident(numeric)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyNumeric)operator(;) + operator(}) + operator(})operator(;) + + ident(numeric)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getComparable)operator(()operator(\))operator(\))operator(;) + ident(numeric)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyNumeric)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(numeric)operator(;) + operator(}) + + directive(protected) directive(static) directive(final) ident(ObjectAllocator) ident(NUMERIC_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyNumeric)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) type(double) ident(DBL_EPSILON)operator(=)float(2.2204460492503131e-16)operator(;) + + directive(private) directive(static) ident(IRubyObject) ident(convertToNum)operator(()type(double) ident(val)operator(,) ident(Ruby) ident(runtime)operator(\)) operator({) + + keyword(if) operator(()ident(val) operator(>=) operator(()type(double)operator(\)) ident(RubyFixnum)operator(.)ident(MAX) operator(||) ident(val) operator(<) operator(()type(double)operator(\)) ident(RubyFixnum)operator(.)ident(MIN)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(runtime)operator(,) ident(val)operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) operator(()type(long)operator(\)) ident(val)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyNumeric)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(metaClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(metaClass)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyNumeric)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(metaClass)operator(,) type(boolean) ident(useObjectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(metaClass)operator(,) ident(useObjectSpace)operator(\))operator(;) + operator(}) + + comment(// The implementations of these are all bonus (see TODO above\) I was going) + comment(// to throw an error from these, but it appears to be the wrong place to) + comment(// do it.) + directive(public) type(double) ident(getDoubleValue)operator(()operator(\)) operator({) + keyword(return) integer(0)operator(;) + operator(}) + + directive(public) type(long) ident(getLongValue)operator(()operator(\)) operator({) + keyword(return) integer(0)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyNumeric) ident(newNumeric)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyNumeric)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getNumeric)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/* ================ + * Utility Methods + * ================ + */) + + comment(/** rb_num2int, NUM2INT + * + */) + directive(public) directive(static) type(int) ident(num2int)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + type(long) ident(num) operator(=) ident(num2long)operator(()ident(arg)operator(\))operator(;) + + ident(checkInt)operator(()ident(arg)operator(,) ident(num)operator(\))operator(;) + keyword(return) operator(()type(int)operator(\))ident(num)operator(;) + operator(}) + + comment(/** check_int + * + */) + directive(public) directive(static) type(void) ident(checkInt)operator(()ident(IRubyObject) ident(arg)operator(,) type(long) ident(num)operator(\))operator({) + type(String) ident(s)operator(;) + keyword(if) operator(()ident(num) operator(<) type(Integer)operator(.)ident(MIN_VALUE)operator(\)) operator({) + ident(s) operator(=) string<delimiter(")content(small)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(num) operator(>) type(Integer)operator(.)ident(MAX_VALUE)operator(\)) operator({) + ident(s) operator(=) string<delimiter(")content(big)delimiter(")>operator(;) + operator(}) keyword(else) operator({) + keyword(return)operator(;) + operator(}) + keyword(throw) ident(arg)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(integer )delimiter(")> operator(+) ident(num) operator(+) string<delimiter(")content( too )delimiter(")> operator(+) ident(s) operator(+) string<delimiter(")content( to convert to `int')delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * NUM2CHR + */) + directive(public) directive(static) type(byte) ident(num2chr)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyString)operator(\)) operator({) + type(String) ident(value) operator(=) operator(()operator(()ident(RubyString)operator(\)) ident(arg)operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(value) operator(!=) keyword(null) operator(&&) ident(value)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0)operator(\)) keyword(return) operator(()type(byte)operator(\)) ident(value)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(;) + operator(}) + + keyword(return) operator(()type(byte)operator(\)) ident(num2int)operator(()ident(arg)operator(\))operator(;) + operator(}) + + comment(/** rb_num2long and FIX2LONG (numeric.c\) + * + */) + directive(public) directive(static) type(long) ident(num2long)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyFixnum)operator(\)) ident(arg)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(arg)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(arg)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(no implicit conversion from nil to integer)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + type(double) ident(aFloat) operator(=) operator(()operator(()ident(RubyFloat)operator(\)) ident(arg)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(aFloat) operator(<=) operator(()type(double)operator(\)) type(Long)operator(.)ident(MAX_VALUE) operator(&&) ident(aFloat) operator(>=) operator(()type(double)operator(\)) type(Long)operator(.)ident(MIN_VALUE)operator(\)) operator({) + keyword(return) operator(()type(long)operator(\)) ident(aFloat)operator(;) + operator(}) keyword(else) operator({) + comment(// TODO: number formatting here, MRI uses "%-.10g", 1.4 API is a must?) + keyword(throw) ident(arg)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(float )delimiter(")> operator(+) ident(aFloat) operator(+) string<delimiter(")content( out of range of integer)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(big2long)operator(()operator(()ident(RubyBignum)operator(\)) ident(arg)operator(\))operator(;) + operator(}) + keyword(return) ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_dbl2big + LONG2FIX at once (numeric.c\) + * + */) + directive(public) directive(static) ident(IRubyObject) ident(dbl2num)operator(()ident(Ruby) ident(runtime)operator(,) type(double) ident(val)operator(\)) operator({) + keyword(if) operator(()type(Double)operator(.)ident(isInfinite)operator(()ident(val)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newFloatDomainError)operator(()ident(val) operator(<) integer(0) operator(?) string<delimiter(")content(-Infinity)delimiter(")> operator(:) string<delimiter(")content(Infinity)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(val)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newFloatDomainError)operator(()string<delimiter(")content(NaN)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(convertToNum)operator(()ident(val)operator(,)ident(runtime)operator(\))operator(;) + operator(}) + + comment(/** rb_num2dbl and NUM2DBL + * + */) + directive(public) directive(static) type(double) ident(num2dbl)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyFloat)operator(\)) ident(arg)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(throw) ident(arg)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(no implicit conversion to float from string)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(arg) operator(==) ident(arg)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(arg)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(no implicit conversion to float from nil)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(arg)operator(.)ident(convertToFloat)operator(()operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_dbl_cmp (numeric.c\) + * + */) + directive(public) directive(static) ident(IRubyObject) ident(dbl_cmp)operator(()ident(Ruby) ident(runtime)operator(,) type(double) ident(a)operator(,) type(double) ident(b)operator(\)) operator({) + keyword(if) operator(()type(Double)operator(.)ident(isNaN)operator(()ident(a)operator(\)) operator(||) type(Double)operator(.)ident(isNaN)operator(()ident(b)operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(a) operator(>) ident(b)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(a) operator(<) ident(b)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(long) ident(fix2long)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyFixnum)operator(\)) ident(arg)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(int) ident(fix2int)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + type(long) ident(num) operator(=) ident(arg) keyword(instanceof) ident(RubyFixnum) operator(?) ident(fix2long)operator(()ident(arg)operator(\)) operator(:) ident(num2long)operator(()ident(arg)operator(\))operator(;) + + ident(checkInt)operator(()ident(arg)operator(,) ident(num)operator(\))operator(;) + keyword(return) operator(()type(int)operator(\)) ident(num)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyInteger) ident(str2inum)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyString) ident(str)operator(,) type(int) ident(base)operator(\)) operator({) + keyword(return) ident(str2inum)operator(()ident(runtime)operator(,)ident(str)operator(,)ident(base)operator(,)keyword(false)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyNumeric) ident(int2fix)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(val)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,)ident(val)operator(\))operator(;) + operator(}) + + comment(/** rb_num2fix + * + */) + directive(public) directive(static) ident(IRubyObject) ident(num2fix)operator(()ident(IRubyObject) ident(val)operator(\)) operator({) + keyword(if) operator(()ident(val) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(return) ident(val)operator(;) + operator(}) + keyword(if) operator(()ident(val) keyword(instanceof) ident(RubyBignum)operator(\)) operator({) + comment(// any BigInteger is bigger than Fixnum and we don't have FIXABLE) + keyword(throw) ident(val)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(integer )delimiter(")> operator(+) ident(val) operator(+) string<delimiter(")content( out of range of fixnum)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(val)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(num2long)operator(()ident(val)operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Converts a string representation of an integer to the integer value. + * Parsing starts at the beginning of the string (after leading and + * trailing whitespace have been removed\), and stops at the end or at the + * first character that can't be part of an integer. Leading signs are + * allowed. If <code>base</code> is zero, strings that begin with '0[xX]', + * '0[bB]', or '0' (optionally preceded by a sign\) will be treated as hex, + * binary, or octal numbers, respectively. If a non-zero base is given, + * only the prefix (if any\) that is appropriate to that base will be + * parsed correctly. For example, if the base is zero or 16, the string + * "0xff" will be converted to 256, but if the base is 10, it will come out + * as zero, since 'x' is not a valid decimal digit. If the string fails + * to parse as a number, zero is returned. + * + * @param runtime the ruby runtime + * @param str the string to be converted + * @param base the expected base of the number (for example, 2, 8, 10, 16\), + * or 0 if the method should determine the base automatically + * (defaults to 10\). Values 0 and 2-36 are permitted. Any other + * value will result in an ArgumentError. + * @param strict if true, enforce the strict criteria for String encoding of + * numeric values, as required by Integer('n'\), and raise an + * exception when those criteria are not met. Otherwise, allow + * lax expression of values, as permitted by String#to_i, and + * return a value in almost all cases (excepting illegal radix\). + * TODO: describe the rules/criteria + * @return a RubyFixnum or (if necessary\) a RubyBignum representing + * the result of the conversion, which will be zero if the + * conversion failed. + */) + directive(public) directive(static) ident(RubyInteger) ident(str2inum)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyString) ident(str)operator(,) type(int) ident(base)operator(,) type(boolean) ident(strict)operator(\)) operator({) + keyword(if) operator(()ident(base) operator(!=) integer(0) operator(&&) operator(()ident(base) operator(<) integer(2) operator(||) ident(base) operator(>) integer(36)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(illegal radix )delimiter(")> operator(+) ident(base)operator(\))operator(;) + operator(}) + ident(ByteList) ident(bytes) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(try) operator({) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(Convert)operator(.)ident(byteListToLong)operator(()ident(bytes)operator(,) ident(base)operator(,) ident(strict)operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidIntegerException) ident(e)operator(\)) operator({) + keyword(return) ident(str2inumIIE)operator(()ident(strict)operator(,) ident(runtime)operator(,) ident(str)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(NumberTooLargeException) ident(e)operator(\)) operator({) + keyword(return) ident(str2inumNTLE)operator(()ident(strict)operator(,) ident(runtime)operator(,) ident(str)operator(,) ident(bytes)operator(,) ident(base)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) ident(RubyInteger) ident(str2inumIIE)operator(()type(boolean) ident(strict)operator(,) ident(Ruby) ident(runtime)operator(,) ident(RubyString) ident(str)operator(\)) directive(throws) ident(RaiseException) operator({) + keyword(if) operator(()ident(strict)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid value for Integer: )delimiter(")> operator(+) ident(str)operator(.)ident(callMethod)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(RubyInteger) ident(str2inumNTLE)operator(()type(boolean) ident(strict)operator(,) ident(Ruby) ident(runtime)operator(,) ident(RubyString) ident(str)operator(,) ident(ByteList) ident(bytes)operator(,) type(int) ident(base)operator(\)) operator({) + keyword(try) operator({) + type(BigInteger) ident(bi) operator(=) ident(Convert)operator(.)ident(byteListToBigInteger)operator(()ident(bytes)operator(,) ident(base)operator(,) ident(strict)operator(\))operator(;) + keyword(return) keyword(new) ident(RubyBignum)operator(()ident(runtime)operator(,) ident(bi)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(InvalidIntegerException) ident(e2)operator(\)) operator({) + keyword(return) ident(str2inumIIE)operator(()ident(strict)operator(,) ident(runtime)operator(,) ident(str)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(RubyFloat) ident(str2fnum)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyString) ident(arg)operator(\)) operator({) + keyword(return) ident(str2fnum)operator(()ident(runtime)operator(,)ident(arg)operator(,)keyword(false)operator(\))operator(;) + operator(}) + + comment(/** + * Converts a string representation of a floating-point number to the + * numeric value. Parsing starts at the beginning of the string (after + * leading and trailing whitespace have been removed\), and stops at the + * end or at the first character that can't be part of a number. If + * the string fails to parse as a number, 0.0 is returned. + * + * @param runtime the ruby runtime + * @param arg the string to be converted + * @param strict if true, enforce the strict criteria for String encoding of + * numeric values, as required by Float('n'\), and raise an + * exception when those criteria are not met. Otherwise, allow + * lax expression of values, as permitted by String#to_f, and + * return a value in all cases. + * TODO: describe the rules/criteria + * @return a RubyFloat representing the result of the conversion, which + * will be 0.0 if the conversion failed. + */) + directive(public) directive(static) ident(RubyFloat) ident(str2fnum)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyString) ident(arg)operator(,) type(boolean) ident(strict)operator(\)) operator({) + directive(final) type(double) ident(ZERO) operator(=) float(0.0)operator(;) + + keyword(try) operator({) + keyword(return) keyword(new) ident(RubyFloat)operator(()ident(runtime)operator(,)ident(Convert)operator(.)ident(byteListToDouble)operator(()ident(arg)operator(.)ident(getByteList)operator(()operator(\))operator(,)ident(strict)operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(NumberFormatException) ident(e)operator(\)) operator({) + keyword(if) operator(()ident(strict)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid value for Float(\): )delimiter(")> + operator(+) ident(arg)operator(.)ident(callMethod)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) keyword(new) ident(RubyFloat)operator(()ident(runtime)operator(,)ident(ZERO)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** Numeric methods. (num_*\) + * + */) + + directive(protected) ident(IRubyObject)type([]) ident(getCoerced)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(,) type(boolean) ident(error)operator(\)) operator({) + ident(IRubyObject) ident(result)operator(;) + + keyword(try) operator({) + ident(result) operator(=) ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(coerce)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(e)operator(\)) operator({) + keyword(if) operator(()ident(error)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(() + ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( can't be coerced into )delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) keyword(null)operator(;) + operator(}) + + keyword(if) operator(()operator(!)operator(()ident(result) keyword(instanceof) ident(RubyArray)operator(\)) operator(||) operator(()operator(()ident(RubyArray)operator(\))ident(result)operator(\))operator(.)ident(getLength)operator(()operator(\)) operator(!=) integer(2)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(coerce must return [x, y])delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) operator(()operator(()ident(RubyArray)operator(\))ident(result)operator(\))operator(.)ident(toJavaArray)operator(()operator(\))operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(callCoerced)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(method)operator(,) ident(IRubyObject) ident(other)operator(,) type(boolean) ident(err)operator(\)) operator({) + ident(IRubyObject)type([]) ident(args) operator(=) ident(getCoerced)operator(()ident(context)operator(,) ident(other)operator(,) ident(err)operator(\))operator(;) + keyword(if)operator(()ident(args) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(args)operator([)integer(0)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(method)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(callCoerced)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(method)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject)type([]) ident(args) operator(=) ident(getCoerced)operator(()ident(context)operator(,) ident(other)operator(,) keyword(false)operator(\))operator(;) + keyword(if)operator(()ident(args) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(args)operator([)integer(0)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(method)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + + comment(// beneath are rewritten coercions that reflect MRI logic, the aboves are used only by RubyBigDecimal) + + comment(/** coerce_body + * + */) + directive(protected) directive(final) ident(IRubyObject) ident(coerceBody)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(coerce)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** do_coerce + * + */) + directive(protected) directive(final) ident(RubyArray) ident(doCoerce)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(,) type(boolean) ident(err)operator(\)) operator({) + ident(IRubyObject) ident(result)operator(;) + keyword(try) operator({) + ident(result) operator(=) ident(coerceBody)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(e)operator(\)) operator({) + keyword(if) operator(()ident(err)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(() + ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( can't be coerced into )delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + keyword(if) operator(()operator(!)operator(()ident(result) keyword(instanceof) ident(RubyArray)operator(\)) operator(||) operator(()operator(()ident(RubyArray)operator(\)) ident(result)operator(\))operator(.)ident(getLength)operator(()operator(\)) operator(!=) integer(2)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(coerce must return [x, y])delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) operator(()ident(RubyArray)operator(\)) ident(result)operator(;) + operator(}) + + comment(/** rb_num_coerce_bin + * coercion taking two arguments + */) + directive(protected) directive(final) ident(IRubyObject) ident(coerceBin)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(method)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(doCoerce)operator(()ident(context)operator(,) ident(other)operator(,) keyword(true)operator(\))operator(;) + keyword(return) operator(()ident(ary)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(method)operator(,) ident(ary)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_num_coerce_cmp + * coercion used for comparisons + */) + directive(protected) directive(final) ident(IRubyObject) ident(coerceCmp)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(method)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(doCoerce)operator(()ident(context)operator(,) ident(other)operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(ary) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) comment(// MRI does it!) + operator(}) + keyword(return) operator(()ident(ary)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(method)operator(,) ident(ary)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_num_coerce_relop + * coercion used for relative operators + */) + directive(protected) directive(final) ident(IRubyObject) ident(coerceRelOp)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(method)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(doCoerce)operator(()ident(context)operator(,) ident(other)operator(,) keyword(false)operator(\))operator(;) + keyword(if) operator(()ident(ary) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(RubyComparable)operator(.)ident(cmperr)operator(()local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + keyword(return) ident(unwrapCoerced)operator(()ident(context)operator(,) ident(method)operator(,) ident(other)operator(,) ident(ary)operator(\))operator(;) + operator(}) + + directive(private) directive(final) ident(IRubyObject) ident(unwrapCoerced)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(method)operator(,) ident(IRubyObject) ident(other)operator(,) ident(RubyArray) ident(ary)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) operator(()ident(ary)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(method)operator(,) ident(ary)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RubyComparable)operator(.)ident(cmperr)operator(()local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + directive(public) ident(RubyNumeric) ident(asNumeric)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/* ================ + * Instance Methods + * ================ + */) + + comment(/** num_sadded + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(singleton_method_added)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(sadded)operator(()ident(IRubyObject) ident(name)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't define singleton method )delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content( for )delimiter(")> operator(+) ident(getType)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** num_init_copy + * + */) + annotation(@Override) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't copy )delimiter(")> operator(+) ident(getType)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** num_coerce + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(coerce)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(coerce)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(getClass)operator(()operator(\)) operator(==) ident(other)operator(.)ident(getClass)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(other)operator(,) local_variable(this)operator(\))operator(;) + + ident(IRubyObject) ident(cdr) operator(=) ident(RubyKernel)operator(.)ident(new_float)operator(()local_variable(this)operator(,) local_variable(this)operator(\))operator(;) + ident(IRubyObject) ident(car) operator(=) ident(RubyKernel)operator(.)ident(new_float)operator(()local_variable(this)operator(,) ident(other)operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(car)operator(,) ident(cdr)operator(\))operator(;) + operator(}) + + comment(/** num_uplus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+@)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_uplus)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** num_uminus + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-@)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_uminus)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyFixnum) ident(zero) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(RubyArray) ident(ary) operator(=) ident(zero)operator(.)ident(doCoerce)operator(()ident(context)operator(,) local_variable(this)operator(,) keyword(true)operator(\))operator(;) + keyword(return) ident(ary)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_MINUS)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(ary)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(\))operator(;) + operator(}) + + comment(/** num_cmp + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) operator({) comment(// won't hurt fixnums) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_eql + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eql?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(eql_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(getClass)operator(()operator(\)) operator(!=) ident(other)operator(.)ident(getClass)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(return) ident(equalInternal)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_quo + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(quo)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(quo)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** num_quo + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(quo)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(quo_19)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalRaw)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** num_div + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(div)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(div)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(.)ident(convertToFloat)operator(()operator(\))operator(.)ident(floor)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_divmod + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(divmod)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(divmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(RubyArray)operator(.)ident(newArray)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(div)operator(()ident(context)operator(,) ident(other)operator(\))operator(,) ident(modulo)operator(()ident(context)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) + + comment(/** num_fdiv (1.9\) */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fdiv)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(fdiv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) local_variable(this)operator(.)ident(convertToFloat)operator(()operator(\))operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** num_modulo + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(modulo)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(modulo)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** num_remainder + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(remainder)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(remainder)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(dividend)operator(\)) operator({) + ident(IRubyObject) ident(z) operator(=) ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(%)delimiter(")>operator(,) ident(dividend)operator(\))operator(;) + ident(IRubyObject) ident(x) operator(=) local_variable(this)operator(;) + ident(RubyFixnum) ident(zero) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(equalInternal)operator(()ident(context)operator(,) ident(z)operator(,) ident(zero)operator(\)) operator(&&) + operator(()operator(()ident(x)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_LT)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(zero)operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(&&) + ident(dividend)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_GT)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(zero)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator(||) + operator(()ident(x)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_GT)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(zero)operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(&&) + ident(dividend)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_LT)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(zero)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(\))operator(\)) operator({) + keyword(return) ident(z)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_MINUS)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(dividend)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(z)operator(;) + operator(}) + operator(}) + + comment(/** num_abs + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abs)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(abs)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_LT)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(-@)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** num_to_int + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_int)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_int)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) local_variable(this)operator(,) string<delimiter(")content(to_i)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** num_scalar_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(scalar?)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(scalar_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_int_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(integer?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(integer_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_zero_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zero?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(zero_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(equalInternal)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_nonzero_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nonzero?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(nonzero_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(zero?)delimiter(")>operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** num_floor + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(floor)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(floor)operator(()operator(\)) operator({) + keyword(return) ident(convertToFloat)operator(()operator(\))operator(.)ident(floor)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_ceil + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ceil)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(ceil)operator(()operator(\)) operator({) + keyword(return) ident(convertToFloat)operator(()operator(\))operator(.)ident(ceil)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_round + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(round)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(round)operator(()operator(\)) operator({) + keyword(return) ident(convertToFloat)operator(()operator(\))operator(.)ident(round)operator(()operator(\))operator(;) + operator(}) + + comment(/** num_truncate + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(truncate)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(truncate)operator(()operator(\)) operator({) + keyword(return) ident(convertToFloat)operator(()operator(\))operator(.)ident(truncate)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(step)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(step)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(case) integer(1)operator(:) keyword(return) ident(step)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(step)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(default)operator(:) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(2)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(step)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(step)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(step)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(step)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(step)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(to)operator(,) ident(IRubyObject) ident(step)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(to) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(step) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(value) operator(=) ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(end) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(to)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(diff) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(step)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(diff) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(step cannot be 0)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(diff) operator(>) integer(0)operator(\)) operator({) + keyword(for) operator(()type(long) ident(i) operator(=) ident(value)operator(;) ident(i) operator(<=) ident(end)operator(;) ident(i) operator(+=) ident(diff)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(for) operator(()type(long) ident(i) operator(=) ident(value)operator(;) ident(i) operator(>=) ident(end)operator(;) ident(i) operator(+=) ident(diff)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyFloat) operator(||) ident(to) keyword(instanceof) ident(RubyFloat) operator(||) ident(step) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + type(double) ident(beg) operator(=) ident(num2dbl)operator(()local_variable(this)operator(\))operator(;) + type(double) ident(end) operator(=) ident(num2dbl)operator(()ident(to)operator(\))operator(;) + type(double) ident(unit) operator(=) ident(num2dbl)operator(()ident(step)operator(\))operator(;) + + keyword(if) operator(()ident(unit) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(step cannot be 0)delimiter(")>operator(\))operator(;) + operator(}) + + type(double) ident(n) operator(=) operator(()ident(end) operator(-) ident(beg)operator(\))operator(/)ident(unit)operator(;) + type(double) ident(err) operator(=) operator(()type(Math)operator(.)ident(abs)operator(()ident(beg)operator(\)) operator(+) type(Math)operator(.)ident(abs)operator(()ident(end)operator(\)) operator(+) type(Math)operator(.)ident(abs)operator(()ident(end) operator(-) ident(beg)operator(\))operator(\)) operator(/) type(Math)operator(.)ident(abs)operator(()ident(unit)operator(\)) operator(*) ident(DBL_EPSILON)operator(;) + + keyword(if) operator(()ident(err)operator(>)float(0.5)operator(\)) operator({) + ident(err)operator(=)float(0.5)operator(;) + operator(}) + ident(n) operator(=) type(Math)operator(.)ident(floor)operator(()ident(n) operator(+) ident(err)operator(\)) operator(+) integer(1)operator(;) + + keyword(for)operator(()type(double) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(n)operator(;) ident(i)operator(++)operator(\))operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(i) operator(*) ident(unit) operator(+) ident(beg)operator(\))operator(\))operator(;) + operator(}) + + operator(}) keyword(else) operator({) + ident(RubyNumeric) ident(i) operator(=) local_variable(this)operator(;) + + type(int) ident(cmp)operator(;) + type(String) ident(cmpString)operator(;) + keyword(if) operator(()operator(()operator(()ident(RubyBoolean)operator(\)) ident(step)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_GT)operator(,) string<delimiter(")content(>)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(cmp) operator(=) ident(MethodIndex)operator(.)ident(OP_GT)operator(;) + operator(}) keyword(else) operator({) + ident(cmp) operator(=) ident(MethodIndex)operator(.)ident(OP_LT)operator(;) + operator(}) + ident(cmpString) operator(=) ident(MethodIndex)operator(.)ident(NAMES)operator(.)ident(get)operator(()ident(cmp)operator(\))operator(;) + + keyword(while) operator(()keyword(true)operator(\)) operator({) + keyword(if) operator(()ident(i)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(cmp)operator(,) ident(cmpString)operator(,) ident(to)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(i)operator(\))operator(;) + ident(i) operator(=) operator(()ident(RubyNumeric)operator(\)) ident(i)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_PLUS)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(step)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** num_equal, doesn't override RubyObject.op_equal + * + */) + directive(protected) directive(final) ident(IRubyObject) ident(op_num_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + comment(// it won't hurt fixnums) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + + keyword(return) ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(EQUALEQUAL)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** num_numerator + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(numerator)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(numerator)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalConvert)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(numerator)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** num_denominator + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(denominator)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(denominator)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalConvert)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(denominator)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** numeric_to_c + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_c)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(to_c)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyComplex)operator(.)ident(newComplexCanonicalize)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** numeric_re + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(re)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(re)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyComplex)operator(.)ident(newComplexConvert)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** numeric_im + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(im)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(im)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyComplex)operator(.)ident(newComplexConvert)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** numeric_real + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(real)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(real)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** numeric_image + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(image)delimiter(")>operator(,) string<delimiter(")content(imag)delimiter(")>operator(})operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(image)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** numeric_arg + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(arg)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(arg)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(f_negative_p)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getMath)operator(()operator(\))operator(.)ident(fastFetchConstant)operator(()string<delimiter(")content(PI)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** numeric_polar + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(polar)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(polar)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(f_abs)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(f_arg)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(\))operator(;) + operator(}) + + comment(/** numeric_real + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(conjugate)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(conjugate)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) directive(static) type(class) class(InvalidIntegerException) directive(extends) type(NumberFormatException) operator({) + directive(private) directive(static) directive(final) type(long) ident(serialVersionUID) operator(=) integer(55019452543252148L)operator(;) + + directive(public) ident(InvalidIntegerException)operator(()operator(\)) operator({) + local_variable(super)operator(()operator(\))operator(;) + operator(}) + directive(public) ident(InvalidIntegerException)operator(()type(String) ident(message)operator(\)) operator({) + local_variable(super)operator(()ident(message)operator(\))operator(;) + operator(}) + directive(public) type(Throwable) ident(fillInStackTrace)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) + + directive(public) directive(static) type(class) class(NumberTooLargeException) directive(extends) type(NumberFormatException) operator({) + directive(private) directive(static) directive(final) type(long) ident(serialVersionUID) operator(=) operator(-)integer(1835120694982699449L)operator(;) + directive(public) ident(NumberTooLargeException)operator(()operator(\)) operator({) + local_variable(super)operator(()operator(\))operator(;) + operator(}) + directive(public) ident(NumberTooLargeException)operator(()type(String) ident(message)operator(\)) operator({) + local_variable(super)operator(()ident(message)operator(\))operator(;) + operator(}) + directive(public) type(Throwable) ident(fillInStackTrace)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Ola Bini <ola.bini@ki.se> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2007 MenTaLguY <mental@rydia.net> + * Copyright (C\) 2007 William N Dortch <bill.dortch@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.io.ObjectInputStream)operator(;) +keyword(import) include(java.io.ObjectOutputStream)operator(;) +keyword(import) include(java.io.Serializable)operator(;) +keyword(import) include(java.util.concurrent.atomic.AtomicBoolean)operator(;) + +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.evaluator.ASTInterpreter)operator(;) +keyword(import) include(org.jruby.exceptions.JumpException)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.DynamicMethod)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallType)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.builtin.Variable)operator(;) +keyword(import) include(org.jruby.runtime.component.VariableEntry)operator(;) +keyword(import) include(org.jruby.util.IdUtil)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.javasupport.JavaObject)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.builtin.InstanceVariables)operator(;) +keyword(import) include(org.jruby.runtime.builtin.InternalVariables)operator(;) +keyword(import) include(org.jruby.runtime.marshal.CoreObjectType)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) + +comment(/** + * RubyObject is the only implementation of the + * {@link org.jruby.runtime.builtin.IRubyObject}. Every Ruby object in JRuby + * is represented by something that is an instance of RubyObject. In + * some of the core class implementations, this means doing a subclass + * that extends RubyObject, in other cases it means using a simple + * RubyObject instance and the data field to store specific + * information about the Ruby object. + * + * Some care has been taken to make the implementation be as + * monomorphic as possible, so that the Java Hotspot engine can + * improve performance of it. That is the reason for several patterns + * that might seem odd in this class. + * + * The IRubyObject interface used to have lots of methods for + * different things, but these have now mostly been refactored into + * several interfaces that gives access to that specific part of the + * object. This gives us the possibility to switch out that subsystem + * without changing interfaces again. For example, instance variable + * and internal variables are handled this way, but the implementation + * in RubyObject only returns "this" in {@link #getInstanceVariables(\)} and + * {@link #getInternalVariables(\)}. + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Object)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Kernel)delimiter(")>operator(\)) +directive(public) type(class) class(RubyObject) directive(implements) type(Cloneable)operator(,) ident(IRubyObject)operator(,) type(Serializable)operator(,) ident(CoreObjectType)operator(,) ident(InstanceVariables)operator(,) ident(InternalVariables) operator({) + + comment(/** + * It's not valid to create a totally empty RubyObject. Since the + * RubyObject is always defined in relation to a runtime, that + * means that creating RubyObjects from outside the class might + * cause problems. + */) + directive(private) ident(RubyObject)operator(()operator(\))operator({)operator(})operator(;) + + comment(/** + * A value that is used as a null sentinel in among other places + * the RubyArray implementation. It will cause large problems to + * call any methods on this object. + */) + directive(public) directive(static) directive(final) ident(IRubyObject) ident(NEVER) operator(=) keyword(new) ident(RubyObject)operator(()operator(\))operator(;) + + comment(/** + * A value that specifies an undefined value. This value is used + * as a sentinel for undefined constant values, and other places + * where neither null nor NEVER makes sense. + */) + directive(public) directive(static) directive(final) ident(IRubyObject) ident(UNDEF) operator(=) keyword(new) ident(RubyObject)operator(()operator(\))operator(;) + + comment(// The class of this object) + directive(protected) directive(transient) ident(RubyClass) ident(metaClass)operator(;) + + comment(/** + * The variableTable contains variables for an object, defined as: + * <ul> + * <li> instance variables + * <li> class variables (for classes/modules\) + * <li> internal variables (such as those used when marshaling RubyRange and RubyException\) + * </ul> + * + * Constants are stored separately, see {@link RubyModule}. + * + */) + directive(protected) directive(transient) directive(volatile) ident(VariableTableEntry)type([]) ident(variableTable)operator(;) + directive(protected) directive(transient) type(int) ident(variableTableSize)operator(;) + directive(protected) directive(transient) type(int) ident(variableTableThreshold)operator(;) + + comment(// The dataStruct is a place where custom information can be) + comment(// contained for core implementations that doesn't necessarily) + comment(// want to go to the trouble of creating a subclass of) + comment(// RubyObject. The OpenSSL implementation uses this heavily to) + comment(// save holder objects containing Java cryptography objects.) + comment(// Java integration uses this to store the Java object ref.) + directive(protected) directive(transient) type(Object) ident(dataStruct)operator(;) + + directive(protected) type(int) ident(flags)operator(;) comment(// zeroed by jvm) + directive(public) directive(static) directive(final) type(int) ident(ALL_F) operator(=) operator(-)integer(1)operator(;) + directive(public) directive(static) directive(final) type(int) ident(FALSE_F) operator(=) integer(1) operator(<)operator(<) integer(0)operator(;) + + comment(/** + * This flag is a bit funny. It's used to denote that this value + * is nil. It's a bit counterintuitive for a Java programmer to + * not use subclassing to handle this case, since we have a + * RubyNil subclass anyway. Well, the reason for it being a flag + * is that the {@link #isNil(\)} method is called extremely often. So often + * that it gives a good speed boost to make it monomorphic and + * final. It turns out using a flag for this actually gives us + * better performance than having a polymorphic {@link #isNil(\)} method. + */) + directive(public) directive(static) directive(final) type(int) ident(NIL_F) operator(=) integer(1) operator(<)operator(<) integer(1)operator(;) + + directive(public) directive(static) directive(final) type(int) ident(FROZEN_F) operator(=) integer(1) operator(<)operator(<) integer(2)operator(;) + directive(public) directive(static) directive(final) type(int) ident(TAINTED_F) operator(=) integer(1) operator(<)operator(<) integer(3)operator(;) + + directive(public) directive(static) directive(final) type(int) ident(FL_USHIFT) operator(=) integer(4)operator(;) + + directive(public) directive(static) directive(final) type(int) ident(USER0_F) operator(=) operator(()integer(1)operator(<)operator(<)operator(()ident(FL_USHIFT)operator(+)integer(0)operator(\))operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(USER1_F) operator(=) operator(()integer(1)operator(<)operator(<)operator(()ident(FL_USHIFT)operator(+)integer(1)operator(\))operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(USER2_F) operator(=) operator(()integer(1)operator(<)operator(<)operator(()ident(FL_USHIFT)operator(+)integer(2)operator(\))operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(USER3_F) operator(=) operator(()integer(1)operator(<)operator(<)operator(()ident(FL_USHIFT)operator(+)integer(3)operator(\))operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(USER4_F) operator(=) operator(()integer(1)operator(<)operator(<)operator(()ident(FL_USHIFT)operator(+)integer(4)operator(\))operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(USER5_F) operator(=) operator(()integer(1)operator(<)operator(<)operator(()ident(FL_USHIFT)operator(+)integer(5)operator(\))operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(USER6_F) operator(=) operator(()integer(1)operator(<)operator(<)operator(()ident(FL_USHIFT)operator(+)integer(6)operator(\))operator(\))operator(;) + directive(public) directive(static) directive(final) type(int) ident(USER7_F) operator(=) operator(()integer(1)operator(<)operator(<)operator(()ident(FL_USHIFT)operator(+)integer(7)operator(\))operator(\))operator(;) + + comment(/** + * Sets or unsets a flag on this object. The only flags that are + * guaranteed to be valid to use as the first argument is: + * + * <ul> + * <li>{@link #FALSE_F}</li> + * <li>{@link NIL_F}</li> + * <li>{@link FROZEN_F}</li> + * <li>{@link TAINTED_F}</li> + * <li>{@link USER0_F}</li> + * <li>{@link USER1_F}</li> + * <li>{@link USER2_F}</li> + * <li>{@link USER3_F}</li> + * <li>{@link USER4_F}</li> + * <li>{@link USER5_F}</li> + * <li>{@link USER6_F}</li> + * <li>{@link USER7_F}</li> + * </ul> + * + * @param flag the actual flag to set or unset. + * @param set if true, the flag will be set, if false, the flag will be unset. + */) + directive(public) directive(final) type(void) ident(setFlag)operator(()type(int) ident(flag)operator(,) type(boolean) ident(set)operator(\)) operator({) + keyword(if) operator(()ident(set)operator(\)) operator({) + ident(flags) operator(|=) ident(flag)operator(;) + operator(}) keyword(else) operator({) + ident(flags) operator(&=) operator(~)ident(flag)operator(;) + operator(}) + operator(}) + + comment(/** + * Get the value of a custom flag on this object. The only + * guaranteed flags that can be sent in to this method is: + * + * <ul> + * <li>{@link #FALSE_F}</li> + * <li>{@link NIL_F}</li> + * <li>{@link FROZEN_F}</li> + * <li>{@link TAINTED_F}</li> + * <li>{@link USER0_F}</li> + * <li>{@link USER1_F}</li> + * <li>{@link USER2_F}</li> + * <li>{@link USER3_F}</li> + * <li>{@link USER4_F}</li> + * <li>{@link USER5_F}</li> + * <li>{@link USER6_F}</li> + * <li>{@link USER7_F}</li> + * </ul> + * + * @param flag the flag to get + * @return true if the flag is set, false otherwise + */) + directive(public) directive(final) type(boolean) ident(getFlag)operator(()type(int) ident(flag)operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(flag)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + directive(private) directive(transient) ident(Finalizer) ident(finalizer)operator(;) + + comment(/** + * Class that keeps track of the finalizers for the object under + * operation. + */) + directive(public) type(class) class(Finalizer) directive(implements) ident(Finalizable) operator({) + directive(private) type(long) ident(id)operator(;) + directive(private) type(List)operator(<)ident(IRubyObject)operator(>) ident(finalizers)operator(;) + directive(private) type(AtomicBoolean) ident(finalized)operator(;) + + directive(public) ident(Finalizer)operator(()type(long) ident(id)operator(\)) operator({) + local_variable(this)operator(.)ident(id) operator(=) ident(id)operator(;) + local_variable(this)operator(.)ident(finalized) operator(=) keyword(new) type(AtomicBoolean)operator(()keyword(false)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(addFinalizer)operator(()ident(IRubyObject) ident(finalizer)operator(\)) operator({) + keyword(if) operator(()ident(finalizers) operator(==) keyword(null)operator(\)) operator({) + ident(finalizers) operator(=) keyword(new) type(ArrayList)operator(<)ident(IRubyObject)operator(>)operator(()operator(\))operator(;) + operator(}) + ident(finalizers)operator(.)ident(add)operator(()ident(finalizer)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(removeFinalizers)operator(()operator(\)) operator({) + ident(finalizers) operator(=) keyword(null)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(void) ident(finalize)operator(()operator(\)) operator({) + keyword(if) operator(()ident(finalized)operator(.)ident(compareAndSet)operator(()keyword(false)operator(,) keyword(true)operator(\))operator(\)) operator({) + keyword(if) operator(()ident(finalizers) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(finalizers)operator(.)ident(size)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(finalizer) operator(=) ident(finalizers)operator(.)ident(get)operator(()ident(i)operator(\))operator(;) + ident(RuntimeHelpers)operator(.)ident(invoke)operator(() + ident(finalizer)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) + ident(finalizer)operator(,) string<delimiter(")content(call)delimiter(")>operator(,) ident(RubyObject)operator(.)ident(this)operator(.)ident(id)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + operator(}) + + comment(/** + * Standard path for object creation. Objects are entered into ObjectSpace + * only if ObjectSpace is enabled. + */) + directive(public) ident(RubyObject)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(metaClass)operator(\)) operator({) + local_variable(this)operator(.)ident(metaClass) operator(=) ident(metaClass)operator(;) + + keyword(if) operator(()ident(runtime)operator(.)ident(isObjectSpaceEnabled)operator(()operator(\))operator(\)) ident(addToObjectSpace)operator(()ident(runtime)operator(\))operator(;) + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(3)operator(\)) ident(taint)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + comment(/** + * Path for objects who want to decide whether they don't want to be in + * ObjectSpace even when it is on. (notably used by objects being + * considered immediate, they'll always pass false here\) + */) + directive(protected) ident(RubyObject)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(metaClass)operator(,) type(boolean) ident(useObjectSpace)operator(\)) operator({) + local_variable(this)operator(.)ident(metaClass) operator(=) ident(metaClass)operator(;) + + keyword(if) operator(()ident(useObjectSpace)operator(\)) ident(addToObjectSpace)operator(()ident(runtime)operator(\))operator(;) + keyword(if) operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(3)operator(\)) ident(taint)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(addToObjectSpace)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(assert) ident(runtime)operator(.)ident(isObjectSpaceEnabled)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getObjectSpace)operator(()operator(\))operator(.)ident(add)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** + * Will create the Ruby class Object in the runtime + * specified. This method needs to take the actual class as an + * argument because of the Object class' central part in runtime + * initialization. + */) + directive(public) directive(static) ident(RubyClass) ident(createObjectClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(objectClass)operator(\)) operator({) + ident(objectClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(OBJECT)operator(;) + + ident(objectClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(ObjectMethods)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(objectClass)operator(;) + operator(}) + + comment(/** + * Interestingly, the Object class doesn't really have that many + * methods for itself. Instead almost all of the Object methods + * are really defined on the Kernel module. This class is a holder + * for all Object methods. + * + * @see RubyKernel + */) + directive(public) directive(static) type(class) class(ObjectMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(intialize)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Default allocator instance for all Ruby objects. The only + * reason to not use this allocator is if you actually need to + * have all instances of something be a subclass of RubyObject. + * + * @see org.jruby.runtime.ObjectAllocator + */) + directive(public) directive(static) directive(final) ident(ObjectAllocator) ident(OBJECT_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyObject)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + comment(/** + * Will make sure that this object is added to the current object + * space. + * + * @see org.jruby.runtime.ObjectSpace + */) + directive(public) type(void) ident(attachToObjectSpace)operator(()operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getObjectSpace)operator(()operator(\))operator(.)ident(add)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** + * This is overridden in the other concrete Java builtins to provide a fast way + * to determine what type they are. + * + * Will generally return a value from org.jruby.runtime.ClassIndex + * + * @see org.jruby.runtime.ClassInde + */) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(OBJECT)operator(;) + operator(}) + + comment(/** + * Specifically polymorphic method that are meant to be overridden + * by modules to specify that they are modules in an easy way. + */) + directive(public) type(boolean) ident(isModule)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** + * Specifically polymorphic method that are meant to be overridden + * by classes to specify that they are classes in an easy way. + */) + directive(public) type(boolean) ident(isClass)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** + * Is object immediate (def: Fixnum, Symbol, true, false, nil?\). + */) + directive(public) type(boolean) ident(isImmediate)operator(()operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** rb_make_metaclass + * + * Will create a new meta class, insert this in the chain of + * classes for this specific object, and return the generated meta + * class. + */) + directive(public) ident(RubyClass) ident(makeMetaClass)operator(()ident(RubyClass) ident(superClass)operator(\)) operator({) + ident(MetaClass) ident(klass) operator(=) keyword(new) ident(MetaClass)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(superClass)operator(\))operator(;) comment(// rb_class_boot) + ident(setMetaClass)operator(()ident(klass)operator(\))operator(;) + + ident(klass)operator(.)ident(setAttached)operator(()local_variable(this)operator(\))operator(;) + ident(klass)operator(.)ident(setMetaClass)operator(()ident(superClass)operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(klass)operator(;) + operator(}) + + comment(/** + * Will return the Java interface that most closely can represent + * this object, when working through JAva integration + * translations. + */) + directive(public) type(Class) ident(getJavaClass)operator(()operator(\)) operator({) + keyword(if) operator(()ident(dataGetStruct)operator(()operator(\)) keyword(instanceof) ident(JavaObject)operator(\)) operator({) + keyword(return) operator(()operator(()ident(JavaObject)operator(\))ident(dataGetStruct)operator(()operator(\))operator(\))operator(.)ident(getValue)operator(()operator(\))operator(.)ident(getClass)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getClass)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Simple helper to print any objects. + */) + directive(public) directive(static) type(void) ident(puts)operator(()type(Object) ident(obj)operator(\)) operator({) + type(System)operator(.)ident(out)operator(.)ident(println)operator(()ident(obj)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * This method is just a wrapper around the Ruby "==" method, + * provided so that RubyObjects can be used as keys in the Java + * HashMap object underlying RubyHash. + */) + annotation(@Override) + directive(public) type(boolean) ident(equals)operator(()type(Object) ident(other)operator(\)) operator({) + keyword(return) ident(other) operator(==) local_variable(this) operator(||) + ident(other) keyword(instanceof) ident(IRubyObject) operator(&&) + ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(EQUALEQUAL)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) operator(()ident(IRubyObject)operator(\)) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * The default toString method is just a wrapper that calls the + * Ruby "to_s" method. + */) + annotation(@Override) + directive(public) type(String) ident(toString)operator(()operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) local_variable(this)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Will return the runtime that this object is associated with. + * + * @return current runtime + */) + directive(public) directive(final) ident(Ruby) ident(getRuntime)operator(()operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(getClassRuntime)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * if exist return the meta-class else return the type of the object. + * + */) + directive(public) directive(final) ident(RubyClass) ident(getMetaClass)operator(()operator(\)) operator({) + keyword(return) ident(metaClass)operator(;) + operator(}) + + comment(/** + * Makes it possible to change the metaclass of an object. In + * practice, this is a simple version of Smalltalks Become, except + * that it doesn't work when we're dealing with subclasses. In + * practice it's used to change the singleton/meta class used, + * without changing the "real" inheritance chain. + */) + directive(public) type(void) ident(setMetaClass)operator(()ident(RubyClass) ident(metaClass)operator(\)) operator({) + local_variable(this)operator(.)ident(metaClass) operator(=) ident(metaClass)operator(;) + operator(}) + + comment(/** + * Is this value frozen or not? Shortcut for doing + * getFlag(FROZEN_F\). + * + * @return true if this object is frozen, false otherwise + */) + directive(public) type(boolean) ident(isFrozen)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(FROZEN_F)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + comment(/** + * Sets whether this object is frozen or not. Shortcut for doing + * setFlag(FROZEN_F, frozen\). + * + * @param frozen should this object be frozen? + */) + directive(public) type(void) ident(setFrozen)operator(()type(boolean) ident(frozen)operator(\)) operator({) + keyword(if) operator(()ident(frozen)operator(\)) operator({) + ident(flags) operator(|=) ident(FROZEN_F)operator(;) + operator(}) keyword(else) operator({) + ident(flags) operator(&=) operator(~)ident(FROZEN_F)operator(;) + operator(}) + operator(}) + + comment(/** rb_frozen_class_p + * + * Helper to test whether this object is frozen, and if it is will + * throw an exception based on the message. + */) + directive(protected) directive(final) type(void) ident(testFrozen)operator(()type(String) ident(message)operator(\)) operator({) + keyword(if) operator(()ident(isFrozen)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newFrozenError)operator(()ident(message) operator(+) string<delimiter(")content( )delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * The actual method that checks frozen with the default frozen message from MRI. + * If possible, call this instead of {@link #testFrozen}. + */) + directive(protected) type(void) ident(checkFrozen)operator(()operator(\)) operator({) + ident(testFrozen)operator(()string<delimiter(")content(can't modify frozen )delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Gets the taint. Shortcut for getFlag(TAINTED_F\). + * + * @return true if this object is tainted + */) + directive(public) type(boolean) ident(isTaint)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(TAINTED_F)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + comment(/** + * Sets the taint flag. Shortcut for setFlag(TAINTED_F, taint\) + * + * @param taint should this object be tainted or not? + */) + directive(public) type(void) ident(setTaint)operator(()type(boolean) ident(taint)operator(\)) operator({) + keyword(if) operator(()ident(taint)operator(\)) operator({) + ident(flags) operator(|=) ident(TAINTED_F)operator(;) + operator(}) keyword(else) operator({) + ident(flags) operator(&=) operator(~)ident(TAINTED_F)operator(;) + operator(}) + operator(}) + + comment(/** + * Does this object represent nil? See the docs for the {@link + * #NIL_F} flag for more information. + */) + directive(public) directive(final) type(boolean) ident(isNil)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(NIL_F)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + comment(/** + * Is this value a true value or not? Based on the {@link #FALSE_F} flag. + */) + directive(public) directive(final) type(boolean) ident(isTrue)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(FALSE_F)operator(\)) operator(==) integer(0)operator(;) + operator(}) + + comment(/** + * Is this value a false value or not? Based on the {@link #FALSE_F} flag. + */) + directive(public) directive(final) type(boolean) ident(isFalse)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(FALSE_F)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + comment(/** + * Does this object respond to the specified message? Uses a + * shortcut if it can be proved that respond_to? haven't been + * overridden. + */) + directive(public) directive(final) type(boolean) ident(respondsTo)operator(()type(String) ident(name)operator(\)) operator({) + keyword(if)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(searchMethod)operator(()string<delimiter(")content(respond_to?)delimiter(")>operator(\)) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getRespondToMethod)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(isMethodBound)operator(()ident(name)operator(,) keyword(false)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,)string<delimiter(")content(respond_to?)delimiter(")>operator(,)ident(getRuntime)operator(()operator(\))operator(.)ident(newSymbol)operator(()ident(name)operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_singleton_class + * + * Note: this method is specialized for RubyFixnum, RubySymbol, + * RubyNil and RubyBoolean + * + * Will either return the existing singleton class for this + * object, or create a new one and return that. + */) + directive(public) ident(RubyClass) ident(getSingletonClass)operator(()operator(\)) operator({) + ident(RubyClass) ident(klass)operator(;) + + keyword(if) operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(isSingleton)operator(()operator(\)) operator(&&) operator(()operator(()ident(MetaClass)operator(\))ident(getMetaClass)operator(()operator(\))operator(\))operator(.)ident(getAttached)operator(()operator(\)) operator(==) local_variable(this)operator(\)) operator({) + ident(klass) operator(=) ident(getMetaClass)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(klass) operator(=) ident(makeMetaClass)operator(()ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(klass)operator(.)ident(setTaint)operator(()ident(isTaint)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(isFrozen)operator(()operator(\))operator(\)) ident(klass)operator(.)ident(setFrozen)operator(()keyword(true)operator(\))operator(;) + + keyword(return) ident(klass)operator(;) + operator(}) + + comment(/** rb_singleton_class_clone + * + * Will make sure that if the current objects class is a + * singleton, it will get cloned. + * + * @return either a real class, or a clone of the current singleton class + */) + directive(protected) ident(RubyClass) ident(getSingletonClassClone)operator(()operator(\)) operator({) + ident(RubyClass) ident(klass) operator(=) ident(getMetaClass)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(klass)operator(.)ident(isSingleton)operator(()operator(\))operator(\)) keyword(return) ident(klass)operator(;) + + ident(MetaClass) ident(clone) operator(=) keyword(new) ident(MetaClass)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(clone)operator(.)ident(flags) operator(=) ident(flags)operator(;) + + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyClass)operator(\)) operator({) + ident(clone)operator(.)ident(setMetaClass)operator(()ident(clone)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(clone)operator(.)ident(setMetaClass)operator(()ident(klass)operator(.)ident(getSingletonClassClone)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(clone)operator(.)ident(setSuperClass)operator(()ident(klass)operator(.)ident(getSuperClass)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(klass)operator(.)ident(hasVariables)operator(()operator(\))operator(\)) operator({) + ident(clone)operator(.)ident(syncVariables)operator(()ident(klass)operator(.)ident(getVariableList)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(klass)operator(.)ident(cloneMethods)operator(()ident(clone)operator(\))operator(;) + + operator(()operator(()ident(MetaClass)operator(\))ident(clone)operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(.)ident(setAttached)operator(()ident(clone)operator(\))operator(;) + + operator(()operator(()ident(MetaClass)operator(\))ident(clone)operator(\))operator(.)ident(setAttached)operator(()operator(()operator(()ident(MetaClass)operator(\))ident(klass)operator(\))operator(.)ident(getAttached)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(clone)operator(;) + operator(}) + + comment(/** init_copy + * + * Initializes a copy with variable and special instance variable + * information, and then call the initialize_copy Ruby method. + */) + directive(private) directive(static) type(void) ident(initCopy)operator(()ident(IRubyObject) ident(clone)operator(,) ident(RubyObject) ident(original)operator(\)) operator({) + ident(assert) operator(!)ident(clone)operator(.)ident(isFrozen)operator(()operator(\)) operator(:) string<delimiter(")content(frozen object ()delimiter(")> operator(+) ident(clone)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(\) allocated)delimiter(")>operator(;) + + ident(original)operator(.)ident(copySpecialInstanceVariables)operator(()ident(clone)operator(\))operator(;) + + keyword(if) operator(()ident(original)operator(.)ident(hasVariables)operator(()operator(\))operator(\)) operator({) + ident(clone)operator(.)ident(syncVariables)operator(()ident(original)operator(.)ident(getVariableList)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/* FIXME: finalizer should be dupped here */) + ident(clone)operator(.)ident(callMethod)operator(()ident(clone)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(original)operator(\))operator(;) + operator(}) + + comment(/** OBJ_INFECT + * + * Infects this object with traits from the argument obj. In real + * terms this currently means that if obj is tainted, this object + * will get tainted too. It's possible to hijack this method to do + * other infections if that would be interesting. + */) + directive(public) ident(IRubyObject) ident(infectBy)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()ident(obj)operator(.)ident(isTaint)operator(()operator(\))operator(\)) ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** + * The protocol for super method invocation is a bit complicated + * in Ruby. In real terms it involves first finding the real + * implementation class (the super class\), getting the name of the + * method to call from the frame, and then invoke that on the + * super class with the current self as the actual object + * invoking. + */) + directive(public) ident(IRubyObject) ident(callSuper)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyModule) ident(klazz) operator(=) ident(context)operator(.)ident(getFrameKlazz)operator(()operator(\))operator(;) + + ident(RubyClass) ident(superClass) operator(=) ident(RuntimeHelpers)operator(.)ident(findImplementerIfNecessary)operator(()ident(getMetaClass)operator(()operator(\))operator(,) ident(klazz)operator(\))operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(superClass) operator(==) keyword(null)operator(\)) operator({) + type(String) ident(name) operator(=) ident(context)operator(.)ident(getFrameName)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(callMethodMissing)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(klazz)operator(.)ident(searchMethod)operator(()ident(name)operator(\))operator(,) ident(name)operator(,) ident(args)operator(,) local_variable(this)operator(,) ident(CallType)operator(.)ident(SUPER)operator(,) ident(block)operator(\))operator(;) + operator(}) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invokeAs)operator(()ident(context)operator(,) ident(superClass)operator(,) local_variable(this)operator(,) ident(context)operator(.)ident(getFrameName)operator(()operator(\))operator(,) ident(args)operator(,) ident(CallType)operator(.)ident(SUPER)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** + * Will invoke a named method with no arguments and no block. + */) + directive(public) directive(final) ident(IRubyObject) ident(callMethod)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Will invoke a named method with one argument and no block with + * functional invocation. + */) + directive(public) directive(final) ident(IRubyObject) ident(callMethod)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + comment(/** + * Will invoke a named method with the supplied arguments and no + * block with functional invocation. + */) + directive(public) directive(final) ident(IRubyObject) ident(callMethod)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(args)operator(\))operator(;) + operator(}) + + comment(/** + * Will invoke a named method with the supplied arguments and + * supplied block with functional invocation. + */) + directive(public) directive(final) ident(IRubyObject) ident(callMethod)operator(()ident(ThreadContext) ident(context)operator(,) type(String) ident(name)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** + * Will invoke an indexed method with the no arguments and no + * block. + */) + directive(public) directive(final) ident(IRubyObject) ident(callMethod)operator(()ident(ThreadContext) ident(context)operator(,) type(int) ident(methodIndex)operator(,) type(String) ident(name)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Will invoke an indexed method with the one argument and no + * block with a functional invocation. + */) + directive(public) directive(final) ident(IRubyObject) ident(callMethod)operator(()ident(ThreadContext) ident(context)operator(,) type(int) ident(methodIndex)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + comment(/** + * Call the Ruby initialize method with the supplied arguments and block. + */) + directive(public) directive(final) type(void) ident(callInit)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** rb_to_id + * + * Will try to convert this object to a String using the Ruby + * "to_str" if the object isn't already a String. If this still + * doesn't work, will throw a Ruby TypeError. + * + */) + directive(public) type(String) ident(asJavaString)operator(()operator(\)) operator({) + ident(IRubyObject) ident(asString) operator(=) ident(checkStringType)operator(()operator(\))operator(;) + keyword(if)operator(()operator(!)ident(asString)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) operator(()operator(()ident(RubyString)operator(\))ident(asString)operator(\))operator(.)ident(asJavaString)operator(()operator(\))operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(inspect)operator(()operator(\))operator(.)ident(toString)operator(()operator(\)) operator(+) string<delimiter(")content( is not a symbol)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Tries to convert this object to a Ruby Array using the "to_ary" + * method. + */) + directive(public) ident(RubyArray) ident(convertToArray)operator(()operator(\)) operator({) + keyword(return) operator(()ident(RubyArray)operator(\)) ident(TypeConverter)operator(.)ident(convertToType)operator(()local_variable(this)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getArray)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_ARY)operator(,) string<delimiter(")content(to_ary)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Tries to convert this object to a Ruby Hash using the "to_hash" + * method. + */) + directive(public) ident(RubyHash) ident(convertToHash)operator(()operator(\)) operator({) + keyword(return) operator(()ident(RubyHash)operator(\))ident(TypeConverter)operator(.)ident(convertToType)operator(()local_variable(this)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getHash)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_HASH)operator(,) string<delimiter(")content(to_hash)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Tries to convert this object to a Ruby Float using the "to_f" + * method. + */) + directive(public) ident(RubyFloat) ident(convertToFloat)operator(()operator(\)) operator({) + keyword(return) operator(()ident(RubyFloat)operator(\)) ident(TypeConverter)operator(.)ident(convertToType)operator(()local_variable(this)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getFloat)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_F)operator(,) string<delimiter(")content(to_f)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Tries to convert this object to a Ruby Integer using the "to_int" + * method. + */) + directive(public) ident(RubyInteger) ident(convertToInteger)operator(()operator(\)) operator({) + keyword(return) ident(convertToInteger)operator(()ident(MethodIndex)operator(.)ident(TO_INT)operator(,) string<delimiter(")content(to_int)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Tries to convert this object to a Ruby Integer using the + * supplied conversion method. + */) + directive(public) ident(RubyInteger) ident(convertToInteger)operator(()type(int) ident(convertMethodIndex)operator(,) type(String) ident(convertMethod)operator(\)) operator({) + ident(IRubyObject) ident(val) operator(=) ident(TypeConverter)operator(.)ident(convertToType)operator(()local_variable(this)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getInteger)operator(()operator(\))operator(,) ident(convertMethodIndex)operator(,) ident(convertMethod)operator(,) keyword(true)operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(val) keyword(instanceof) ident(RubyInteger)operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(#)delimiter(")> operator(+) ident(convertMethod) operator(+) string<delimiter(")content( should return Integer)delimiter(")>operator(\))operator(;) + keyword(return) operator(()ident(RubyInteger)operator(\))ident(val)operator(;) + operator(}) + + comment(/** + * Tries to convert this object to a Ruby String using the + * "to_str" method. + */) + directive(public) ident(RubyString) ident(convertToString)operator(()operator(\)) operator({) + keyword(return) operator(()ident(RubyString)operator(\)) ident(TypeConverter)operator(.)ident(convertToType)operator(()local_variable(this)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getString)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_STR)operator(,) string<delimiter(")content(to_str)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * Tries to convert this object to the specified Ruby type, using + * a specific conversion method. + */) + directive(public) directive(final) ident(IRubyObject) ident(convertToType)operator(()ident(RubyClass) ident(target)operator(,) type(int) ident(convertMethodIndex)operator(\)) operator({) + keyword(return) ident(TypeConverter)operator(.)ident(convertToType)operator(()local_variable(this)operator(,) ident(target)operator(,) ident(convertMethodIndex)operator(,) operator(()type(String)operator(\))ident(MethodIndex)operator(.)ident(NAMES)operator(.)ident(get)operator(()ident(convertMethodIndex)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_obj_as_string + * + * First converts this object into a String using the "to_s" + * method, infects it with the current taint and returns it. If + * to_s doesn't return a Ruby String, {@link #anyToString} is used + * instead. + */) + directive(public) ident(RubyString) ident(asString)operator(()operator(\)) operator({) + ident(IRubyObject) ident(str) operator(=) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) local_variable(this)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()operator(!)operator(()ident(str) keyword(instanceof) ident(RubyString)operator(\))operator(\)) keyword(return) operator(()ident(RubyString)operator(\))ident(anyToString)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(str)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) operator(()ident(RubyString)operator(\)) ident(str)operator(;) + operator(}) + + comment(/** rb_check_string_type + * + * Tries to return a coerced string representation of this object, + * using "to_str". If that returns something other than a String + * or nil, an empty String will be returned. + * + */) + directive(public) ident(IRubyObject) ident(checkStringType)operator(()operator(\)) operator({) + ident(IRubyObject) ident(str) operator(=) ident(TypeConverter)operator(.)ident(convertToTypeWithCheck)operator(()local_variable(this)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getString)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_STR)operator(,) string<delimiter(")content(to_str)delimiter(")>operator(\))operator(;) + keyword(if)operator(()operator(!)ident(str)operator(.)ident(isNil)operator(()operator(\)) operator(&&) operator(!)operator(()ident(str) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + ident(str) operator(=) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_check_array_type + * + * Returns the result of trying to convert this object to an Array + * with "to_ary". + */) + directive(public) ident(IRubyObject) ident(checkArrayType)operator(()operator(\)) operator({) + keyword(return) ident(TypeConverter)operator(.)ident(convertToTypeWithCheck)operator(()local_variable(this)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getArray)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(TO_ARY)operator(,) string<delimiter(")content(to_ary)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */) + annotation(@Deprecated) + directive(public) ident(IRubyObject) ident(specificEval)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(mod)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(0)operator(\))operator(;) + + keyword(return) ident(yieldUnder)operator(()ident(context)operator(,) ident(mod)operator(,) ident(block)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(block not supplied)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(3)operator(\)) operator({) + type(String) ident(lastFuncName) operator(=) ident(context)operator(.)ident(getFrameName)operator(()operator(\))operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(() + string<delimiter(")content(wrong # of arguments: )delimiter(")> operator(+) ident(lastFuncName) operator(+) string<delimiter(")content((src\) or )delimiter(")> operator(+) ident(lastFuncName) operator(+) string<delimiter(")content({..})delimiter(")>operator(\))operator(;) + operator(}) + + comment(// We just want the TypeError if the argument doesn't convert to a String (JRUBY-386\)) + ident(RubyString) ident(evalStr)operator(;) + keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(evalStr) operator(=) operator(()ident(RubyString)operator(\))ident(args)operator([)integer(0)operator(])operator(;) + operator(}) keyword(else) operator({) + ident(evalStr) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + operator(}) + + type(String) ident(file)operator(;) + type(int) ident(line)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(file) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(asJavaString)operator(()operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(2)operator(\)) operator({) + ident(line) operator(=) operator(()type(int)operator(\))operator(()ident(args)operator([)integer(2)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\)) operator(-) integer(1)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(line) operator(=) integer(0)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(file) operator(=) string<delimiter(")content((eval\))delimiter(")>operator(;) + ident(line) operator(=) integer(0)operator(;) + operator(}) + + keyword(return) ident(evalUnder)operator(()ident(context)operator(,) ident(mod)operator(,) ident(evalStr)operator(,) ident(file)operator(,) ident(line)operator(\))operator(;) + operator(}) + + comment(/** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */) + directive(public) ident(IRubyObject) ident(specificEval)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(mod)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(yieldUnder)operator(()ident(context)operator(,) ident(mod)operator(,) ident(block)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(block not supplied)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */) + directive(public) ident(IRubyObject) ident(specificEval)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(mod)operator(,) ident(IRubyObject) ident(arg)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(1)operator(,) integer(0)operator(\))operator(;) + + comment(// We just want the TypeError if the argument doesn't convert to a String (JRUBY-386\)) + ident(RubyString) ident(evalStr)operator(;) + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(evalStr) operator(=) operator(()ident(RubyString)operator(\))ident(arg)operator(;) + operator(}) keyword(else) operator({) + ident(evalStr) operator(=) ident(arg)operator(.)ident(convertToString)operator(()operator(\))operator(;) + operator(}) + + type(String) ident(file) operator(=) string<delimiter(")content((eval\))delimiter(")>operator(;) + type(int) ident(line) operator(=) integer(0)operator(;) + + keyword(return) ident(evalUnder)operator(()ident(context)operator(,) ident(mod)operator(,) ident(evalStr)operator(,) ident(file)operator(,) ident(line)operator(\))operator(;) + operator(}) + + comment(/** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */) + directive(public) ident(IRubyObject) ident(specificEval)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(mod)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(2)operator(,) integer(0)operator(\))operator(;) + + comment(// We just want the TypeError if the argument doesn't convert to a String (JRUBY-386\)) + ident(RubyString) ident(evalStr)operator(;) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(evalStr) operator(=) operator(()ident(RubyString)operator(\))ident(arg0)operator(;) + operator(}) keyword(else) operator({) + ident(evalStr) operator(=) ident(arg0)operator(.)ident(convertToString)operator(()operator(\))operator(;) + operator(}) + + type(String) ident(file) operator(=) ident(arg1)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(asJavaString)operator(()operator(\))operator(;) + type(int) ident(line) operator(=) integer(0)operator(;) + + keyword(return) ident(evalUnder)operator(()ident(context)operator(,) ident(mod)operator(,) ident(evalStr)operator(,) ident(file)operator(,) ident(line)operator(\))operator(;) + operator(}) + + comment(/** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */) + directive(public) ident(IRubyObject) ident(specificEval)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(mod)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(2)operator(,) integer(0)operator(\))operator(;) + + comment(// We just want the TypeError if the argument doesn't convert to a String (JRUBY-386\)) + ident(RubyString) ident(evalStr)operator(;) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(evalStr) operator(=) operator(()ident(RubyString)operator(\))ident(arg0)operator(;) + operator(}) keyword(else) operator({) + ident(evalStr) operator(=) ident(arg0)operator(.)ident(convertToString)operator(()operator(\))operator(;) + operator(}) + + type(String) ident(file) operator(=) ident(arg1)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(asJavaString)operator(()operator(\))operator(;) + type(int) ident(line) operator(=) operator(()type(int)operator(\))operator(()ident(arg2)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\)) operator(-) integer(1)operator(\))operator(;) + + keyword(return) ident(evalUnder)operator(()ident(context)operator(,) ident(mod)operator(,) ident(evalStr)operator(,) ident(file)operator(,) ident(line)operator(\))operator(;) + operator(}) + + comment(/** + * Evaluates the string src with self set to the current object, + * using the module under as the context. + * @deprecated Call with an int line number and String file + */) + directive(public) ident(IRubyObject) ident(evalUnder)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(under)operator(,) ident(IRubyObject) ident(src)operator(,) ident(IRubyObject) ident(file)operator(,) ident(IRubyObject) ident(line)operator(\)) operator({) + keyword(return) ident(evalUnder)operator(()ident(context)operator(,) ident(under)operator(,) ident(src)operator(.)ident(convertToString)operator(()operator(\))operator(,) ident(file)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(,) operator(()type(int)operator(\)) operator(()ident(line)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\)) operator(-) integer(1)operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Evaluates the string src with self set to the current object, + * using the module under as the context. + */) + directive(public) ident(IRubyObject) ident(evalUnder)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(under)operator(,) ident(RubyString) ident(src)operator(,) type(String) ident(file)operator(,) type(int) ident(line)operator(\)) operator({) + type(Visibility) ident(savedVisibility) operator(=) ident(context)operator(.)ident(getCurrentVisibility)operator(()operator(\))operator(;) + ident(context)operator(.)ident(setCurrentVisibility)operator(()type(Visibility)operator(.)ident(PUBLIC)operator(\))operator(;) + ident(context)operator(.)ident(preExecuteUnder)operator(()ident(under)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + keyword(try) operator({) + keyword(return) ident(ASTInterpreter)operator(.)ident(evalSimple)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(src)operator(,) + ident(file)operator(,) ident(line)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(context)operator(.)ident(postExecuteUnder)operator(()operator(\))operator(;) + ident(context)operator(.)ident(setCurrentVisibility)operator(()ident(savedVisibility)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Will yield to the specific block changing the self to be the + * current object instead of the self that is part of the frame + * saved in the block frame. This method is the basis for the Ruby + * instance_eval and module_eval methods. The arguments sent in to + * it in the args array will be yielded to the block. This makes + * it possible to emulate both instance_eval and instance_exec + * with this implementation. + */) + directive(private) ident(IRubyObject) ident(yieldUnder)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(under)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(context)operator(.)ident(preExecuteUnder)operator(()ident(under)operator(,) ident(block)operator(\))operator(;) + + type(Visibility) ident(savedVisibility) operator(=) ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(getVisibility)operator(()operator(\))operator(;) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setVisibility)operator(()type(Visibility)operator(.)ident(PUBLIC)operator(\))operator(;) + + keyword(try) operator({) + ident(IRubyObject) ident(valueInYield)operator(;) + type(boolean) ident(aValue)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(valueInYield) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(aValue) operator(=) keyword(false)operator(;) + operator(}) keyword(else) operator({) + ident(valueInYield) operator(=) ident(RubyArray)operator(.)ident(newArrayNoCopy)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(\))operator(;) + ident(aValue) operator(=) keyword(true)operator(;) + operator(}) + + comment(// FIXME: This is an ugly hack to resolve JRUBY-1381; I'm not proud of it) + ident(block) operator(=) ident(block)operator(.)ident(cloneBlock)operator(()operator(\))operator(;) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setSelf)operator(()ident(RubyObject)operator(.)ident(this)operator(\))operator(;) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(getFrame)operator(()operator(\))operator(.)ident(setSelf)operator(()ident(RubyObject)operator(.)ident(this)operator(\))operator(;) + comment(// end hack) + + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(valueInYield)operator(,) ident(RubyObject)operator(.)ident(this)operator(,) ident(context)operator(.)ident(getRubyClass)operator(()operator(\))operator(,) ident(aValue)operator(\))operator(;) + comment(//TODO: Should next and return also catch here?) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(BreakJump) ident(bj)operator(\)) operator({) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(bj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setVisibility)operator(()ident(savedVisibility)operator(\))operator(;) + + ident(context)operator(.)ident(postExecuteUnder)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Will yield to the specific block changing the self to be the + * current object instead of the self that is part of the frame + * saved in the block frame. This method is the basis for the Ruby + * instance_eval and module_eval methods. The arguments sent in to + * it in the args array will be yielded to the block. This makes + * it possible to emulate both instance_eval and instance_exec + * with this implementation. + */) + directive(private) ident(IRubyObject) ident(yieldUnder)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) ident(RubyModule) ident(under)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(context)operator(.)ident(preExecuteUnder)operator(()ident(under)operator(,) ident(block)operator(\))operator(;) + + type(Visibility) ident(savedVisibility) operator(=) ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(getVisibility)operator(()operator(\))operator(;) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setVisibility)operator(()type(Visibility)operator(.)ident(PUBLIC)operator(\))operator(;) + + keyword(try) operator({) + comment(// FIXME: This is an ugly hack to resolve JRUBY-1381; I'm not proud of it) + ident(block) operator(=) ident(block)operator(.)ident(cloneBlock)operator(()operator(\))operator(;) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setSelf)operator(()ident(RubyObject)operator(.)ident(this)operator(\))operator(;) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(getFrame)operator(()operator(\))operator(.)ident(setSelf)operator(()ident(RubyObject)operator(.)ident(this)operator(\))operator(;) + comment(// end hack) + + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) local_variable(this)operator(,) local_variable(this)operator(,) ident(context)operator(.)ident(getRubyClass)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + comment(//TODO: Should next and return also catch here?) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(BreakJump) ident(bj)operator(\)) operator({) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(bj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setVisibility)operator(()ident(savedVisibility)operator(\))operator(;) + + ident(context)operator(.)ident(postExecuteUnder)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(// Methods of the Object class (rb_obj_*\):) + + comment(/** rb_obj_equal + * + * Will by default use identity equality to compare objects. This + * follows the Ruby semantics. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) local_variable(this) operator(==) ident(obj) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_equal + * + * Will use Java identity equality. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(equal?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(equal_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) local_variable(this) operator(==) ident(obj) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** method used for Hash key comparison (specialized for String, Symbol and Fixnum\) + * + * Will by default just call the Ruby method "eql?" + */) + directive(public) type(boolean) ident(eql)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(EQL_P)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_equal + * + * Just like "==" and "equal?", "eql?" will use identity equality for Object. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(eql_p)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) local_variable(this) operator(==) ident(obj) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_equal + * + * The Ruby "===" method is used by default in case/when + * statements. The Object implementation first checks Java identity + * equality and then calls the "==" method too. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(===)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_eqq)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(equalInternal)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Helper method for checking equality, first using Java identity + * equality, and then calling the "==" method. + */) + directive(protected) directive(static) type(boolean) ident(equalInternal)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(IRubyObject) ident(that)operator(,) directive(final) ident(IRubyObject) ident(other)operator(\))operator({) + keyword(return) ident(that) operator(==) ident(other) operator(||) ident(that)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(EQUALEQUAL)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Helper method for checking equality, first using Java identity + * equality, and then calling the "eql?" method. + */) + directive(protected) directive(static) type(boolean) ident(eqlInternal)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) directive(final) ident(IRubyObject) ident(that)operator(,) directive(final) ident(IRubyObject) ident(other)operator(\))operator({) + keyword(return) ident(that) operator(==) ident(other) operator(||) ident(that)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(EQL_P)operator(,) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(other)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_init_copy + * + * Initializes this object as a copy of the original, that is the + * parameter to this object. Will make sure that the argument + * actually has the same real class as this object. It shouldn't + * be possible to initialize an object with something totally + * different. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(original)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(original)operator(\)) keyword(return) local_variable(this)operator(;) + ident(checkFrozen)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\)) operator(!=) ident(original)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(initialize_copy should take same class object)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** obj_respond_to + * + * respond_to?( aSymbol, includePriv=false \) -> true or false + * + * Returns true if this object responds to the given method. Private + * methods are included in the search only if the optional second + * parameter evaluates to true. + * + * @return true if this responds to the given method + * + * !!! For some reason MRI shows the arity of respond_to? as -1, when it should be -2; that's why this is rest instead of required, optional = 1 + * + * Going back to splitting according to method arity. MRI is wrong + * about most of these anyway, and since we have arity splitting + * in both the compiler and the interpreter, the performance + * benefit is important for this method. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(respond_to?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(respond_to_p)operator(()ident(IRubyObject) ident(mname)operator(\)) operator({) + type(String) ident(name) operator(=) ident(mname)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(isMethodBound)operator(()ident(name)operator(,) keyword(true)operator(\))operator(\))operator(;) + operator(}) + + comment(/** obj_respond_to + * + * respond_to?( aSymbol, includePriv=false \) -> true or false + * + * Returns true if this object responds to the given method. Private + * methods are included in the search only if the optional second + * parameter evaluates to true. + * + * @return true if this responds to the given method + * + * !!! For some reason MRI shows the arity of respond_to? as -1, when it should be -2; that's why this is rest instead of required, optional = 1 + * + * Going back to splitting according to method arity. MRI is wrong + * about most of these anyway, and since we have arity splitting + * in both the compiler and the interpreter, the performance + * benefit is important for this method. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(respond_to?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(respond_to_p)operator(()ident(IRubyObject) ident(mname)operator(,) ident(IRubyObject) ident(includePrivate)operator(\)) operator({) + type(String) ident(name) operator(=) ident(mname)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(isMethodBound)operator(()ident(name)operator(,) operator(!)ident(includePrivate)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_obj_id + * + * Return the internal id of an object. + * + * FIXME: Should this be renamed to match its ruby name? + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(object_id)delimiter(")>operator(,) string<delimiter(")content(__id__)delimiter(")>operator(})operator(\)) + directive(public) directive(synchronized) ident(IRubyObject) ident(id)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getObjectSpace)operator(()operator(\))operator(.)ident(idOf)operator(()local_variable(this)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_obj_id_obsolete + * + * Old id version. This one is bound to the "id" name and will emit a deprecation warning. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(id)delimiter(")>operator(\)) + directive(public) directive(synchronized) ident(IRubyObject) ident(id_deprecated)operator(()operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(Object#id will be deprecated; use Object#object_id)delimiter(")>operator(,) string<delimiter(")content(Object#id)delimiter(")>operator(,) string<delimiter(")content(Object#object_id)delimiter(")>operator(\))operator(;) + keyword(return) ident(id)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_id + * + * Will return the hash code of this object. In comparison to MRI, + * this method will use the Java identity hash code instead of + * using rb_obj_id, since the usage of id in JRuby will incur the + * cost of some. ObjectSpace maintenance. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()local_variable(super)operator(.)ident(hashCode)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Override the Object#hashCode method to make sure that the Ruby + * hash is actually used as the hashcode for Ruby objects. If the + * Ruby "hash" method doesn't return a number, the Object#hashCode + * implementation will be used instead. + */) + annotation(@Override) + directive(public) type(int) ident(hashCode)operator(()operator(\)) operator({) + ident(IRubyObject) ident(hashValue) operator(=) ident(callMethod)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(MethodIndex)operator(.)ident(HASH)operator(,) string<delimiter(")content(hash)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(hashValue) keyword(instanceof) ident(RubyFixnum)operator(\)) keyword(return) operator(()type(int)operator(\)) ident(RubyNumeric)operator(.)ident(fix2long)operator(()ident(hashValue)operator(\))operator(;) + + keyword(return) local_variable(super)operator(.)ident(hashCode)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_class + * + * Returns the real class of this object, excluding any + * singleton/meta class in the inheritance chain. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(class)delimiter(")>operator(\)) + directive(public) ident(RubyClass) ident(type)operator(()operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_type + * + * The deprecated version of type, that emits a deprecation + * warning. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(type)delimiter(")>operator(\)) + directive(public) ident(RubyClass) ident(type_deprecated)operator(()operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(Object#type is deprecated; use Object#class)delimiter(")>operator(,) string<delimiter(")content(Object#type)delimiter(")>operator(,) string<delimiter(")content(Object#class)delimiter(")>operator(\))operator(;) + keyword(return) ident(type)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_clone + * + * This method should be overridden only by: Proc, Method, + * UnboundedMethod, Binding. It will use the defined allocated of + * the object, then clone the singleton class, taint the object, + * call initCopy and then copy frozen state. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(clone)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(rbClone)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isImmediate)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't clone )delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + + comment(// We're cloning ourselves, so we know the result should be a RubyObject) + ident(RubyObject) ident(clone) operator(=) operator(()ident(RubyObject)operator(\))ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(clone)operator(.)ident(setMetaClass)operator(()ident(getSingletonClassClone)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(clone)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + + ident(initCopy)operator(()ident(clone)operator(,) local_variable(this)operator(\))operator(;) + + keyword(if) operator(()ident(isFrozen)operator(()operator(\))operator(\)) ident(clone)operator(.)ident(setFrozen)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(clone)operator(;) + operator(}) + + comment(/** rb_obj_dup + * + * This method should be overridden only by: Proc + * + * Will allocate a new instance of the real class of this object, + * and then initialize that copy. It's different from {@link + * #rbClone} in that it doesn't copy the singleton class. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dup)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(dup)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isImmediate)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't dup )delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + + ident(IRubyObject) ident(dup) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(allocate)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) ident(dup)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + + ident(initCopy)operator(()ident(dup)operator(,) local_variable(this)operator(\))operator(;) + + keyword(return) ident(dup)operator(;) + operator(}) + + comment(/** + * Lots of MRI objects keep their state in non-lookupable ivars + * (e:g. Range, Struct, etc\). This method is responsible for + * dupping our java field equivalents + */) + directive(protected) type(void) ident(copySpecialInstanceVariables)operator(()ident(IRubyObject) ident(clone)operator(\)) operator({) + operator(}) + + comment(/** rb_obj_display + * + * call-seq: + * obj.display(port=$>\) => nil + * + * Prints <i>obj</i> on the given port (default <code>$></code>\). + * Equivalent to: + * + * def display(port=$>\) + * port.write self + * end + * + * For example: + * + * 1.display + * "cat".display + * [ 4, 5, 6 ].display + * puts + * + * <em>produces:</em> + * + * 1cat456 + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(display)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(display)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(port) operator(=) ident(args)operator(.)ident(length) operator(==) integer(0) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($>)delimiter(")>operator(\)) operator(:) ident(args)operator([)integer(0)operator(])operator(;) + + ident(port)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_tainted + * + * call-seq: + * obj.tainted? => true or false + * + * Returns <code>true</code> if the object is tainted. + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(tainted?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(tainted_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isTaint)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_obj_taint + * + * call-seq: + * obj.taint -> obj + * + * Marks <i>obj</i> as tainted---if the <code>$SAFE</code> level is + * set appropriately, many method calls which might alter the running + * programs environment will refuse to accept tainted strings. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(taint)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(taint)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(taint)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(private) type(void) ident(taint)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(testFrozen)operator(()string<delimiter(")content(object)delimiter(")>operator(\))operator(;) + ident(setTaint)operator(()keyword(true)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_obj_untaint + * + * call-seq: + * obj.untaint => obj + * + * Removes the taint from <i>obj</i>. + * + * Only callable in if more secure than 3. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(untaint)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(untaint)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(secure)operator(()integer(3)operator(\))operator(;) + + keyword(if) operator(()ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(testFrozen)operator(()string<delimiter(")content(object)delimiter(")>operator(\))operator(;) + ident(setTaint)operator(()keyword(false)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_obj_freeze + * + * call-seq: + * obj.freeze => obj + * + * Prevents further modifications to <i>obj</i>. A + * <code>TypeError</code> will be raised if modification is attempted. + * There is no way to unfreeze a frozen object. See also + * <code>Object#frozen?</code>. + * + * a = [ "a", "b", "c" ] + * a.freeze + * a << "z" + * + * <em>produces:</em> + * + * prog.rb:3:in `<<': can't modify frozen array (TypeError\) + * from prog.rb:3 + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(freeze)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(freeze)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()operator(()ident(flags) operator(&) ident(FROZEN_F)operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't freeze object)delimiter(")>operator(\))operator(;) + operator(}) + ident(flags) operator(|=) ident(FROZEN_F)operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_obj_frozen_p + * + * call-seq: + * obj.frozen? => true or false + * + * Returns the freeze status of <i>obj</i>. + * + * a = [ "a", "b", "c" ] + * a.freeze #=> ["a", "b", "c"] + * a.frozen? #=> true + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(frozen?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(frozen_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isFrozen)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** inspect_obj + * + * The internal helper method that takes care of the part of the + * inspection that inspects instance variables. + */) + directive(private) type(StringBuilder) ident(inspectObj)operator(()type(StringBuilder) ident(part)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + type(String) ident(sep) operator(=) string<delimiter(")delimiter(")>operator(;) + + keyword(for) operator(()ident(Variable)operator(<)ident(IRubyObject)operator(>) ident(ivar) operator(:) ident(getInstanceVariableList)operator(()operator(\))operator(\)) operator({) + ident(part)operator(.)ident(append)operator(()ident(sep)operator(\))operator(.)ident(append)operator(()string<delimiter(")content( )delimiter(")>operator(\))operator(.)ident(append)operator(()ident(ivar)operator(.)ident(getName)operator(()operator(\))operator(\))operator(.)ident(append)operator(()string<delimiter(")content(=)delimiter(")>operator(\))operator(;) + ident(part)operator(.)ident(append)operator(()ident(ivar)operator(.)ident(getValue)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(\))operator(;) + ident(sep) operator(=) string<delimiter(")content(,)delimiter(")>operator(;) + operator(}) + ident(part)operator(.)ident(append)operator(()string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + keyword(return) ident(part)operator(;) + operator(}) + + comment(/** rb_inspect + * + * The internal helper that ensures a RubyString instance is returned + * so dangerous casting can be omitted + * Prefered over callMethod(context, "inspect"\) + */) + directive(static) ident(RubyString) ident(inspect)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(object)operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(objAsString)operator(()ident(context)operator(,) ident(object)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_obj_inspect + * + * call-seq: + * obj.inspect => string + * + * Returns a string containing a human-readable representation of + * <i>obj</i>. If not overridden, uses the <code>to_s</code> method to + * generate the string. + * + * [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \\"five\\"]" + * Time.new.inspect #=> "Wed Apr 09 08:54:39 CDT 2003" + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()operator(()operator(!)ident(isImmediate)operator(()operator(\))operator(\)) operator(&&) + comment(// TYPE(obj\) == T_OBJECT) + operator(!)operator(()local_variable(this) keyword(instanceof) ident(RubyClass)operator(\)) operator(&&) + local_variable(this) operator(!=) ident(runtime)operator(.)ident(getObject)operator(()operator(\)) operator(&&) + local_variable(this) operator(!=) ident(runtime)operator(.)ident(getModule)operator(()operator(\)) operator(&&) + operator(!)operator(()local_variable(this) keyword(instanceof) ident(RubyModule)operator(\)) operator(&&) + comment(// TODO: should have #hasInstanceVariables method, though) + comment(// this will work here:) + ident(hasVariables)operator(()operator(\))operator(\)) operator({) + + type(StringBuilder) ident(part) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + type(String) ident(cname) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(;) + ident(part)operator(.)ident(append)operator(()string<delimiter(")content(#<)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(cname)operator(\))operator(.)ident(append)operator(()string<delimiter(")content(:0x)delimiter(")>operator(\))operator(;) + ident(part)operator(.)ident(append)operator(()type(Integer)operator(.)ident(toHexString)operator(()type(System)operator(.)ident(identityHashCode)operator(()local_variable(this)operator(\))operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(runtime)operator(.)ident(isInspecting)operator(()local_variable(this)operator(\))operator(\)) operator({) + comment(/* 6:tags 16:addr 1:eos */) + ident(part)operator(.)ident(append)operator(()string<delimiter(")content( ...>)delimiter(")>operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newString)operator(()ident(part)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(try) operator({) + ident(runtime)operator(.)ident(registerInspecting)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newString)operator(()ident(inspectObj)operator(()ident(part)operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(runtime)operator(.)ident(unregisterInspecting)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(RubyNil)operator(.)ident(inspect)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) local_variable(this)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** rb_obj_is_instance_of + * + * call-seq: + * obj.instance_of?(class\) => true or false + * + * Returns <code>true</code> if <i>obj</i> is an instance of the given + * class. See also <code>Object#kind_of?</code>. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_of?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(instance_of_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(type)operator(\)) operator({) + keyword(if) operator(()ident(type)operator(()operator(\)) operator(==) ident(type)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(!)operator(()ident(type) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(class or module required)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + operator(}) + + + comment(/** rb_obj_is_kind_of + * + * call-seq: + * obj.is_a?(class\) => true or false + * obj.kind_of?(class\) => true or false + * + * Returns <code>true</code> if <i>class</i> is the class of + * <i>obj</i>, or if <i>class</i> is one of the superclasses of + * <i>obj</i> or modules included in <i>obj</i>. + * + * module M; end + * class A + * include M + * end + * class B < A; end + * class C < B; end + * b = B.new + * b.instance_of? A #=> false + * b.instance_of? B #=> true + * b.instance_of? C #=> false + * b.instance_of? M #=> false + * b.kind_of? A #=> true + * b.kind_of? B #=> true + * b.kind_of? C #=> false + * b.kind_of? M #=> true + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(kind_of?)delimiter(")>operator(,) string<delimiter(")content(is_a?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(kind_of_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(type)operator(\)) operator({) + comment(// TODO: Generalize this type-checking code into IRubyObject helper.) + keyword(if) operator(()operator(!)operator(()ident(type) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) operator({) + comment(// TODO: newTypeError does not offer enough for ruby error string...) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(class or module required)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()operator(()operator(()ident(RubyModule)operator(\))ident(type)operator(\))operator(.)ident(isInstance)operator(()local_variable(this)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_obj_methods + * + * call-seq: + * obj.methods => array + * + * Returns a list of the names of methods publicly accessible in + * <i>obj</i>. This will include all the methods accessible in + * <i>obj</i>'s ancestors. + * + * class Klass + * def kMethod(\) + * end + * end + * k = Klass.new + * k.methods[0..9] #=> ["kMethod", "freeze", "nil?", "is_a?", + * "class", "instance_variable_set", + * "methods", "extend", "__send__", "instance_eval"] + * k.methods.length #=> 42 + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(methods)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(boolean) ident(all) operator(=) keyword(true)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(all) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + + ident(RubyArray) ident(singletonMethods) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(isSingleton)operator(()operator(\))operator(\)) operator({) + ident(singletonMethods) operator(=) + ident(getMetaClass)operator(()operator(\))operator(.)ident(instance_methods)operator(()keyword(new) ident(IRubyObject)type([]) operator({)ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(})operator(\))operator(;) + keyword(if) operator(()ident(all)operator(\)) operator({) + ident(singletonMethods)operator(.)ident(concat)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getSuperClass)operator(()operator(\))operator(.)ident(instance_methods)operator(()keyword(new) ident(IRubyObject)type([]) operator({)ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(})operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(all)operator(\)) operator({) + ident(singletonMethods) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(instance_methods)operator(()keyword(new) ident(IRubyObject)type([]) operator({)ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(})operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(singletonMethods) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newEmptyArray)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(singletonMethods)operator(;) + operator(}) + + comment(/** rb_obj_public_methods + * + * call-seq: + * obj.public_methods(all=true\) => array + * + * Returns the list of public methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(public_methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(public_methods)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(})operator(;) + operator(}) + + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(public_instance_methods)operator(()ident(args)operator(\))operator(;) + operator(}) + + comment(/** rb_obj_protected_methods + * + * call-seq: + * obj.protected_methods(all=true\) => array + * + * Returns the list of protected methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + * + * Internally this implementation uses the + * {@link RubyModule#protected_instance_methods} method. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(protected_methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(protected_methods)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(})operator(;) + operator(}) + + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(protected_instance_methods)operator(()ident(args)operator(\))operator(;) + operator(}) + + comment(/** rb_obj_private_methods + * + * call-seq: + * obj.private_methods(all=true\) => array + * + * Returns the list of private methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + * + * Internally this implementation uses the + * {@link RubyModule#private_instance_methods} method. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(private_methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(private_methods)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(})operator(;) + operator(}) + + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(private_instance_methods)operator(()ident(args)operator(\))operator(;) + operator(}) + + comment(/** rb_obj_singleton_methods + * + * call-seq: + * obj.singleton_methods(all=true\) => array + * + * Returns an array of the names of singleton methods for <i>obj</i>. + * If the optional <i>all</i> parameter is true, the list will include + * methods in modules included in <i>obj</i>. + * + * module Other + * def three(\) end + * end + * + * class Single + * def Single.four(\) end + * end + * + * a = Single.new + * + * def a.one(\) + * end + * + * class << a + * include Other + * def two(\) + * end + * end + * + * Single.singleton_methods #=> ["four"] + * a.singleton_methods(false\) #=> ["two", "one"] + * a.singleton_methods #=> ["two", "one", "three"] + */) + comment(// TODO: This is almost RubyModule#instance_methods on the metaClass. Perhaps refactor.) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(singleton_methods)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyArray) ident(singleton_methods)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(boolean) ident(all) operator(=) keyword(true)operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(all) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(;) + operator(}) + + ident(RubyArray) ident(singletonMethods)operator(;) + keyword(if) operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(isSingleton)operator(()operator(\))operator(\)) operator({) + ident(singletonMethods) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(instance_methods)operator(()keyword(new) ident(IRubyObject)type([]) operator({)ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(})operator(\))operator(;) + keyword(if) operator(()ident(all)operator(\)) operator({) + ident(RubyClass) ident(superClass) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + keyword(while) operator(()ident(superClass)operator(.)ident(isIncluded)operator(()operator(\))operator(\)) operator({) + ident(singletonMethods)operator(.)ident(concat)operator(()ident(superClass)operator(.)ident(instance_methods)operator(()keyword(new) ident(IRubyObject)type([]) operator({)ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(})operator(\))operator(\))operator(;) + ident(superClass) operator(=) ident(superClass)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + ident(singletonMethods) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newEmptyArray)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(singletonMethods)operator(;) + operator(}) + + comment(/** rb_obj_method + * + * call-seq: + * obj.method(sym\) => method + * + * Looks up the named method as a receiver in <i>obj</i>, returning a + * <code>Method</code> object (or raising <code>NameError</code>\). The + * <code>Method</code> object acts as a closure in <i>obj</i>'s object + * instance, so instance variables and the value of <code>self</code> + * remain available. + * + * class Demo + * def initialize(n\) + * @iv = n + * end + * def hello(\) + * "Hello, @iv = #{@iv}" + * end + * end + * + * k = Demo.new(99\) + * m = k.method(:hello\) + * m.call #=> "Hello, @iv = 99" + * + * l = Demo.new('Fred'\) + * m = l.method("hello"\) + * m.call #=> "Hello, @iv = Fred" + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(method)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(method)operator(()ident(IRubyObject) ident(symbol)operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(newMethod)operator(()local_variable(this)operator(,) ident(symbol)operator(.)ident(asJavaString)operator(()operator(\))operator(,) keyword(true)operator(\))operator(;) + operator(}) + + comment(/** + * Internal method that helps to convert any object into the + * format of a class name and a hex string inside of #<>. + */) + directive(public) ident(IRubyObject) ident(anyToString)operator(()operator(\)) operator({) + type(String) ident(cname) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(;) + comment(/* 6:tags 16:addr 1:eos */) + ident(RubyString) ident(str) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(#<)delimiter(")> operator(+) ident(cname) operator(+) string<delimiter(")content(:0x)delimiter(")> operator(+) type(Integer)operator(.)ident(toHexString)operator(()type(System)operator(.)ident(identityHashCode)operator(()local_variable(this)operator(\))operator(\)) operator(+) string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + ident(str)operator(.)ident(setTaint)operator(()ident(isTaint)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_any_to_s + * + * call-seq: + * obj.to_s => string + * + * Returns a string representing <i>obj</i>. The default + * <code>to_s</code> prints the object's class and an encoding of the + * object id. As a special case, the top-level object that is the + * initial execution context of Ruby programs returns ``main.'' + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(return) ident(anyToString)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_any_to_a + * + * call-seq: + * obj.to_a -> anArray + * + * Returns an array representation of <i>obj</i>. For objects of class + * <code>Object</code> and others that don't explicitly override the + * method, the return value is an array containing <code>self</code>. + * However, this latter behavior will soon be obsolete. + * + * self.to_a #=> -:1: warning: default `to_a' will be obsolete + * "hello".to_a #=> ["hello"] + * Time.new.to_a #=> [39, 54, 8, 9, 4, 2003, 3, 99, true, "CDT"] + * + * The default to_a method is deprecated. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_a)delimiter(")>operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PUBLIC)operator(\)) + directive(public) ident(RubyArray) ident(to_a)operator(()operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(default 'to_a' will be obsolete)delimiter(")>operator(,) string<delimiter(")content(to_a)delimiter(")>operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** rb_obj_instance_eval + * + * call-seq: + * obj.instance_eval(string [, filename [, lineno]] \) => obj + * obj.instance_eval {| | block } => obj + * + * Evaluates a string containing Ruby source code, or the given block, + * within the context of the receiver (_obj_\). In order to set the + * context, the variable +self+ is set to _obj_ while + * the code is executing, giving the code access to _obj_'s + * instance variables. In the version of <code>instance_eval</code> + * that takes a +String+, the optional second and third + * parameters supply a filename and starting line number that are used + * when reporting compilation errors. + * + * class Klass + * def initialize + * @secret = 99 + * end + * end + * k = Klass.new + * k.instance_eval { @secret } #=> 99 + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_eval)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(instance_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) ident(getInstanceEvalClass)operator(()operator(\))operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_eval)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(instance_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) ident(getInstanceEvalClass)operator(()operator(\))operator(,) ident(arg0)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_eval)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(instance_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) ident(getInstanceEvalClass)operator(()operator(\))operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_eval)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(instance_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(specificEval)operator(()ident(context)operator(,) ident(getInstanceEvalClass)operator(()operator(\))operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@Deprecated) + directive(public) ident(IRubyObject) ident(instance_eval)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyModule) ident(klazz)operator(;) + + keyword(if) operator(()ident(isImmediate)operator(()operator(\))operator(\)) operator({) + comment(// Ruby uses Qnil here, we use "dummy" because we need a class) + ident(klazz) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDummy)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(klazz) operator(=) ident(getSingletonClass)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(specificEval)operator(()ident(context)operator(,) ident(klazz)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyModule) ident(getInstanceEvalClass)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isImmediate)operator(()operator(\))operator(\)) operator({) + comment(// Ruby uses Qnil here, we use "dummy" because we need a class) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getDummy)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(getSingletonClass)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_obj_instance_exec + * + * call-seq: + * obj.instance_exec(arg...\) {|var...| block } => obj + * + * Executes the given block within the context of the receiver + * (_obj_\). In order to set the context, the variable +self+ is set + * to _obj_ while the code is executing, giving the code access to + * _obj_'s instance variables. Arguments are passed as block parameters. + * + * class Klass + * def initialize + * @secret = 99 + * end + * end + * k = Klass.new + * k.instance_exec(5\) {|x| @secret+x } #=> 104 + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_exec)delimiter(")>operator(,) ident(optional) operator(=) integer(3)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(instance_exec)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(block not supplied)delimiter(")>operator(\))operator(;) + + ident(RubyModule) ident(klazz)operator(;) + keyword(if) operator(()ident(isImmediate)operator(()operator(\))operator(\)) operator({) + comment(// Ruby uses Qnil here, we use "dummy" because we need a class) + ident(klazz) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDummy)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(klazz) operator(=) ident(getSingletonClass)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(yieldUnder)operator(()ident(context)operator(,) ident(klazz)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** rb_obj_extend + * + * call-seq: + * obj.extend(module, ...\) => obj + * + * Adds to _obj_ the instance methods from each module given as a + * parameter. + * + * module Mod + * def hello + * "Hello from Mod.\\n" + * end + * end + * + * class Klass + * def hello + * "Hello from Klass.\\n" + * end + * end + * + * k = Klass.new + * k.hello #=> "Hello from Klass.\\n" + * k.extend(Mod\) #=> #<Klass:0x401b3bc8> + * k.hello #=> "Hello from Mod.\\n" + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(extend)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(extend)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + comment(// Make sure all arguments are modules before calling the callbacks) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(args)operator([)ident(i)operator(])operator(.)ident(isModule)operator(()operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()ident(args)operator([)ident(i)operator(])operator(,) ident(runtime)operator(.)ident(getModule)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + + comment(// MRI extends in order from last to first) + keyword(for) operator(()type(int) ident(i) operator(=) ident(args)operator(.)ident(length) operator(-) integer(1)operator(;) ident(i) operator(>=) integer(0)operator(;) ident(i)operator(--)operator(\)) operator({) + ident(args)operator([)ident(i)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(extend_object)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + ident(args)operator([)ident(i)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(extended)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_obj_dummy + * + * Default initialize method. This one gets defined in some other + * place as a Ruby method. + */) + directive(public) ident(IRubyObject) ident(initialize)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_f_send + * + * send( aSymbol [, args ]* \) -> anObject + * + * Invokes the method identified by aSymbol, passing it any arguments + * specified. You can use __send__ if the name send clashes with an + * existing method in this object. + * + * <pre> + * class Klass + * def hello(*args\) + * "Hello " + args.join(' '\) + * end + * end + * + * k = Klass.new + * k.send :hello, "gentle", "readers" + * </pre> + * + * @return the result of invoking the method identified by aSymbol. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(send)delimiter(")>operator(,) string<delimiter(")content(__send__)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(send)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()integer(0)operator(,) integer(1)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(send)delimiter(")>operator(,) string<delimiter(")content(__send__)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(send)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(String) ident(name) operator(=) ident(arg0)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(finvoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(send)delimiter(")>operator(,) string<delimiter(")content(__send__)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(send)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(String) ident(name) operator(=) ident(arg0)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(finvoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(send)delimiter(")>operator(,) string<delimiter(")content(__send__)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(send)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(String) ident(name) operator(=) ident(arg0)operator(.)ident(asJavaString)operator(()operator(\))operator(;) + + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(finvoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(block)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(send)delimiter(")>operator(,) string<delimiter(")content(__send__)delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(send)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(String) ident(name) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(;) + type(int) ident(newArgsLength) operator(=) ident(args)operator(.)ident(length) operator(-) integer(1)operator(;) + + ident(IRubyObject)type([]) ident(newArgs)operator(;) + keyword(if) operator(()ident(newArgsLength) operator(==) integer(0)operator(\)) operator({) + ident(newArgs) operator(=) ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(;) + operator(}) keyword(else) operator({) + ident(newArgs) operator(=) keyword(new) ident(IRubyObject)operator([)ident(newArgsLength)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(1)operator(,) ident(newArgs)operator(,) integer(0)operator(,) ident(newArgs)operator(.)ident(length)operator(\))operator(;) + operator(}) + + keyword(return) ident(getMetaClass)operator(()operator(\))operator(.)ident(finvoke)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(name)operator(,) ident(newArgs)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** rb_false + * + * call_seq: + * nil.nil? => true + * <anything_else>.nil? => false + * + * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(nil?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(nil_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_pattern_match + * + * call-seq: + * obj =~ other => false + * + * Pattern Match---Overridden by descendents (notably + * <code>Regexp</code> and <code>String</code>\) to provide meaningful + * pattern-match semantics. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(=~)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_match)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(to_java)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getBaseName)operator(()operator(\)) operator(+) string<delimiter(")content( cannot coerce to a Java type.)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(as)operator(()type(Class) ident(javaClass)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getBaseName)operator(()operator(\)) operator(+) string<delimiter(")content( cannot coerce to a Java type.)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.IRubyObject#getType(\) + */) + directive(public) ident(RubyClass) ident(getType)operator(()operator(\)) operator({) + keyword(return) ident(type)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.IRubyObject#dataWrapStruct(\) + */) + directive(public) directive(synchronized) type(void) ident(dataWrapStruct)operator(()type(Object) ident(obj)operator(\)) operator({) + local_variable(this)operator(.)ident(dataStruct) operator(=) ident(obj)operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.IRubyObject#dataGetStruct(\) + */) + directive(public) directive(synchronized) type(Object) ident(dataGetStruct)operator(()operator(\)) operator({) + keyword(return) ident(dataStruct)operator(;) + operator(}) + + comment(/** + * Adds the specified object as a finalizer for this object. + */) + directive(public) type(void) ident(addFinalizer)operator(()ident(IRubyObject) ident(finalizer)operator(\)) operator({) + keyword(if) operator(()local_variable(this)operator(.)ident(finalizer) operator(==) keyword(null)operator(\)) operator({) + local_variable(this)operator(.)ident(finalizer) operator(=) keyword(new) ident(Finalizer)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getObjectSpace)operator(()operator(\))operator(.)ident(idOf)operator(()local_variable(this)operator(\))operator(\))operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(addFinalizer)operator(()local_variable(this)operator(.)ident(finalizer)operator(\))operator(;) + operator(}) + local_variable(this)operator(.)ident(finalizer)operator(.)ident(addFinalizer)operator(()ident(finalizer)operator(\))operator(;) + operator(}) + + comment(/** + * Remove all the finalizers for this object. + */) + directive(public) type(void) ident(removeFinalizers)operator(()operator(\)) operator({) + keyword(if) operator(()ident(finalizer) operator(!=) keyword(null)operator(\)) operator({) + ident(finalizer)operator(.)ident(removeFinalizers)operator(()operator(\))operator(;) + ident(finalizer) operator(=) keyword(null)operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(removeFinalizer)operator(()local_variable(this)operator(.)ident(finalizer)operator(\))operator(;) + operator(}) + operator(}) + + + comment(//) + comment(// INSTANCE VARIABLE RUBY METHODS) + comment(//) + + comment(/** rb_obj_ivar_defined + * + * call-seq: + * obj.instance_variable_defined?(symbol\) => true or false + * + * Returns <code>true</code> if the given instance variable is + * defined in <i>obj</i>. + * + * class Fred + * def initialize(p1, p2\) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99\) + * fred.instance_variable_defined?(:@a\) #=> true + * fred.instance_variable_defined?("@b"\) #=> true + * fred.instance_variable_defined?("@c"\) #=> false + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_variable_defined?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(instance_variable_defined_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(name)operator(\)) operator({) + keyword(if) operator(()ident(variableTableContains)operator(()ident(validateInstanceVariable)operator(()ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(\))operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_ivar_get + * + * call-seq: + * obj.instance_variable_get(symbol\) => obj + * + * Returns the value of the given instance variable, or nil if the + * instance variable is not set. The <code>@</code> part of the + * variable name should be included for regular instance + * variables. Throws a <code>NameError</code> exception if the + * supplied symbol is not valid as an instance variable name. + * + * class Fred + * def initialize(p1, p2\) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99\) + * fred.instance_variable_get(:@a\) #=> "cat" + * fred.instance_variable_get("@b"\) #=> 99 + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_variable_get)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(instance_variable_get)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(name)operator(\)) operator({) + ident(IRubyObject) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(variableTableFetch)operator(()ident(validateInstanceVariable)operator(()ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_obj_ivar_set + * + * call-seq: + * obj.instance_variable_set(symbol, obj\) => obj + * + * Sets the instance variable names by <i>symbol</i> to + * <i>object</i>, thereby frustrating the efforts of the class's + * author to attempt to provide proper encapsulation. The variable + * did not have to exist prior to this call. + * + * class Fred + * def initialize(p1, p2\) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99\) + * fred.instance_variable_set(:@a, 'dog'\) #=> "dog" + * fred.instance_variable_set(:@c, 'cat'\) #=> "cat" + * fred.inspect #=> "#<Fred:0x401b3da8 @a=\\"dog\\", @b=99, @c=\\"cat\\">" + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_variable_set)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(instance_variable_set)operator(()ident(IRubyObject) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(ensureInstanceVariablesSettable)operator(()operator(\))operator(;) + keyword(return) ident(variableTableStore)operator(()ident(validateInstanceVariable)operator(()ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** rb_obj_remove_instance_variable + * + * call-seq: + * obj.remove_instance_variable(symbol\) => obj + * + * Removes the named instance variable from <i>obj</i>, returning that + * variable's value. + * + * class Dummy + * attr_reader :var + * def initialize + * @var = 99 + * end + * def remove + * remove_instance_variable(:@var\) + * end + * end + * d = Dummy.new + * d.var #=> 99 + * d.remove #=> 99 + * d.var #=> nil + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(remove_instance_variable)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(remove_instance_variable)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(name)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(ensureInstanceVariablesSettable)operator(()operator(\))operator(;) + ident(IRubyObject) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(variableTableRemove)operator(()ident(validateInstanceVariable)operator(()ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(instance variable )delimiter(")> operator(+) ident(name)operator(.)ident(asJavaString)operator(()operator(\)) operator(+) string<delimiter(")content( not defined)delimiter(")>operator(,) ident(name)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_obj_instance_variables + * + * call-seq: + * obj.instance_variables => array + * + * Returns an array of instance variable names for the receiver. Note + * that simply defining an accessor does not create the corresponding + * instance variable. + * + * class Fred + * attr_accessor :a1 + * def initialize + * @iv = 3 + * end + * end + * Fred.new.instance_variables #=> ["@iv"] + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(instance_variables)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(instance_variables)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(List)operator(<)type(String)operator(>) ident(nameList) operator(=) ident(getInstanceVariableNameList)operator(()operator(\))operator(;) + + ident(RubyArray) ident(array) operator(=) ident(runtime)operator(.)ident(newArray)operator(()ident(nameList)operator(.)ident(size)operator(()operator(\))operator(\))operator(;) + + keyword(for) operator(()type(String) ident(name) operator(:) ident(nameList)operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newString)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(array)operator(;) + operator(}) + + comment(//) + comment(// INSTANCE VARIABLE API METHODS) + comment(//) + + comment(/** + * Dummy method to avoid a cast, and to avoid polluting the + * IRubyObject interface with all the instance variable management + * methods. + */) + directive(public) ident(InstanceVariables) ident(getInstanceVariables)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InstanceVariables#hasInstanceVariable + */) + directive(public) type(boolean) ident(hasInstanceVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(variableTableContains)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InstanceVariables#fastHasInstanceVariable + */) + directive(public) type(boolean) ident(fastHasInstanceVariable)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(variableTableFastContains)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InstanceVariables#getInstanceVariable + */) + directive(public) ident(IRubyObject) ident(getInstanceVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(variableTableFetch)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InstanceVariables#fastGetInstanceVariable + */) + directive(public) ident(IRubyObject) ident(fastGetInstanceVariable)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(variableTableFastFetch)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + comment(/** rb_iv_set / rb_ivar_set + * + * @see org.jruby.runtime.builtin.InstanceVariables#setInstanceVariable + */) + directive(public) ident(IRubyObject) ident(setInstanceVariable)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(name)operator(\)) operator(&&) ident(value) operator(!=) keyword(null)operator(;) + ident(ensureInstanceVariablesSettable)operator(()operator(\))operator(;) + keyword(return) ident(variableTableStore)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InstanceVariables#fastSetInstanceVariable + */) + directive(public) ident(IRubyObject) ident(fastSetInstanceVariable)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(internedName)operator(\)) operator(&&) ident(value) operator(!=) keyword(null)operator(;) + ident(ensureInstanceVariablesSettable)operator(()operator(\))operator(;) + keyword(return) ident(variableTableFastStore)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InstanceVariables#removeInstanceVariable + */) + directive(public) ident(IRubyObject) ident(removeInstanceVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(name)operator(\))operator(;) + ident(ensureInstanceVariablesSettable)operator(()operator(\))operator(;) + keyword(return) ident(variableTableRemove)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InstanceVariables#getInstanceVariableList + */) + directive(public) type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(getInstanceVariableList)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>)operator(()operator(\))operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(==) keyword(null)operator(\)) ident(readValue) operator(=) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + ident(list)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()ident(e)operator(.)ident(name)operator(,) ident(readValue)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InstanceVariables#getInstanceVariableNameList + */) + directive(public) type(List)operator(<)type(String)operator(>) ident(getInstanceVariableNameList)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + type(ArrayList)operator(<)type(String)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(IdUtil)operator(.)ident(isInstanceVariable)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(e)operator(.)ident(name)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + comment(/** + * The error message used when some one tries to modify an + * instance variable in a high security setting. + */) + directive(protected) directive(static) directive(final) type(String) ident(ERR_INSECURE_SET_INST_VAR) operator(=) string<delimiter(")content(Insecure: can't modify instance variable)delimiter(")>operator(;) + + comment(/** + * Checks if the name parameter represents a legal instance variable name, and otherwise throws a Ruby NameError + */) + directive(protected) type(String) ident(validateInstanceVariable)operator(()type(String) ident(name)operator(\)) operator({) + keyword(if) operator(()ident(IdUtil)operator(.)ident(isValidInstanceVariableName)operator(()ident(name)operator(\))operator(\)) keyword(return) ident(name)operator(;) + + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()string<delimiter(")content(`)delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content(' is not allowable as an instance variable name)delimiter(")>operator(,) ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Makes sure that instance variables can be set on this object, + * including information about whether this object is frozen, or + * tainted. Will throw a suitable exception in that case. + */) + directive(protected) type(void) ident(ensureInstanceVariablesSettable)operator(()operator(\)) operator({) + keyword(if) operator(()operator(!)ident(isFrozen)operator(()operator(\)) operator(&&) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(<) integer(4) operator(||) ident(isTaint)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(return)operator(;) + operator(}) + + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4) operator(&&) operator(!)ident(isTaint)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()ident(ERR_INSECURE_SET_INST_VAR)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(isFrozen)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()local_variable(this) keyword(instanceof) ident(RubyModule)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newFrozenError)operator(()string<delimiter(")content(class/module )delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newFrozenError)operator(()string<delimiter(")delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(//) + comment(// INTERNAL VARIABLE METHODS) + comment(//) + + comment(/** + * Dummy method to avoid a cast, and to avoid polluting the + * IRubyObject interface with all the instance variable management + * methods. + */) + directive(public) ident(InternalVariables) ident(getInternalVariables)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InternalVariables#hasInternalVariable + */) + directive(public) type(boolean) ident(hasInternalVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) operator(!)ident(isRubyVariable)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(variableTableContains)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InternalVariables#fastHasInternalVariable + */) + directive(public) type(boolean) ident(fastHasInternalVariable)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) operator(!)ident(isRubyVariable)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(variableTableFastContains)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InternalVariables#getInternalVariable + */) + directive(public) ident(IRubyObject) ident(getInternalVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) operator(!)ident(isRubyVariable)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(variableTableFetch)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InternalVariables#fastGetInternalVariable + */) + directive(public) ident(IRubyObject) ident(fastGetInternalVariable)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) operator(!)ident(isRubyVariable)operator(()ident(internedName)operator(\))operator(;) + keyword(return) ident(variableTableFastFetch)operator(()ident(internedName)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InternalVariables#setInternalVariable + */) + directive(public) type(void) ident(setInternalVariable)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) operator(!)ident(isRubyVariable)operator(()ident(name)operator(\))operator(;) + ident(variableTableStore)operator(()ident(name)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InternalVariables#fastSetInternalVariable + */) + directive(public) type(void) ident(fastSetInternalVariable)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) operator(!)ident(isRubyVariable)operator(()ident(internedName)operator(\))operator(;) + ident(variableTableFastStore)operator(()ident(internedName)operator(,) ident(value)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InternalVariables#removeInternalVariable + */) + directive(public) ident(IRubyObject) ident(removeInternalVariable)operator(()type(String) ident(name)operator(\)) operator({) + ident(assert) operator(!)ident(isRubyVariable)operator(()ident(name)operator(\))operator(;) + keyword(return) ident(variableTableRemove)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(/** + * Sync one variable table with another - this is used to make + * rbClone work correctly. + */) + directive(public) type(void) ident(syncVariables)operator(()type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(variables)operator(\)) operator({) + ident(variableTableSync)operator(()ident(variables)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.builtin.InternalVariables#getInternalVariableList + */) + directive(public) type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(getInternalVariableList)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>)operator(()operator(\))operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(isRubyVariable)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(==) keyword(null)operator(\)) ident(readValue) operator(=) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + ident(list)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()ident(e)operator(.)ident(name)operator(,) ident(readValue)operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + + comment(//) + comment(// COMMON VARIABLE METHODS) + comment(//) + + comment(/** + * Returns true if object has any variables, defined as: + * <ul> + * <li> instance variables + * <li> class variables + * <li> constants + * <li> internal variables, such as those used when marshaling Ranges and Exceptions + * </ul> + * @return true if object has any variables, else false + */) + directive(public) type(boolean) ident(hasVariables)operator(()operator(\)) operator({) + keyword(return) ident(variableTableGetSize)operator(()operator(\)) operator(>) integer(0)operator(;) + operator(}) + + comment(/** + * Returns the amount of instance variables, class variables, + * constants and internal variables this object has. + */) + directive(public) type(int) ident(getVariableCount)operator(()operator(\)) operator({) + keyword(return) ident(variableTableGetSize)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Gets a list of all variables in this object. + */) + comment(// TODO: must override in RubyModule to pick up constants) + directive(public) type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(getVariableList)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>)operator(()operator(\))operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(==) keyword(null)operator(\)) ident(readValue) operator(=) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + ident(list)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()ident(e)operator(.)ident(name)operator(,) ident(readValue)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + comment(/** + * Gets a name list of all variables in this object. + */) + comment(// TODO: must override in RubyModule to pick up constants) + directive(public) type(List)operator(<)type(String)operator(>) ident(getVariableNameList)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table) operator(=) ident(variableTableGetTable)operator(()operator(\))operator(;) + type(ArrayList)operator(<)type(String)operator(>) ident(list) operator(=) keyword(new) type(ArrayList)operator(<)type(String)operator(>)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(list)operator(.)ident(add)operator(()ident(e)operator(.)ident(name)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(list)operator(;) + operator(}) + + comment(/** + * Gets internal access to the getmap for variables. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + annotation(@Deprecated) comment(// born deprecated) + directive(public) type(Map) ident(getVariableMap)operator(()operator(\)) operator({) + keyword(return) ident(variableTableGetMap)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Check the syntax of a Ruby variable, including that it's longer + * than zero characters, and starts with either an @ or a capital + * letter. + */) + comment(// FIXME: this should go somewhere more generic -- maybe IdUtil) + directive(protected) directive(static) directive(final) type(boolean) ident(isRubyVariable)operator(()type(String) ident(name)operator(\)) operator({) + type(char) ident(c)operator(;) + keyword(return) ident(name)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(&&) operator(()operator(()ident(c) operator(=) ident(name)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(\)) operator(==) string<delimiter(')content(@)delimiter(')> operator(||) operator(()ident(c) operator(<=) string<delimiter(')content(Z)delimiter(')> operator(&&) ident(c) operator(>=) string<delimiter(')content(A)delimiter(')>operator(\))operator(\))operator(;) + operator(}) + + comment(//) + comment(// VARIABLE TABLE METHODS, ETC.) + comment(//) + + directive(protected) directive(static) directive(final) type(int) ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(=) integer(8)operator(;) comment(// MUST be power of 2!) + directive(protected) directive(static) directive(final) type(int) ident(VARIABLE_TABLE_MAXIMUM_CAPACITY) operator(=) integer(1) operator(<)operator(<) integer(30)operator(;) + directive(protected) directive(static) directive(final) type(float) ident(VARIABLE_TABLE_LOAD_FACTOR) operator(=) float(0.75f)operator(;) + directive(protected) directive(static) directive(final) ident(VariableTableEntry)type([]) ident(VARIABLE_TABLE_EMPTY_TABLE) operator(=) keyword(new) ident(VariableTableEntry)operator([)integer(0)operator(])operator(;) + + comment(/** + * Every entry in the variable map is represented by an instance + * of this class. + */) + directive(protected) directive(static) directive(final) type(class) class(VariableTableEntry) operator({) + directive(final) type(int) ident(hash)operator(;) + directive(final) type(String) ident(name)operator(;) + directive(volatile) ident(IRubyObject) ident(value)operator(;) + directive(final) ident(VariableTableEntry) ident(next)operator(;) + + ident(VariableTableEntry)operator(()type(int) ident(hash)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(,) ident(VariableTableEntry) ident(next)operator(\)) operator({) + ident(assert) ident(name) operator(==) ident(name)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(name) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + local_variable(this)operator(.)ident(hash) operator(=) ident(hash)operator(;) + local_variable(this)operator(.)ident(name) operator(=) ident(name)operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + local_variable(this)operator(.)ident(next) operator(=) ident(next)operator(;) + operator(}) + operator(}) + + comment(/** + * Reads the value of the specified entry, locked on the current + * object. + */) + directive(protected) directive(synchronized) ident(IRubyObject) ident(variableTableReadLocked)operator(()ident(VariableTableEntry) ident(entry)operator(\)) operator({) + keyword(return) ident(entry)operator(.)ident(value)operator(;) + operator(}) + + comment(/** + * Checks if the variable table contains a variable of the + * specified name. + */) + directive(protected) type(boolean) ident(variableTableContains)operator(()type(String) ident(name)operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** + * Checks if the variable table contains the the variable of the + * specified name, where the precondition is that the name must be + * an interned Java String. + */) + directive(protected) type(boolean) ident(variableTableFastContains)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( not interned)delimiter(")>operator(;) + ident(VariableTableEntry)type([]) ident(table)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(internedName)operator(.)ident(hashCode)operator(()operator(\)) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** + * Fetch an object from the variable table based on the name. + * + * @return the object or null if not found + */) + directive(protected) ident(IRubyObject) ident(variableTableFetch)operator(()type(String) ident(name)operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(!=) keyword(null)operator(\)) keyword(return) ident(readValue)operator(;) + keyword(return) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** + * Fetch an object from the variable table based on the name, + * where the name must be an interned Java String. + * + * @return the object or null if not found + */) + directive(protected) ident(IRubyObject) ident(variableTableFastFetch)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( not interned)delimiter(")>operator(;) + ident(VariableTableEntry)type([]) ident(table)operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(internedName)operator(.)ident(hashCode)operator(()operator(\)) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(!=) keyword(null)operator(\)) keyword(return) ident(readValue)operator(;) + keyword(return) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** + * Store a value in the variable store under the specific name. + */) + directive(protected) ident(IRubyObject) ident(variableTableStore)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + directive(synchronized)operator(()local_variable(this)operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + ident(VariableTableEntry) ident(e)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(table) operator(=) keyword(new) ident(VariableTableEntry)operator([)ident(VARIABLE_TABLE_DEFAULT_CAPACITY)operator(])operator(;) + ident(e) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(hash)operator(,) ident(name)operator(.)ident(intern)operator(()operator(\))operator(,) ident(value)operator(,) keyword(null)operator(\))operator(;) + ident(table)operator([)ident(hash) operator(&) operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(-) integer(1)operator(\))operator(]) operator(=) ident(e)operator(;) + ident(variableTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(*) ident(VARIABLE_TABLE_LOAD_FACTOR)operator(\))operator(;) + ident(variableTableSize) operator(=) integer(1)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) + keyword(return) ident(value)operator(;) + operator(}) + type(int) ident(potentialNewSize)operator(;) + keyword(if) operator(()operator(()ident(potentialNewSize) operator(=) ident(variableTableSize) operator(+) integer(1)operator(\)) operator(>) ident(variableTableThreshold)operator(\)) operator({) + ident(table) operator(=) ident(variableTableRehash)operator(()operator(\))operator(;) + operator(}) + type(int) ident(index)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(table)operator([)ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + ident(e)operator(.)ident(value) operator(=) ident(value)operator(;) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + ident(e) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(hash)operator(,) ident(name)operator(.)ident(intern)operator(()operator(\))operator(,) ident(value)operator(,) ident(table)operator([)ident(index)operator(])operator(\))operator(;) + ident(table)operator([)ident(index)operator(]) operator(=) ident(e)operator(;) + ident(variableTableSize) operator(=) ident(potentialNewSize)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) comment(// write-volatile) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + comment(/** + * Will store the value under the specified name, where the name + * needs to be an interned Java String. + */) + directive(protected) ident(IRubyObject) ident(variableTableFastStore)operator(()type(String) ident(internedName)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( not interned)delimiter(")>operator(;) + type(int) ident(hash) operator(=) ident(internedName)operator(.)ident(hashCode)operator(()operator(\))operator(;) + directive(synchronized)operator(()local_variable(this)operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + ident(VariableTableEntry) ident(e)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(==) keyword(null)operator(\)) operator({) + ident(table) operator(=) keyword(new) ident(VariableTableEntry)operator([)ident(VARIABLE_TABLE_DEFAULT_CAPACITY)operator(])operator(;) + ident(e) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(hash)operator(,) ident(internedName)operator(,) ident(value)operator(,) keyword(null)operator(\))operator(;) + ident(table)operator([)ident(hash) operator(&) operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(-) integer(1)operator(\))operator(]) operator(=) ident(e)operator(;) + ident(variableTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(*) ident(VARIABLE_TABLE_LOAD_FACTOR)operator(\))operator(;) + ident(variableTableSize) operator(=) integer(1)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) + keyword(return) ident(value)operator(;) + operator(}) + type(int) ident(potentialNewSize)operator(;) + keyword(if) operator(()operator(()ident(potentialNewSize) operator(=) ident(variableTableSize) operator(+) integer(1)operator(\)) operator(>) ident(variableTableThreshold)operator(\)) operator({) + ident(table) operator(=) ident(variableTableRehash)operator(()operator(\))operator(;) + operator(}) + type(int) ident(index)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(table)operator([)ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + ident(e)operator(.)ident(value) operator(=) ident(value)operator(;) + keyword(return) ident(value)operator(;) + operator(}) + operator(}) + ident(e) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(hash)operator(,) ident(internedName)operator(,) ident(value)operator(,) ident(table)operator([)ident(index)operator(])operator(\))operator(;) + ident(table)operator([)ident(index)operator(]) operator(=) ident(e)operator(;) + ident(variableTableSize) operator(=) ident(potentialNewSize)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) comment(// write-volatile) + operator(}) + keyword(return) ident(value)operator(;) + operator(}) + + comment(/** + * Removes the entry with the specified name from the variable + * table, and returning the removed value. + */) + directive(protected) ident(IRubyObject) ident(variableTableRemove)operator(()type(String) ident(name)operator(\)) operator({) + directive(synchronized)operator(()local_variable(this)operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + type(int) ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(;) + ident(VariableTableEntry) ident(first) operator(=) ident(table)operator([)ident(index)operator(])operator(;) + ident(VariableTableEntry) ident(e)operator(;) + keyword(for) operator(()ident(e) operator(=) ident(first)operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + ident(IRubyObject) ident(oldValue) operator(=) ident(e)operator(.)ident(value)operator(;) + comment(// All entries following removed node can stay) + comment(// in list, but all preceding ones need to be) + comment(// cloned.) + ident(VariableTableEntry) ident(newFirst) operator(=) ident(e)operator(.)ident(next)operator(;) + keyword(for) operator(()ident(VariableTableEntry) ident(p) operator(=) ident(first)operator(;) ident(p) operator(!=) ident(e)operator(;) ident(p) operator(=) ident(p)operator(.)ident(next)operator(\)) operator({) + ident(newFirst) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(p)operator(.)ident(hash)operator(,) ident(p)operator(.)ident(name)operator(,) ident(p)operator(.)ident(value)operator(,) ident(newFirst)operator(\))operator(;) + operator(}) + ident(table)operator([)ident(index)operator(]) operator(=) ident(newFirst)operator(;) + ident(variableTableSize)operator(--)operator(;) + ident(variableTable) operator(=) ident(table)operator(;) comment(// write-volatile ) + keyword(return) ident(oldValue)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** + * Get the actual table used to save variable entries. + */) + directive(protected) ident(VariableTableEntry)type([]) ident(variableTableGetTable)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(table)operator(;) + operator(}) + keyword(return) ident(VARIABLE_TABLE_EMPTY_TABLE)operator(;) + operator(}) + + comment(/** + * Get the size of the variable table. + */) + directive(protected) type(int) ident(variableTableGetSize)operator(()operator(\)) operator({) + keyword(if) operator(()ident(variableTable) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(variableTableSize)operator(;) + operator(}) + keyword(return) integer(0)operator(;) + operator(}) + + comment(/** + * Synchronize the variable table with the argument. In real terms + * this means copy all entries into a newly allocated table. + */) + directive(protected) type(void) ident(variableTableSync)operator(()type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(vars)operator(\)) operator({) + directive(synchronized)operator(()local_variable(this)operator(\)) operator({) + ident(variableTableSize) operator(=) integer(0)operator(;) + ident(variableTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(VARIABLE_TABLE_DEFAULT_CAPACITY) operator(*) ident(VARIABLE_TABLE_LOAD_FACTOR)operator(\))operator(;) + ident(variableTable) operator(=) keyword(new) ident(VariableTableEntry)operator([)ident(VARIABLE_TABLE_DEFAULT_CAPACITY)operator(])operator(;) + keyword(for) operator(()ident(Variable)operator(<)ident(IRubyObject)operator(>) ident(var) operator(:) ident(vars)operator(\)) operator({) + ident(variableTableStore)operator(()ident(var)operator(.)ident(getName)operator(()operator(\))operator(,) ident(var)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** + * Rehashes the variable table. Must be called from a synchronized + * block. + */) + comment(// MUST be called from synchronized/locked block!) + comment(// should only be called by variableTableStore/variableTableFastStore) + directive(protected) directive(final) ident(VariableTableEntry)type([]) ident(variableTableRehash)operator(()operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(oldTable) operator(=) ident(variableTable)operator(;) + type(int) ident(oldCapacity)operator(;) + keyword(if) operator(()operator(()ident(oldCapacity) operator(=) ident(oldTable)operator(.)ident(length)operator(\)) operator(>=) ident(VARIABLE_TABLE_MAXIMUM_CAPACITY)operator(\)) operator({) + keyword(return) ident(oldTable)operator(;) + operator(}) + + type(int) ident(newCapacity) operator(=) ident(oldCapacity) operator(<)operator(<) integer(1)operator(;) + ident(VariableTableEntry)type([]) ident(newTable) operator(=) keyword(new) ident(VariableTableEntry)operator([)ident(newCapacity)operator(])operator(;) + ident(variableTableThreshold) operator(=) operator(()type(int)operator(\))operator(()ident(newCapacity) operator(*) ident(VARIABLE_TABLE_LOAD_FACTOR)operator(\))operator(;) + type(int) ident(sizeMask) operator(=) ident(newCapacity) operator(-) integer(1)operator(;) + ident(VariableTableEntry) ident(e)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(oldCapacity)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + comment(// We need to guarantee that any existing reads of old Map can) + comment(// proceed. So we cannot yet null out each bin.) + ident(e) operator(=) ident(oldTable)operator([)ident(i)operator(])operator(;) + + keyword(if) operator(()ident(e) operator(!=) keyword(null)operator(\)) operator({) + ident(VariableTableEntry) ident(next) operator(=) ident(e)operator(.)ident(next)operator(;) + type(int) ident(idx) operator(=) ident(e)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + + comment(// Single node on list) + keyword(if) operator(()ident(next) operator(==) keyword(null)operator(\)) + ident(newTable)operator([)ident(idx)operator(]) operator(=) ident(e)operator(;) + + keyword(else) operator({) + comment(// Reuse trailing consecutive sequence at same slot) + ident(VariableTableEntry) ident(lastRun) operator(=) ident(e)operator(;) + type(int) ident(lastIdx) operator(=) ident(idx)operator(;) + keyword(for) operator(()ident(VariableTableEntry) ident(last) operator(=) ident(next)operator(;) + ident(last) operator(!=) keyword(null)operator(;) + ident(last) operator(=) ident(last)operator(.)ident(next)operator(\)) operator({) + type(int) ident(k) operator(=) ident(last)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + keyword(if) operator(()ident(k) operator(!=) ident(lastIdx)operator(\)) operator({) + ident(lastIdx) operator(=) ident(k)operator(;) + ident(lastRun) operator(=) ident(last)operator(;) + operator(}) + operator(}) + ident(newTable)operator([)ident(lastIdx)operator(]) operator(=) ident(lastRun)operator(;) + + comment(// Clone all remaining nodes) + keyword(for) operator(()ident(VariableTableEntry) ident(p) operator(=) ident(e)operator(;) ident(p) operator(!=) ident(lastRun)operator(;) ident(p) operator(=) ident(p)operator(.)ident(next)operator(\)) operator({) + type(int) ident(k) operator(=) ident(p)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + ident(VariableTableEntry) ident(m) operator(=) keyword(new) ident(VariableTableEntry)operator(()ident(p)operator(.)ident(hash)operator(,) ident(p)operator(.)ident(name)operator(,) ident(p)operator(.)ident(value)operator(,) ident(newTable)operator([)ident(k)operator(])operator(\))operator(;) + ident(newTable)operator([)ident(k)operator(]) operator(=) ident(m)operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + ident(variableTable) operator(=) ident(newTable)operator(;) + keyword(return) ident(newTable)operator(;) + operator(}) + + comment(/** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + directive(protected) type(Map) ident(variableTableGetMap)operator(()operator(\)) operator({) + type(HashMap) ident(map) operator(=) keyword(new) type(HashMap)operator(()operator(\))operator(;) + ident(VariableTableEntry)type([]) ident(table)operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(==) keyword(null)operator(\)) ident(readValue) operator(=) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + ident(map)operator(.)ident(put)operator(()ident(e)operator(.)ident(name)operator(,) ident(readValue)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(map)operator(;) + operator(}) + + comment(/** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unchecked)delimiter(")>operator(\)) + directive(protected) type(Map) ident(variableTableGetMap)operator(()type(Map) ident(map)operator(\)) operator({) + ident(VariableTableEntry)type([]) ident(table)operator(;) + ident(IRubyObject) ident(readValue)operator(;) + keyword(if) operator(()operator(()ident(table) operator(=) ident(variableTable)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(VariableTableEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()operator(()ident(readValue) operator(=) ident(e)operator(.)ident(value)operator(\)) operator(==) keyword(null)operator(\)) ident(readValue) operator(=) ident(variableTableReadLocked)operator(()ident(e)operator(\))operator(;) + ident(map)operator(.)ident(put)operator(()ident(e)operator(.)ident(name)operator(,) ident(readValue)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) ident(map)operator(;) + operator(}) + + comment(/** + * Tries to support Java serialization of Ruby objects. This is + * still experimental and might not work. + */) + comment(// NOTE: Serialization is primarily supported for testing purposes, and there is no general) + comment(// guarantee that serialization will work correctly. Specifically, instance variables pointing) + comment(// at symbols, threads, modules, classes, and other unserializable types are not detected.) + directive(private) type(void) ident(writeObject)operator(()type(ObjectOutputStream) ident(out)operator(\)) directive(throws) type(IOException) operator({) + ident(out)operator(.)ident(defaultWriteObject)operator(()operator(\))operator(;) + comment(// write out ivar count followed by name/value pairs) + type(List)operator(<)type(String)operator(>) ident(names) operator(=) ident(getInstanceVariableNameList)operator(()operator(\))operator(;) + ident(out)operator(.)ident(writeInt)operator(()ident(names)operator(.)ident(size)operator(()operator(\))operator(\))operator(;) + keyword(for) operator(()type(String) ident(name) operator(:) ident(names)operator(\)) operator({) + ident(out)operator(.)ident(writeObject)operator(()ident(name)operator(\))operator(;) + ident(out)operator(.)ident(writeObject)operator(()ident(getInstanceVariables)operator(()operator(\))operator(.)ident(getInstanceVariable)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Tries to support Java unserialization of Ruby objects. This is + * still experimental and might not work. + */) + directive(private) type(void) ident(readObject)operator(()type(ObjectInputStream) ident(in)operator(\)) directive(throws) type(IOException)operator(,) type(ClassNotFoundException) operator({) + ident(in)operator(.)ident(defaultReadObject)operator(()operator(\))operator(;) + comment(// rest in ivar count followed by name/value pairs) + type(int) ident(ivarCount) operator(=) ident(in)operator(.)ident(readInt)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(ivarCount)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(setInstanceVariable)operator(()operator(()type(String)operator(\))ident(in)operator(.)ident(readObject)operator(()operator(\))operator(,) operator(()ident(IRubyObject)operator(\))ident(in)operator(.)ident(readObject)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + +operator(}) + +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * + * @author nicksieger + */) +directive(public) type(interface) ident(RubyObjectAdapter) operator({) + + type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(value)operator(,) ident(RubyModule) ident(rubyModule)operator(\))operator(;) + + ident(IRubyObject) ident(setInstanceVariable)operator(()ident(IRubyObject) ident(obj)operator(,) type(String) ident(variableName)operator(,) ident(IRubyObject) ident(value)operator(\))operator(;) + + ident(IRubyObject)type([]) ident(convertToJavaArray)operator(()ident(IRubyObject) ident(array)operator(\))operator(;) + + ident(RubyInteger) ident(convertToRubyInteger)operator(()ident(IRubyObject) ident(obj)operator(\))operator(;) + + ident(IRubyObject) ident(getInstanceVariable)operator(()ident(IRubyObject) ident(obj)operator(,) type(String) ident(variableName)operator(\))operator(;) + + ident(RubyString) ident(convertToRubyString)operator(()ident(IRubyObject) ident(obj)operator(\))operator(;) + + comment(// These call* assume ThreadContext = receiver.getRuntime(\).getCurrentContext(\)) + ident(IRubyObject) ident(callMethod)operator(()ident(IRubyObject) ident(receiver)operator(,) type(String) ident(methodName)operator(\))operator(;) + + ident(IRubyObject) ident(callMethod)operator(()ident(IRubyObject) ident(receiver)operator(,) type(String) ident(methodName)operator(,) ident(IRubyObject) ident(singleArg)operator(\))operator(;) + + ident(IRubyObject) ident(callMethod)operator(()ident(IRubyObject) ident(receiver)operator(,) type(String) ident(methodName)operator(,) ident(IRubyObject)type([]) ident(args)operator(\))operator(;) + + ident(IRubyObject) ident(callMethod)operator(()ident(IRubyObject) ident(receiver)operator(,) type(String) ident(methodName)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\))operator(;) + + ident(IRubyObject) ident(callSuper)operator(()ident(IRubyObject) ident(receiver)operator(,) ident(IRubyObject)type([]) ident(args)operator(\))operator(;) + + ident(IRubyObject) ident(callSuper)operator(()ident(IRubyObject) ident(receiver)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\))operator(;) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.util.Iterator)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(ObjectSpace)delimiter(")>operator(\)) +directive(public) type(class) class(RubyObjectSpace) operator({) + + comment(/** Create the ObjectSpace module and add it to the Ruby runtime. + * + */) + directive(public) directive(static) ident(RubyModule) ident(createObjectSpaceModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(objectSpaceModule) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(ObjectSpace)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setObjectSpaceModule)operator(()ident(objectSpaceModule)operator(\))operator(;) + + ident(objectSpaceModule)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyObjectSpace)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(objectSpaceModule)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(define_finalizer)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(define_finalizer)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(finalizer) operator(=) keyword(null)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(2)operator(\)) operator({) + ident(finalizer) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + keyword(if) operator(()operator(!)ident(finalizer)operator(.)ident(respondsTo)operator(()string<delimiter(")content(call)delimiter(")>operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong type argument )delimiter(")> + operator(+) ident(finalizer)operator(.)ident(getType)operator(()operator(\)) operator(+) string<delimiter(")content( (should be callable\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(finalizer) operator(=) ident(runtime)operator(.)ident(newProc)operator(()ident(Block)operator(.)ident(Type)operator(.)ident(PROC)operator(,) ident(block)operator(\))operator(;) + operator(}) + ident(IRubyObject) ident(obj) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(runtime)operator(.)ident(getObjectSpace)operator(()operator(\))operator(.)ident(addFinalizer)operator(()ident(obj)operator(,) ident(finalizer)operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(newFixnum)operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\))operator(\))operator(,) ident(finalizer)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(undefine_finalizer)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(undefine_finalizer)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getObjectSpace)operator(()operator(\))operator(.)ident(removeFinalizers)operator(()ident(RubyNumeric)operator(.)ident(fix2long)operator(()ident(arg1)operator(.)ident(id)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(return) ident(recv)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(_id2ref)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(id2ref)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(id)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(id)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(id) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(id)operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFixnum)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(RubyFixnum) ident(idFixnum) operator(=) operator(()ident(RubyFixnum)operator(\)) ident(id)operator(;) + type(long) ident(longId) operator(=) ident(idFixnum)operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(longId) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(longId) operator(==) integer(2)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(longId) operator(==) integer(4)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(longId) operator(%) integer(2) operator(!=) integer(0)operator(\)) operator({) + comment(// odd) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()operator(()ident(longId) operator(-) integer(1)operator(\)) operator(/) integer(2)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(object) operator(=) ident(runtime)operator(.)ident(getObjectSpace)operator(()operator(\))operator(.)ident(id2ref)operator(()ident(longId)operator(\))operator(;) + keyword(if) operator(()ident(object) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(object)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_object)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(each_object)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyModule) ident(rubyClass)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(rubyClass) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getObject)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()operator(!)operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyModule)operator(\))operator(\)) keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(class or module required)delimiter(")>operator(\))operator(;) + ident(rubyClass) operator(=) operator(()ident(RubyModule)operator(\)) ident(args)operator([)integer(0)operator(])operator(;) + operator(}) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(count) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(rubyClass) operator(!=) ident(runtime)operator(.)ident(getClassClass)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()operator(!)ident(runtime)operator(.)ident(isObjectSpaceEnabled)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newRuntimeError)operator(()string<delimiter(")content(ObjectSpace is disabled; each_object will only work with Class, pass +O to enable)delimiter(")>operator(\))operator(;) + operator(}) + type(Iterator) ident(iter) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getObjectSpace)operator(()operator(\))operator(.)ident(iterator)operator(()ident(rubyClass)operator(\))operator(;) + + ident(IRubyObject) ident(obj) operator(=) keyword(null)operator(;) + keyword(while) operator(()operator(()ident(obj) operator(=) operator(()ident(IRubyObject)operator(\))ident(iter)operator(.)ident(next)operator(()operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(count)operator(++)operator(;) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(obj)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + type(Iterator) ident(iter) operator(=) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(subclasses)operator(()keyword(true)operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) + + keyword(while) operator(()ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(\)) operator({) + ident(count)operator(++)operator(;) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) operator(()ident(IRubyObject)operator(\))ident(iter)operator(.)ident(next)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(count)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(garbage_collect)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(garbage_collect)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(RubyGC)operator(.)ident(start)operator(()ident(recv)operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.callback.Callback)operator(;) + +comment(/** + * + * @author jpetersen + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Precision)delimiter(")>operator(\)) +directive(public) type(class) class(RubyPrecision) operator({) + + directive(public) directive(static) ident(RubyModule) ident(createPrecisionModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(precisionModule) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Precision)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setPrecision)operator(()ident(precisionModule)operator(\))operator(;) + + ident(precisionModule)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyPrecision)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(precisionModule)operator(;) + operator(}) + + directive(public) directive(static) ident(IRubyObject) ident(induced_from)operator(()ident(IRubyObject) ident(receiver)operator(,) ident(IRubyObject) ident(source)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(throw) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Undefined conversion from )delimiter(")> operator(+) ident(source)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( into )delimiter(")> operator(+) operator(()operator(()ident(RubyClass)operator(\))ident(receiver)operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(append_features)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(append_features)operator(()ident(IRubyObject) ident(receiver)operator(,) ident(IRubyObject) ident(include)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(include) keyword(instanceof) ident(RubyModule)operator(\)) operator({) + operator(()operator(()ident(RubyModule)operator(\)) ident(include)operator(\))operator(.)ident(includeModule)operator(()ident(receiver)operator(\))operator(;) + ident(include)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineMethod)operator(()string<delimiter(")content(induced_from)delimiter(")>operator(,) keyword(new) type(Callback)operator(()operator(\)) operator({) + + directive(public) ident(IRubyObject) ident(execute)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) integer(1)operator(,) integer(1)operator(\))operator(;) + + keyword(return) ident(RubyPrecision)operator(.)ident(induced_from)operator(()ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(Arity) ident(getArity)operator(()operator(\)) operator({) + keyword(return) ident(Arity)operator(.)ident(ONE_ARGUMENT)operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + keyword(return) ident(receiver)operator(;) + operator(}) + + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(prec)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(prec)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(receiver)operator(,) ident(IRubyObject) ident(type)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(type)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(receiver)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(prec_i)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(prec_i)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(receiver)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getInteger)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(receiver)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(prec_f)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(prec_f)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(receiver)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFloat)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(receiver)operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2007 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.lang.reflect.InvocationHandler)operator(;) +keyword(import) include(java.lang.reflect.Method)operator(;) +keyword(import) include(java.lang.reflect.Proxy)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.exceptions.JumpException)operator(;) +keyword(import) include(org.jruby.internal.runtime.JumpTarget)operator(;) +keyword(import) include(org.jruby.java.MiniJava)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Proc)delimiter(")>operator(\)) +directive(public) type(class) class(RubyProc) directive(extends) ident(RubyObject) directive(implements) ident(JumpTarget) operator({) + directive(private) ident(Block) ident(block) operator(=) ident(Block)operator(.)ident(NULL_BLOCK)operator(;) + directive(private) ident(Block)operator(.)ident(Type) ident(type)operator(;) + directive(private) type(String) ident(file)operator(;) + directive(private) type(int) ident(line)operator(;) + + directive(public) ident(RubyProc)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) ident(Block)operator(.)ident(Type) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + + local_variable(this)operator(.)ident(type) operator(=) ident(type)operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(PROC_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(RubyProc) ident(instance) operator(=) ident(RubyProc)operator(.)ident(newProc)operator(()ident(runtime)operator(,) ident(Block)operator(.)ident(Type)operator(.)ident(PROC)operator(\))operator(;) + + ident(instance)operator(.)ident(setMetaClass)operator(()ident(klass)operator(\))operator(;) + + keyword(return) ident(instance)operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createProcClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(procClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Proc)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(PROC_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setProc)operator(()ident(procClass)operator(\))operator(;) + + ident(procClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyProc)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(procClass)operator(;) + operator(}) + + directive(public) ident(Block) ident(getBlock)operator(()operator(\)) operator({) + keyword(return) ident(block)operator(;) + operator(}) + + comment(// Proc class) + + directive(public) directive(static) ident(RubyProc) ident(newProc)operator(()ident(Ruby) ident(runtime)operator(,) ident(Block)operator(.)ident(Type) ident(type)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyProc)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getProc)operator(()operator(\))operator(,) ident(type)operator(\))operator(;) + operator(}) + directive(public) directive(static) ident(RubyProc) ident(newProc)operator(()ident(Ruby) ident(runtime)operator(,) ident(Block) ident(block)operator(,) ident(Block)operator(.)ident(Type) ident(type)operator(\)) operator({) + ident(RubyProc) ident(proc) operator(=) keyword(new) ident(RubyProc)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getProc)operator(()operator(\))operator(,) ident(type)operator(\))operator(;) + ident(proc)operator(.)ident(callInit)operator(()ident(NULL_ARRAY)operator(,) ident(block)operator(\))operator(;) + + keyword(return) ident(proc)operator(;) + operator(}) + + comment(/** + * Create a new instance of a Proc object. We override this method (from RubyClass\) + * since we need to deal with special case of Proc.new with no arguments or block arg. In + * this case, we need to check previous frame for a block to consume. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + comment(// No passed in block, lets check next outer frame for one ('Proc.new'\)) + keyword(if) operator(()operator(!)ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(block) operator(=) ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(getBlock)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\)) operator(&&) ident(block)operator(.)ident(getProcObject)operator(()operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(block)operator(.)ident(getProcObject)operator(()operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(obj) operator(=) operator(()operator(()ident(RubyClass)operator(\)) ident(recv)operator(\))operator(.)ident(allocate)operator(()operator(\))operator(;) + + ident(obj)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(procBlock)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(procBlock)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(tried to create Proc object without a block)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(type) operator(==) ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA) operator(&&) ident(procBlock) operator(==) keyword(null)operator(\)) operator({) + comment(// TODO: warn "tried to create Proc object without a block") + operator(}) + + ident(block) operator(=) ident(procBlock)operator(.)ident(cloneBlock)operator(()operator(\))operator(;) + ident(block)operator(.)ident(type) operator(=) ident(type)operator(;) + ident(block)operator(.)ident(setProcObject)operator(()local_variable(this)operator(\))operator(;) + + ident(file) operator(=) ident(context)operator(.)ident(getFile)operator(()operator(\))operator(;) + ident(line) operator(=) ident(context)operator(.)ident(getLine)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(clone)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rbClone)operator(()operator(\)) operator({) + ident(RubyProc) ident(newProc) operator(=) keyword(new) ident(RubyProc)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getProc)operator(()operator(\))operator(,) ident(type)operator(\))operator(;) + ident(newProc)operator(.)ident(block) operator(=) ident(getBlock)operator(()operator(\))operator(;) + ident(newProc)operator(.)ident(file) operator(=) ident(file)operator(;) + ident(newProc)operator(.)ident(line) operator(=) ident(line)operator(;) + comment(// TODO: CLONE_SETUP here) + keyword(return) ident(newProc)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dup)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(dup)operator(()operator(\)) operator({) + ident(RubyProc) ident(newProc) operator(=) keyword(new) ident(RubyProc)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getProc)operator(()operator(\))operator(,) ident(type)operator(\))operator(;) + ident(newProc)operator(.)ident(block) operator(=) ident(getBlock)operator(()operator(\))operator(;) + ident(newProc)operator(.)ident(file) operator(=) ident(file)operator(;) + ident(newProc)operator(.)ident(line) operator(=) ident(line)operator(;) + keyword(return) ident(newProc)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyProc)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(other) operator(||) local_variable(this)operator(.)ident(block) operator(==) operator(()operator(()ident(RubyProc)operator(\))ident(other)operator(\))operator(.)ident(block)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) + string<delimiter(")content(#<Proc:0x)delimiter(")> operator(+) type(Integer)operator(.)ident(toString)operator(()ident(block)operator(.)ident(hashCode)operator(()operator(\))operator(,) integer(16)operator(\)) operator(+) string<delimiter(")content(@)delimiter(")> operator(+) + ident(file) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) operator(()ident(line) operator(+) integer(1)operator(\)) operator(+) string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(binding)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(binding)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBinding)operator(()ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(call)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(call)operator(()ident(context)operator(,) ident(args)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(IRubyObject) ident(self)operator(\)) operator({) + ident(assert) ident(args) operator(!=) keyword(null)operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(Block) ident(newBlock) operator(=) ident(block)operator(.)ident(cloneBlock)operator(()operator(\))operator(;) + ident(JumpTarget) ident(jumpTarget) operator(=) ident(newBlock)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(getFrame)operator(()operator(\))operator(.)ident(getJumpTarget)operator(()operator(\))operator(;) + + keyword(try) operator({) + keyword(if) operator(()ident(self) operator(!=) keyword(null)operator(\)) ident(newBlock)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setSelf)operator(()ident(self)operator(\))operator(;) + + keyword(return) ident(newBlock)operator(.)ident(call)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(BreakJump) ident(bj)operator(\)) operator({) + keyword(switch)operator(()ident(block)operator(.)ident(type)operator(\)) operator({) + keyword(case) ident(LAMBDA)operator(:) keyword(if) operator(()ident(bj)operator(.)ident(getTarget)operator(()operator(\)) operator(==) ident(jumpTarget)operator(\)) operator({) + keyword(return) operator(()ident(IRubyObject)operator(\)) ident(bj)operator(.)ident(getValue)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(runtime)operator(.)ident(newLocalJumpError)operator(()string<delimiter(")content(break)delimiter(")>operator(,) operator(()ident(IRubyObject)operator(\))ident(bj)operator(.)ident(getValue)operator(()operator(\))operator(,) string<delimiter(")content(unexpected break)delimiter(")>operator(\))operator(;) + operator(}) + keyword(case) ident(PROC)operator(:) + keyword(if) operator(()ident(newBlock)operator(.)ident(isEscaped)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newLocalJumpError)operator(()string<delimiter(")content(break)delimiter(")>operator(,) operator(()ident(IRubyObject)operator(\))ident(bj)operator(.)ident(getValue)operator(()operator(\))operator(,) string<delimiter(")content(break from proc-closure)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(bj)operator(;) + operator(}) + keyword(default)operator(:) keyword(throw) ident(bj)operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(ReturnJump) ident(rj)operator(\)) operator({) + type(Object) ident(target) operator(=) ident(rj)operator(.)ident(getTarget)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(target) operator(==) ident(jumpTarget) operator(&&) ident(block)operator(.)ident(type) operator(==) ident(Block)operator(.)ident(Type)operator(.)ident(LAMBDA)operator(\)) keyword(return) operator(()ident(IRubyObject)operator(\)) ident(rj)operator(.)ident(getValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(type) operator(==) ident(Block)operator(.)ident(Type)operator(.)ident(THREAD)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(return can't jump across threads)delimiter(")>operator(\))operator(;) + operator(}) + keyword(throw) ident(rj)operator(;) + operator(}) keyword(catch) operator(()ident(JumpException)operator(.)ident(RetryJump) ident(rj)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newLocalJumpError)operator(()string<delimiter(")content(retry)delimiter(")>operator(,) operator(()ident(IRubyObject)operator(\))ident(rj)operator(.)ident(getValue)operator(()operator(\))operator(,) string<delimiter(")content(retry not supported outside rescue)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(arity)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(arity)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(block)operator(.)ident(arity)operator(()operator(\))operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_proc)delimiter(")>operator(\)) + directive(public) ident(RubyProc) ident(to_proc)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(as)operator(()type(Class) ident(asClass)operator(\)) operator({) + directive(final) ident(Ruby) ident(ruby) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(asClass)operator(.)ident(isInterface)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(ruby)operator(.)ident(newTypeError)operator(()ident(asClass)operator(.)ident(getCanonicalName)operator(()operator(\)) operator(+) string<delimiter(")content( is not an interface)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(MiniJava)operator(.)ident(javaToRuby)operator(()ident(ruby)operator(,) type(Proxy)operator(.)ident(newProxyInstance)operator(()ident(Ruby)operator(.)ident(getClassLoader)operator(()operator(\))operator(,) keyword(new) type(Class)type([]) operator({)ident(asClass)operator(})operator(,) keyword(new) type(InvocationHandler)operator(()operator(\)) operator({) + directive(public) type(Object) ident(invoke)operator(()type(Object) ident(proxy)operator(,) type(Method) ident(method)operator(,) type(Object)type([]) ident(args)operator(\)) directive(throws) type(Throwable) operator({) + ident(IRubyObject)type([]) ident(rubyArgs) operator(=) keyword(new) ident(IRubyObject)operator([)ident(args)operator(.)ident(length) operator(+) integer(1)operator(])operator(;) + ident(rubyArgs)operator([)integer(0)operator(]) operator(=) ident(RubySymbol)operator(.)ident(newSymbol)operator(()ident(ruby)operator(,) ident(method)operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(rubyArgs)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(rubyArgs)operator([)ident(i)operator(]) operator(=) ident(MiniJava)operator(.)ident(javaToRuby)operator(()ident(ruby)operator(,) ident(args)operator([)ident(i) operator(-) integer(1)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(MiniJava)operator(.)ident(rubyToJava)operator(()ident(call)operator(()ident(ruby)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(rubyArgs)operator(\))operator(\))operator(;) + operator(}) + operator(})operator(\))operator(\))operator(;) + operator(}) +operator(}) +comment(/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.ext.posix.POSIX)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.BlockCallback)operator(;) +keyword(import) include(org.jruby.runtime.CallBlock)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + + +comment(/** + */) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Process)delimiter(")>operator(\)) +directive(public) type(class) class(RubyProcess) operator({) + + directive(public) directive(static) ident(RubyModule) ident(createProcessModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(process) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Process)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setProcess)operator(()ident(process)operator(\))operator(;) + + comment(// TODO: NOT_ALLOCATABLE_ALLOCATOR is probably ok here. Confirm. JRUBY-415) + ident(RubyClass) ident(process_status) operator(=) ident(process)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Status)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setProcStatus)operator(()ident(process_status)operator(\))operator(;) + + ident(RubyModule) ident(process_uid) operator(=) ident(process)operator(.)ident(defineModuleUnder)operator(()string<delimiter(")content(UID)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setProcUID)operator(()ident(process_uid)operator(\))operator(;) + + ident(RubyModule) ident(process_gid) operator(=) ident(process)operator(.)ident(defineModuleUnder)operator(()string<delimiter(")content(GID)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setProcGID)operator(()ident(process_gid)operator(\))operator(;) + + ident(RubyModule) ident(process_sys) operator(=) ident(process)operator(.)ident(defineModuleUnder)operator(()string<delimiter(")content(Sys)delimiter(")>operator(\))operator(;) + ident(runtime)operator(.)ident(setProcSys)operator(()ident(process_sys)operator(\))operator(;) + + ident(process)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyProcess)operator(.)ident(class)operator(\))operator(;) + ident(process_status)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyStatus)operator(.)ident(class)operator(\))operator(;) + ident(process_uid)operator(.)ident(defineAnnotatedMethods)operator(()ident(UserID)operator(.)ident(class)operator(\))operator(;) + ident(process_gid)operator(.)ident(defineAnnotatedMethods)operator(()ident(GroupID)operator(.)ident(class)operator(\))operator(;) + ident(process_sys)operator(.)ident(defineAnnotatedMethods)operator(()ident(Sys)operator(.)ident(class)operator(\))operator(;) + + ident(process)operator(.)ident(defineConstant)operator(()string<delimiter(")content(PRIO_PROCESS)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(\))operator(;) + ident(process)operator(.)ident(defineConstant)operator(()string<delimiter(")content(PRIO_PGRP)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(\))operator(;) + ident(process)operator(.)ident(defineConstant)operator(()string<delimiter(")content(PRIO_USER)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()integer(2)operator(\))operator(\))operator(;) + + ident(process)operator(.)ident(defineConstant)operator(()string<delimiter(")content(WNOHANG)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(\))operator(;) + + keyword(return) ident(process)operator(;) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Process::Status)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(RubyStatus) directive(extends) ident(RubyObject) operator({) + directive(private) type(long) ident(status) operator(=) integer(0L)operator(;) + + directive(private) directive(static) directive(final) type(long) ident(EXIT_SUCCESS) operator(=) integer(0L)operator(;) + directive(public) ident(RubyStatus)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(metaClass)operator(,) type(long) ident(status)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(metaClass)operator(\))operator(;) + local_variable(this)operator(.)ident(status) operator(=) ident(status)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyStatus) ident(newProcessStatus)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(status)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyStatus)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getProcStatus)operator(()operator(\))operator(,) ident(status)operator(\))operator(;) + operator(}) + + comment(// Bunch of methods still not implemented) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_int)delimiter(")>operator(,) string<delimiter(")content(pid)delimiter(")>operator(,) string<delimiter(")content(stopped?)delimiter(")>operator(,) string<delimiter(")content(stopsig)delimiter(")>operator(,) string<delimiter(")content(signaled?)delimiter(")>operator(,) string<delimiter(")content(termsig?)delimiter(")>operator(,) string<delimiter(")content(exited?)delimiter(")>operator(,) string<delimiter(")content(coredump?)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(not_implemented)operator(()operator(\)) operator({) + type(String) ident(error) operator(=) string<delimiter(")content(Process::Status#)delimiter(")> operator(+) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getFrameName)operator(()operator(\)) operator(+) string<delimiter(")content( not implemented)delimiter(")>operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()ident(error)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(&)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(not_implemented1)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + type(String) ident(error) operator(=) string<delimiter(")content(Process::Status#)delimiter(")> operator(+) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getFrameName)operator(()operator(\)) operator(+) string<delimiter(")content( not implemented)delimiter(")>operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()ident(error)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(exitstatus)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(status)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>>)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_rshift)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + type(long) ident(shiftValue) operator(=) ident(other)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(status) operator(>)operator(>) ident(shiftValue)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(EQUALEQUAL)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) local_variable(this)operator(.)ident(to_i)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(to_i)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(shiftedValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()type(String)operator(.)ident(valueOf)operator(()ident(shiftedValue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(#<Process::Status: pid=????,exited()delimiter(")> operator(+) type(String)operator(.)ident(valueOf)operator(()ident(status)operator(\)) operator(+) string<delimiter(")content(\)>)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(success?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(success_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(status) operator(==) ident(EXIT_SUCCESS)operator(\))operator(;) + operator(}) + + directive(private) type(long) ident(shiftedValue)operator(()operator(\)) operator({) + keyword(return) ident(status) operator(<)operator(<) integer(8)operator(;) + operator(}) + operator(}) + + annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Process::UID)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(UserID) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(change_privilege)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(change_privilege)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process::UID::change_privilege not implemented yet)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(eid)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(euid)operator(()ident(self)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eid=)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(eid)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(euid_set)operator(()ident(self)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(grant_privilege)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(grant_privilege)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process::UID::grant_privilege not implemented yet)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(re_exchange)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(re_exchange)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(switch_rb)operator(()ident(context)operator(,) ident(self)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(re_exchangeable?)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(re_exchangeable_p)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process::UID::re_exchangeable? not implemented yet)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(rid)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(uid)operator(()ident(self)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sid_available?)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sid_available_p)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process::UID::sid_available not implemented yet)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(switch)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(switch_rb)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(uid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getuid)operator(()operator(\))operator(;) + type(int) ident(euid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(geteuid)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(seteuid)operator(()ident(uid)operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setuid)operator(()ident(euid)operator(\))operator(;) + + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(seteuid)operator(()ident(euid)operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setuid)operator(()ident(uid)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(seteuid)operator(()ident(uid)operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setuid)operator(()ident(euid)operator(\))operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Process::GID)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(GroupID) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(change_privilege)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(change_privilege)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process::GID::change_privilege not implemented yet)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(eid)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(egid)operator(()ident(self)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eid=)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(eid)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(RubyProcess)operator(.)ident(egid_set)operator(()ident(self)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(grant_privilege)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(grant_privilege)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process::GID::grant_privilege not implemented yet)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(re_exchange)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(re_exchange)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(switch_rb)operator(()ident(context)operator(,) ident(self)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(re_exchangeable?)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(re_exchangeable_p)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process::GID::re_exchangeable? not implemented yet)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(rid)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(gid)operator(()ident(self)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sid_available?)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(sid_available_p)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process::GID::sid_available not implemented yet)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(switch)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(switch_rb)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(gid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getgid)operator(()operator(\))operator(;) + type(int) ident(egid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getegid)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setegid)operator(()ident(gid)operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setgid)operator(()ident(egid)operator(\))operator(;) + + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setegid)operator(()ident(egid)operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setgid)operator(()ident(gid)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setegid)operator(()ident(gid)operator(\))operator(;) + ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setgid)operator(()ident(egid)operator(\))operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Process::Sys)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Sys) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getegid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getegid)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(egid)operator(()ident(self)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(geteuid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(geteuid)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(euid)operator(()ident(self)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getgid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getgid)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(gid)operator(()ident(self)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getuid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getuid)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(uid)operator(()ident(self)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setegid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setegid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(egid_set)operator(()ident(recv)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(seteuid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(seteuid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(euid_set)operator(()ident(recv)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setgid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setgid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(gid_set)operator(()ident(recv)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setuid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setuid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(uid_set)operator(()ident(recv)operator(,) ident(arg)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abort)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(abort)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(RubyKernel)operator(.)ident(abort)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exit!)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exit_bang)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(RubyKernel)operator(.)ident(exit_bang)operator(()ident(recv)operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(groups)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(groups)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process#groups not yet implemented)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setrlimit)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setrlimit)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process#setrlimit not yet implemented)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getpgrp)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getpgrp)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getpgrp)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(groups=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(groups_set)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process#groups not yet implemented)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(waitpid)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(waitpid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(pid) operator(=) operator(-)integer(1)operator(;) + type(int) ident(flags) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(pid) operator(=) operator(()type(int)operator(\))ident(args)operator([)integer(0)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(flags) operator(=) operator(()type(int)operator(\))ident(args)operator([)integer(1)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + + type(int)type([]) ident(status) operator(=) keyword(new) type(int)operator([)integer(1)operator(])operator(;) + ident(pid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(waitpid)operator(()ident(pid)operator(,) ident(status)operator(,) ident(flags)operator(\))operator(;) + + keyword(if) operator(()ident(pid) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoECHILDError)operator(()operator(\))operator(;) + operator(}) + + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(() + string<delimiter(")content($?)delimiter(")>operator(,) + ident(RubyProcess)operator(.)ident(RubyStatus)operator(.)ident(newProcessStatus)operator(()ident(runtime)operator(,) ident(status)operator([)integer(0)operator(])operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(pid)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(wait)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(wait)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + keyword(return) ident(waitpid)operator(()ident(recv)operator(,) ident(args)operator(\))operator(;) + operator(}) + + type(int)type([]) ident(status) operator(=) keyword(new) type(int)operator([)integer(1)operator(])operator(;) + type(int) ident(pid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(wait)operator(()ident(status)operator(\))operator(;) + + keyword(if) operator(()ident(pid) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoECHILDError)operator(()operator(\))operator(;) + operator(}) + + ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(set)operator(() + string<delimiter(")content($?)delimiter(")>operator(,) + ident(RubyProcess)operator(.)ident(RubyStatus)operator(.)ident(newProcessStatus)operator(()ident(runtime)operator(,) ident(status)operator([)integer(0)operator(])operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(pid)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(waitall)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(waitall)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(POSIX) ident(posix) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(;) + ident(RubyArray) ident(results) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()operator(\))operator(;) + + type(int)type([]) ident(status) operator(=) keyword(new) type(int)operator([)integer(1)operator(])operator(;) + type(int) ident(result) operator(=) ident(posix)operator(.)ident(wait)operator(()ident(status)operator(\))operator(;) + keyword(while) operator(()ident(result) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(results)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(newFixnum)operator(()ident(result)operator(\))operator(,) ident(RubyProcess)operator(.)ident(RubyStatus)operator(.)ident(newProcessStatus)operator(()ident(runtime)operator(,) ident(status)operator([)integer(0)operator(])operator(\))operator(\))operator(\))operator(;) + ident(result) operator(=) ident(posix)operator(.)ident(wait)operator(()ident(status)operator(\))operator(;) + operator(}) + + keyword(return) ident(results)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setsid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setsid)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setsid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setpgrp)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setpgrp)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setpgid)operator(()integer(0)operator(,) integer(0)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(egid=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(egid_set)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setegid)operator(()operator(()type(int)operator(\))ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(euid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(euid)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(geteuid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(uid=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(uid_set)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setuid)operator(()operator(()type(int)operator(\))ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(gid)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getgid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(maxgroups)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(maxgroups)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process#maxgroups not yet implemented)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getpriority)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getpriority)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + type(int) ident(which) operator(=) operator(()type(int)operator(\))ident(arg1)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(int) ident(who) operator(=) operator(()type(int)operator(\))ident(arg2)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(int) ident(result) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getpriority)operator(()ident(which)operator(,) ident(who)operator(\))operator(;) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(uid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(uid)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getuid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(waitpid2)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(waitpid2)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(pid) operator(=) operator(-)integer(1)operator(;) + type(int) ident(flags) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(pid) operator(=) operator(()type(int)operator(\))ident(args)operator([)integer(0)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(flags) operator(=) operator(()type(int)operator(\))ident(args)operator([)integer(1)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) + + type(int)type([]) ident(status) operator(=) keyword(new) type(int)operator([)integer(1)operator(])operator(;) + ident(pid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(waitpid)operator(()ident(pid)operator(,) ident(status)operator(,) ident(flags)operator(\))operator(;) + + keyword(if) operator(()ident(pid) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newErrnoECHILDError)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(newFixnum)operator(()ident(pid)operator(\))operator(,) ident(RubyProcess)operator(.)ident(RubyStatus)operator(.)ident(newProcessStatus)operator(()ident(runtime)operator(,) ident(status)operator([)integer(0)operator(])operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initgroups)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(initgroups)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process#initgroups not yet implemented)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(maxgroups=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(maxgroups_set)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process#maxgroups_set not yet implemented)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ppid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(ppid)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getppid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gid=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(gid_set)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setgid)operator(()operator(()type(int)operator(\))ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(wait2)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(wait2)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(waitpid2)operator(()ident(recv)operator(,) ident(args)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(euid=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(euid_set)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(seteuid)operator(()operator(()type(int)operator(\))ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setpriority)delimiter(")>operator(,) ident(required) operator(=) integer(3)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setpriority)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(IRubyObject) ident(arg3)operator(\)) operator({) + type(int) ident(which) operator(=) operator(()type(int)operator(\))ident(arg1)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(int) ident(who) operator(=) operator(()type(int)operator(\))ident(arg2)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(int) ident(prio) operator(=) operator(()type(int)operator(\))ident(arg3)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(int) ident(result) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setpriority)operator(()ident(which)operator(,) ident(who)operator(,) ident(prio)operator(\))operator(;) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(setpgid)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(setpgid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + type(int) ident(pid) operator(=) operator(()type(int)operator(\))ident(arg1)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(int) ident(gid) operator(=) operator(()type(int)operator(\))ident(arg2)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(setpgid)operator(()ident(pid)operator(,) ident(gid)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getpgid)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getpgid)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getpgid)operator(()operator(()type(int)operator(\))ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getrlimit)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(getrlimit)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Process#getrlimit not yet implemented)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(egid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(egid)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getegid)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(String)type([]) ident(signals) operator(=) keyword(new) type(String)type([]) operator({)string<delimiter(")content(EXIT)delimiter(")>operator(,) string<delimiter(")content(HUP)delimiter(")>operator(,) string<delimiter(")content(INT)delimiter(")>operator(,) string<delimiter(")content(QUIT)delimiter(")>operator(,) string<delimiter(")content(ILL)delimiter(")>operator(,) string<delimiter(")content(TRAP)delimiter(")>operator(,) + string<delimiter(")content(ABRT)delimiter(")>operator(,) string<delimiter(")content(POLL)delimiter(")>operator(,) string<delimiter(")content(FPE)delimiter(")>operator(,) string<delimiter(")content(KILL)delimiter(")>operator(,) string<delimiter(")content(BUS)delimiter(")>operator(,) string<delimiter(")content(SEGV)delimiter(")>operator(,) string<delimiter(")content(SYS)delimiter(")>operator(,) string<delimiter(")content(PIPE)delimiter(")>operator(,) string<delimiter(")content(ALRM)delimiter(")>operator(,) string<delimiter(")content(TERM)delimiter(")>operator(,) string<delimiter(")content(URG)delimiter(")>operator(,) string<delimiter(")content(STOP)delimiter(")>operator(,) + string<delimiter(")content(TSTP)delimiter(")>operator(,) string<delimiter(")content(CONT)delimiter(")>operator(,) string<delimiter(")content(CHLD)delimiter(")>operator(,) string<delimiter(")content(TTIN)delimiter(")>operator(,) string<delimiter(")content(TTOU)delimiter(")>operator(,) string<delimiter(")content(XCPU)delimiter(")>operator(,) string<delimiter(")content(XFSZ)delimiter(")>operator(,) string<delimiter(")content(VTALRM)delimiter(")>operator(,) string<delimiter(")content(PROF)delimiter(")>operator(,) string<delimiter(")content(USR1)delimiter(")>operator(,) string<delimiter(")content(USR2)delimiter(")>operator(})operator(;) + + directive(private) directive(static) type(int) ident(parseSignalString)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(value)operator(\)) operator({) + type(int) ident(startIndex) operator(=) integer(0)operator(;) + type(boolean) ident(negative) operator(=) ident(value)operator(.)ident(startsWith)operator(()string<delimiter(")content(-)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(negative)operator(\)) ident(startIndex)operator(++)operator(;) + + type(boolean) ident(signalString) operator(=) ident(value)operator(.)ident(startsWith)operator(()string<delimiter(")content(SIG)delimiter(")>operator(,) ident(startIndex)operator(\))operator(;) + + keyword(if) operator(()ident(signalString)operator(\)) ident(startIndex) operator(+=) integer(3)operator(;) + + type(String) ident(signalName) operator(=) ident(value)operator(.)ident(substring)operator(()ident(startIndex)operator(\))operator(;) + + comment(// FIXME: This table will get moved into POSIX library so we can get all actual supported) + comment(// signals. This is a quick fix to support basic signals until that happens.) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(signals)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(signals)operator([)ident(i)operator(])operator(.)ident(equals)operator(()ident(signalName)operator(\))operator(\)) keyword(return) ident(negative) operator(?) operator(-)ident(i) operator(:) ident(i)operator(;) + operator(}) + + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(unsupported name `SIG)delimiter(")> operator(+) ident(signalName) operator(+) string<delimiter(")content(')delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(kill)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(kill)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(<) integer(2)operator(\)) operator({) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments -- kill(sig, pid...\))delimiter(")>operator(\))operator(;) + operator(}) + + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(signal)operator(;) + keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(signal) operator(=) operator(()type(int)operator(\)) operator(()operator(()ident(RubyFixnum)operator(\)) ident(args)operator([)integer(0)operator(])operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubySymbol)operator(\)) operator({) + ident(signal) operator(=) ident(parseSignalString)operator(()ident(runtime)operator(,) ident(args)operator([)integer(0)operator(])operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(signal) operator(=) ident(parseSignalString)operator(()ident(runtime)operator(,) ident(args)operator([)integer(0)operator(])operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(signal) operator(=) ident(parseSignalString)operator(()ident(runtime)operator(,) ident(args)operator([)integer(0)operator(])operator(.)ident(checkStringType)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + type(boolean) ident(processGroupKill) operator(=) ident(signal) operator(<) integer(0)operator(;) + + keyword(if) operator(()ident(processGroupKill)operator(\)) ident(signal) operator(=) operator(-)ident(signal)operator(;) + + ident(POSIX) ident(posix) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + type(int) ident(pid) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(;) + + comment(// FIXME: It may be possible to killpg on systems which support it. POSIX library) + comment(// needs to tell whether a particular method works or not) + keyword(if) operator(()ident(pid) operator(==) integer(0)operator(\)) ident(pid) operator(=) ident(runtime)operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getpid)operator(()operator(\))operator(;) + ident(posix)operator(.)ident(kill)operator(()ident(processGroupKill) operator(?) operator(-)ident(pid) operator(:) ident(pid)operator(,) ident(signal)operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(args)operator(.)ident(length) operator(-) integer(1)operator(\))operator(;) + + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(detach)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(detach)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + directive(final) type(int) ident(pid) operator(=) operator(()type(int)operator(\))ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(BlockCallback) ident(callback) operator(=) keyword(new) ident(BlockCallback)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(int)type([]) ident(status) operator(=) keyword(new) type(int)operator([)integer(1)operator(])operator(;) + type(int) ident(result) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(waitpid)operator(()ident(pid)operator(,) ident(status)operator(,) integer(0)operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(result)operator(\))operator(;) + operator(}) + operator(})operator(;) + + keyword(return) ident(RubyThread)operator(.)ident(newInstance)operator(() + ident(runtime)operator(.)ident(getThread)operator(()operator(\))operator(,) + ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(,) + ident(CallBlock)operator(.)ident(newCallClosure)operator(()ident(recv)operator(,) operator(()ident(RubyModule)operator(\))ident(recv)operator(,) ident(Arity)operator(.)ident(NO_ARGUMENTS)operator(,) ident(callback)operator(,) ident(context)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(times)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(times)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(double) ident(currentTime) operator(=) type(System)operator(.)ident(currentTimeMillis)operator(()operator(\)) operator(/) float(1000.0)operator(;) + type(double) ident(startTime) operator(=) ident(runtime)operator(.)ident(getStartTime)operator(()operator(\)) operator(/) float(1000.0)operator(;) + ident(RubyFloat) ident(zero) operator(=) ident(runtime)operator(.)ident(newFloat)operator(()float(0.0)operator(\))operator(;) + keyword(return) ident(RubyStruct)operator(.)ident(newStruct)operator(()ident(runtime)operator(.)ident(getTmsStruct)operator(()operator(\))operator(,) + keyword(new) ident(IRubyObject)type([]) operator({) ident(runtime)operator(.)ident(newFloat)operator(()ident(currentTime) operator(-) ident(startTime)operator(\))operator(,) ident(zero)operator(,) ident(zero)operator(,) ident(zero) operator(})operator(,) + ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pid)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(pid)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getPosix)operator(()operator(\))operator(.)ident(getpid)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fork)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(fork)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(RubyKernel)operator(.)ident(fork)operator(()ident(context)operator(,) ident(recv)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exit)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exit)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(RubyKernel)operator(.)ident(exit)operator(()ident(recv)operator(,) ident(args)operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001 Ed Sinjiashvili <slorcim@users.sourceforge.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.util.List)operator(;) + +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.BlockCallback)operator(;) +keyword(import) include(org.jruby.runtime.CallBlock)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ObjectMarshal)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.builtin.Variable)operator(;) +keyword(import) include(org.jruby.runtime.component.VariableEntry)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) + +comment(/** + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Range)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Enumerable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyRange) directive(extends) ident(RubyObject) operator({) + directive(private) ident(IRubyObject) ident(begin)operator(;) + directive(private) ident(IRubyObject) ident(end)operator(;) + directive(private) type(boolean) ident(isExclusive)operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createRangeClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(result) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Range)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(RANGE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setRange)operator(()ident(result)operator(\))operator(;) + ident(result)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyRange)operator(;) + operator(}) + operator(})operator(;) + + ident(result)operator(.)ident(setMarshal)operator(()ident(RANGE_MARSHAL)operator(\))operator(;) + ident(result)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + + comment(// We override Enumerable#member? since ranges in 1.8.1 are continuous.) + comment(// result.defineMethod("member?", callbackFactory.getMethod("include_p", RubyKernel.IRUBY_OBJECT\)\);) + comment(// result.defineMethod("===", callbackFactory.getMethod("include_p", RubyKernel.IRUBY_OBJECT\)\);) + + ident(result)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyRange)operator(.)ident(class)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) directive(static) directive(final) ident(ObjectAllocator) ident(RANGE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyRange)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(private) ident(RubyRange)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + ident(begin) operator(=) ident(end) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyRange) ident(newRange)operator(()ident(Ruby) ident(runtime)operator(,) ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(begin)operator(,) ident(IRubyObject) ident(end)operator(,) type(boolean) ident(isExclusive)operator(\)) operator({) + ident(RubyRange) ident(range) operator(=) keyword(new) ident(RubyRange)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRange)operator(()operator(\))operator(\))operator(;) + ident(range)operator(.)ident(init)operator(()ident(context)operator(,) ident(begin)operator(,) ident(end)operator(,) ident(isExclusive)operator(\))operator(;) + keyword(return) ident(range)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyRange) ident(newExclusiveRange)operator(()ident(Ruby) ident(runtime)operator(,) ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(begin)operator(,) ident(IRubyObject) ident(end)operator(\)) operator({) + ident(RubyRange) ident(range) operator(=) keyword(new) ident(RubyRange)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRange)operator(()operator(\))operator(\))operator(;) + ident(range)operator(.)ident(init)operator(()ident(context)operator(,) ident(begin)operator(,) ident(end)operator(,) keyword(true)operator(\))operator(;) + keyword(return) ident(range)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyRange) ident(newInclusiveRange)operator(()ident(Ruby) ident(runtime)operator(,) ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(begin)operator(,) ident(IRubyObject) ident(end)operator(\)) operator({) + ident(RubyRange) ident(range) operator(=) keyword(new) ident(RubyRange)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRange)operator(()operator(\))operator(\))operator(;) + ident(range)operator(.)ident(init)operator(()ident(context)operator(,) ident(begin)operator(,) ident(end)operator(,) keyword(false)operator(\))operator(;) + keyword(return) ident(range)operator(;) + operator(}) + + directive(protected) type(void) ident(copySpecialInstanceVariables)operator(()ident(IRubyObject) ident(clone)operator(\)) operator({) + ident(RubyRange) ident(range) operator(=) operator(()ident(RubyRange)operator(\))ident(clone)operator(;) + ident(range)operator(.)ident(begin) operator(=) ident(begin)operator(;) + ident(range)operator(.)ident(end) operator(=) ident(end)operator(;) + ident(range)operator(.)ident(isExclusive) operator(=) ident(isExclusive)operator(;) + operator(}) + + directive(final) type(long)type([]) ident(begLen)operator(()type(long) ident(len)operator(,) type(int) ident(err)operator(\))operator({) + type(long) ident(beg) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()local_variable(this)operator(.)ident(begin)operator(\))operator(;) + type(long) ident(end) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()local_variable(this)operator(.)ident(end)operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(+=) ident(len)operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(err) operator(!=) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()ident(beg) operator(+) string<delimiter(")content(..)delimiter(")> operator(+) operator(()ident(isExclusive) operator(?) string<delimiter(")content(.)delimiter(")> operator(:) string<delimiter(")delimiter(")>operator(\)) operator(+) ident(end) operator(+) string<delimiter(")content( out of range)delimiter(")>operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(err) operator(==) integer(0) operator(||) ident(err) operator(==) integer(2)operator(\)) operator({) + keyword(if) operator(()ident(beg) operator(>) ident(len)operator(\)) operator({) + keyword(if) operator(()ident(err) operator(!=) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()ident(beg) operator(+) string<delimiter(")content(..)delimiter(")> operator(+) operator(()ident(isExclusive) operator(?) string<delimiter(")content(.)delimiter(")> operator(:) string<delimiter(")delimiter(")>operator(\)) operator(+) ident(end) operator(+) string<delimiter(")content( out of range)delimiter(")>operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) + keyword(if) operator(()ident(end) operator(>) ident(len)operator(\)) ident(end) operator(=) ident(len)operator(;) + operator(}) + + keyword(if) operator(()ident(end) operator(<) integer(0)operator(\)) ident(end) operator(+=) ident(len)operator(;) + keyword(if) operator(()operator(!)ident(isExclusive)operator(\)) ident(end)operator(++)operator(;) + ident(len) operator(=) ident(end) operator(-) ident(beg)operator(;) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) ident(len) operator(=) integer(0)operator(;) + + keyword(return) keyword(new) type(long)type([])operator({)ident(beg)operator(,) ident(len)operator(})operator(;) + operator(}) + + directive(private) type(void) ident(init)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(begin)operator(,) ident(IRubyObject) ident(end)operator(,) type(boolean) ident(isExclusive)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(begin) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(end) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(IRubyObject) ident(result) operator(=) ident(begin)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(end)operator(\))operator(;) + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(bad value for range)delimiter(")>operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(RaiseException) ident(re)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(bad value for range)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + local_variable(this)operator(.)ident(begin) operator(=) ident(begin)operator(;) + local_variable(this)operator(.)ident(end) operator(=) ident(end)operator(;) + local_variable(this)operator(.)ident(isExclusive) operator(=) ident(isExclusive)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(init)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(args)operator(.)ident(length) operator(>) integer(2) operator(&&) ident(args)operator([)integer(2)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(first)delimiter(")>operator(,) string<delimiter(")content(begin)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(first)operator(()operator(\)) operator({) + keyword(return) ident(begin)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(last)delimiter(")>operator(,) string<delimiter(")content(end)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(last)operator(()operator(\)) operator({) + keyword(return) ident(end)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(hash)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + type(long) ident(hash) operator(=) ident(isExclusive) operator(?) integer(1) operator(:) integer(0)operator(;) + type(long) ident(h) operator(=) ident(hash)operator(;) + + type(long) ident(v) operator(=) ident(begin)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(HASH)operator(,) string<delimiter(")content(hash)delimiter(")>operator(\))operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + ident(hash) operator(^=) ident(v) operator(<)operator(<) integer(1)operator(;) + ident(v) operator(=) ident(end)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(HASH)operator(,) string<delimiter(")content(hash)delimiter(")>operator(\))operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + ident(hash) operator(^=) ident(v) operator(<)operator(<) integer(9)operator(;) + ident(hash) operator(^=) ident(h) operator(<)operator(<) integer(24)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(hash)operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(byte)type([]) ident(DOTDOTDOT) operator(=) string<delimiter(")content(...)delimiter(")>operator(.)ident(getBytes)operator(()operator(\))operator(;) + directive(private) directive(static) type(byte)type([]) ident(DOTDOT) operator(=) string<delimiter(")content(..)delimiter(")>operator(.)ident(getBytes)operator(()operator(\))operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(inspect)operator(()ident(context)operator(,) ident(begin)operator(\))operator(.)ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(RubyString) ident(str2) operator(=) ident(inspect)operator(()ident(context)operator(,) ident(end)operator(\))operator(;) + + ident(str)operator(.)ident(cat)operator(()ident(isExclusive) operator(?) ident(DOTDOTDOT) operator(:) ident(DOTDOT)operator(\))operator(;) + ident(str)operator(.)ident(concat)operator(()ident(str2)operator(\))operator(;) + ident(str)operator(.)ident(infectBy)operator(()ident(str2)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(RubyString)operator(.)ident(objAsString)operator(()ident(context)operator(,) ident(begin)operator(\))operator(.)ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(RubyString) ident(str2) operator(=) ident(RubyString)operator(.)ident(objAsString)operator(()ident(context)operator(,) ident(end)operator(\))operator(;) + + ident(str)operator(.)ident(cat)operator(()ident(isExclusive) operator(?) ident(DOTDOTDOT) operator(:) ident(DOTDOT)operator(\))operator(;) + ident(str)operator(.)ident(concat)operator(()ident(str2)operator(\))operator(;) + ident(str)operator(.)ident(infectBy)operator(()ident(str2)operator(\))operator(;) + keyword(return) ident(str)operator(;) + + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exclude_end?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(exclude_end_p)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isExclusive)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyRange)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + ident(RubyRange) ident(otherRange) operator(=) operator(()ident(RubyRange)operator(\)) ident(other)operator(;) + + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(begin)operator(,) ident(otherRange)operator(.)ident(begin)operator(\)) operator(&&) + ident(equalInternal)operator(()ident(context)operator(,) ident(end)operator(,) ident(otherRange)operator(.)ident(end)operator(\)) operator(&&) + ident(isExclusive) operator(==) ident(otherRange)operator(.)ident(isExclusive)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(eql_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyRange)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + ident(RubyRange) ident(otherRange) operator(=) operator(()ident(RubyRange)operator(\))ident(other)operator(;) + + keyword(if) operator(()ident(eqlInternal)operator(()ident(context)operator(,) ident(begin)operator(,) ident(otherRange)operator(.)ident(begin)operator(\)) operator(&&) + ident(eqlInternal)operator(()ident(context)operator(,) ident(end)operator(,) ident(otherRange)operator(.)ident(end)operator(\)) operator(&&) + ident(isExclusive) operator(==) ident(otherRange)operator(.)ident(isExclusive)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(abstract) type(class) class(RangeCallBack) operator({) + directive(abstract) type(void) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(class) class(StepBlockCallBack) directive(extends) ident(RangeCallBack) directive(implements) ident(BlockCallback) operator({) + directive(final) ident(Block) ident(block)operator(;) + ident(IRubyObject) ident(iter)operator(;) + directive(final) ident(IRubyObject) ident(step)operator(;) + + ident(StepBlockCallBack)operator(()ident(Block) ident(block)operator(,) ident(IRubyObject) ident(iter)operator(,) ident(IRubyObject) ident(step)operator(\)) operator({) + local_variable(this)operator(.)ident(block) operator(=) ident(block)operator(;) + local_variable(this)operator(.)ident(iter) operator(=) ident(iter)operator(;) + local_variable(this)operator(.)ident(step) operator(=) ident(step)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(originalBlock)operator(\)) operator({) + ident(call)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + type(void) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()ident(iter) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(iter) operator(=) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(()operator(()ident(RubyFixnum)operator(\))ident(iter)operator(\))operator(.)ident(getLongValue)operator(()operator(\)) operator(-) integer(1)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(iter) operator(=) ident(iter)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_MINUS)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(iter) operator(==) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(arg)operator(\))operator(;) + ident(iter) operator(=) ident(step)operator(;) + operator(}) + operator(}) + operator(}) + + directive(private) ident(IRubyObject) ident(rangeLt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(a)operator(,) ident(IRubyObject) ident(b)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(a)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(b)operator(\))operator(;) + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) keyword(null)operator(;) + keyword(return) ident(RubyComparable)operator(.)ident(cmpint)operator(()ident(context)operator(,) ident(result)operator(,) ident(a)operator(,) ident(b)operator(\)) operator(<) integer(0) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) keyword(null)operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(rangeLe)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(a)operator(,) ident(IRubyObject) ident(b)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(a)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(b)operator(\))operator(;) + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) keyword(null)operator(;) + type(int) ident(c) operator(=) ident(RubyComparable)operator(.)ident(cmpint)operator(()ident(context)operator(,) ident(result)operator(,) ident(a)operator(,) ident(b)operator(\))operator(;) + keyword(if) operator(()ident(c) operator(==) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(c) operator(<) integer(0) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) keyword(null)operator(;) + operator(}) + + directive(private) type(void) ident(rangeEach)operator(()ident(ThreadContext) ident(context)operator(,) ident(RangeCallBack) ident(callback)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(begin)operator(;) + keyword(if) operator(()ident(isExclusive)operator(\)) operator({) + keyword(while) operator(()ident(rangeLt)operator(()ident(context)operator(,) ident(v)operator(,) ident(end)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(callback)operator(.)ident(call)operator(()ident(context)operator(,) ident(v)operator(\))operator(;) + ident(v) operator(=) ident(v)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(succ)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(c)operator(;) + keyword(while) operator(()operator(()ident(c) operator(=) ident(rangeLe)operator(()ident(context)operator(,) ident(v)operator(,) ident(end)operator(\))operator(\)) operator(!=) keyword(null) operator(&&) ident(c)operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(callback)operator(.)ident(call)operator(()ident(context)operator(,) ident(v)operator(\))operator(;) + keyword(if) operator(()ident(c) operator(==) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\)) keyword(break)operator(;) + ident(v) operator(=) ident(v)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(succ)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each)operator(()ident(ThreadContext) ident(context)operator(,) directive(final) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(begin) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(end) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(lim) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(end)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isExclusive)operator(\)) ident(lim)operator(++)operator(;) + + keyword(for) operator(()type(long) ident(i) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(begin)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) ident(i) operator(<) ident(lim)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(begin) keyword(instanceof) ident(RubyString)operator(\)) operator({) + operator(()operator(()ident(RubyString)operator(\)) ident(begin)operator(\))operator(.)ident(upto)operator(()ident(context)operator(,) ident(end)operator(,) ident(isExclusive)operator(,) ident(block)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()operator(!)ident(begin)operator(.)ident(respondsTo)operator(()string<delimiter(")content(succ)delimiter(")>operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(() + string<delimiter(")content(can't iterate from )delimiter(")> operator(+) ident(begin)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + ident(rangeEach)operator(()ident(context)operator(,) keyword(new) ident(RangeCallBack)operator(()operator(\)) operator({) + annotation(@Override) + type(void) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(arg)operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(step)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(step)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(IRubyObject) ident(step)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(step) operator(=) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(step) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + operator(}) + + type(long) ident(unit) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(step)operator(\))operator(;) + keyword(if) operator(()ident(unit) operator(<) integer(0)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(step can't be negative)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(begin) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(end) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + keyword(if) operator(()ident(unit) operator(==) integer(0)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(step can't be 0)delimiter(")>operator(\))operator(;) + + type(long) ident(e) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(end)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isExclusive)operator(\)) ident(e)operator(++)operator(;) + + keyword(for) operator(()type(long) ident(i) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(begin)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) ident(i) operator(<) ident(e)operator(;) ident(i) operator(+=) ident(unit)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(i)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(begin)operator(.)ident(checkStringType)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(unit) operator(==) integer(0)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(step can't be 0)delimiter(")>operator(\))operator(;) + comment(// rb_iterate((VALUE(*\)_((VALUE\)\)\)str_step, (VALUE\)args, step_i, (VALUE\)iter\);) + ident(StepBlockCallBack) ident(callback) operator(=) keyword(new) ident(StepBlockCallBack)operator(()ident(block)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(,) ident(step)operator(\))operator(;) + ident(Block) ident(blockCallback) operator(=) ident(CallBlock)operator(.)ident(newCallClosure)operator(()local_variable(this)operator(,) ident(runtime)operator(.)ident(getRange)operator(()operator(\))operator(,) ident(Arity)operator(.)ident(singleArgument)operator(()operator(\))operator(,) ident(callback)operator(,) ident(context)operator(\))operator(;) + operator(()operator(()ident(RubyString)operator(\))ident(tmp)operator(\))operator(.)ident(upto)operator(()ident(context)operator(,) ident(end)operator(,) ident(isExclusive)operator(,) ident(blockCallback)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(begin) keyword(instanceof) ident(RubyNumeric)operator(\)) operator({) + keyword(if) operator(()ident(equalInternal)operator(()ident(context)operator(,) ident(step)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(step can't be 0)delimiter(")>operator(\))operator(;) + operator(}) + directive(final) type(String) ident(method)operator(;) + directive(final) type(int) ident(methodIndex)operator(;) + keyword(if) operator(()ident(isExclusive)operator(\)) operator({) + ident(method) operator(=) string<delimiter(")content(<)delimiter(")>operator(;) + ident(methodIndex) operator(=) ident(MethodIndex)operator(.)ident(OP_LT)operator(;) + operator(}) keyword(else) operator({) + ident(method) operator(=) string<delimiter(")content(<=)delimiter(")>operator(;) + ident(methodIndex) operator(=) ident(MethodIndex)operator(.)ident(OP_LE)operator(;) + operator(}) + ident(IRubyObject) ident(beg) operator(=) ident(begin)operator(;) + keyword(while) operator(()ident(beg)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(methodIndex)operator(,) ident(method)operator(,) ident(end)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(beg)operator(\))operator(;) + ident(beg) operator(=) ident(beg)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_PLUS)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(step)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(unit) operator(==) integer(0)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(step can't be 0)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(!)ident(begin)operator(.)ident(respondsTo)operator(()string<delimiter(")content(succ)delimiter(")>operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(() + string<delimiter(")content(can't iterate from )delimiter(")> operator(+) ident(begin)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + comment(// range_each_func(range, step_i, b, e, args\);) + ident(rangeEach)operator(()ident(context)operator(,) keyword(new) ident(StepBlockCallBack)operator(()ident(block)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(,) ident(step)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(include?)delimiter(")>operator(,) string<delimiter(")content(member?)delimiter(")>operator(,) string<delimiter(")content(===)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(include_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()ident(rangeLe)operator(()ident(context)operator(,) ident(begin)operator(,) ident(obj)operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(isExclusive)operator(\)) operator({) + keyword(if) operator(()ident(rangeLt)operator(()ident(context)operator(,) ident(obj)operator(,) ident(end)operator(\)) operator(!=) keyword(null)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(rangeLe)operator(()ident(context)operator(,) ident(obj)operator(,) ident(end)operator(\)) operator(!=) keyword(null)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) ident(ObjectMarshal) ident(RANGE_MARSHAL) operator(=) keyword(new) ident(ObjectMarshal)operator(()operator(\)) operator({) + directive(public) type(void) ident(marshalTo)operator(()ident(Ruby) ident(runtime)operator(,) type(Object) ident(obj)operator(,) ident(RubyClass) ident(type)operator(,) + ident(MarshalStream) ident(marshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyRange) ident(range) operator(=) operator(()ident(RubyRange)operator(\))ident(obj)operator(;) + + ident(marshalStream)operator(.)ident(registerLinkTarget)operator(()ident(range)operator(\))operator(;) + type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(attrs) operator(=) ident(range)operator(.)ident(getVariableList)operator(()operator(\))operator(;) + + ident(attrs)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()string<delimiter(")content(begin)delimiter(")>operator(,) ident(range)operator(.)ident(begin)operator(\))operator(\))operator(;) + ident(attrs)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()string<delimiter(")content(end)delimiter(")>operator(,) ident(range)operator(.)ident(end)operator(\))operator(\))operator(;) + ident(attrs)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()string<delimiter(")content(excl)delimiter(")>operator(,) ident(range)operator(.)ident(isExclusive) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(\))operator(\))operator(;) + + ident(marshalStream)operator(.)ident(dumpVariables)operator(()ident(attrs)operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(unmarshalFrom)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(,) + ident(UnmarshalStream) ident(unmarshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyRange) ident(range) operator(=) operator(()ident(RubyRange)operator(\))ident(type)operator(.)ident(allocate)operator(()operator(\))operator(;) + + ident(unmarshalStream)operator(.)ident(registerLinkTarget)operator(()ident(range)operator(\))operator(;) + + ident(unmarshalStream)operator(.)ident(defaultVariablesUnmarshal)operator(()ident(range)operator(\))operator(;) + + ident(range)operator(.)ident(begin) operator(=) ident(range)operator(.)ident(removeInternalVariable)operator(()string<delimiter(")content(begin)delimiter(")>operator(\))operator(;) + ident(range)operator(.)ident(end) operator(=) ident(range)operator(.)ident(removeInternalVariable)operator(()string<delimiter(")content(end)delimiter(")>operator(\))operator(;) + ident(range)operator(.)ident(isExclusive) operator(=) ident(range)operator(.)ident(removeInternalVariable)operator(()string<delimiter(")content(excl)delimiter(")>operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + + keyword(return) ident(range)operator(;) + operator(}) + operator(})operator(;) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(static) include(org.jruby.util.Numeric.f_add)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_cmp)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_div)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_equal_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_expt)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_floor)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_gcd)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_idiv)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_mul)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_negate)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_negative_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_one_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_rshift)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_sub)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_f)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_i)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_r)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_to_s)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_truncate)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_xor)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.f_zero_p)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.i_gcd)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.i_ilog2)operator(;) +keyword(import) include(static) include(org.jruby.util.Numeric.ldexp)operator(;) + +keyword(import) include(org.joni.encoding.specific.ASCIIEncoding)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.Frame)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.Numeric)operator(;) + +comment(/** + * 1.9 rational.c as of revision: 18876 + */) + +annotation(@JRubyClass)operator(()ident(name) operator(=) string<delimiter(")content(Rational)delimiter(")>operator(,) ident(parent) operator(=) string<delimiter(")content(Numeric)delimiter(")>operator(,) ident(include) operator(=) string<delimiter(")content(Precision)delimiter(")>operator(\)) +directive(public) type(class) class(RubyRational) directive(extends) ident(RubyNumeric) operator({) + + directive(public) directive(static) ident(RubyClass) ident(createRationalClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(rationalc) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Rational)delimiter(")>operator(,) ident(runtime)operator(.)ident(getNumeric)operator(()operator(\))operator(,) ident(RATIONAL_ALLOCATOR)operator(\))operator(;) comment(// because one can Complex.send(:allocate\)) + ident(runtime)operator(.)ident(setRational)operator(()ident(rationalc)operator(\))operator(;) + + ident(rationalc)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(RATIONAL)operator(;) + ident(rationalc)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyRational)operator(;) + operator(}) + operator(})operator(;) + + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(rationalc)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(private_class_method)delimiter(")>operator(,) ident(runtime)operator(.)ident(newSymbol)operator(()string<delimiter(")content(allocate)delimiter(")>operator(\))operator(\))operator(;) + + ident(rationalc)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyRational)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(rationalc)operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(RATIONAL_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyRational)operator(()ident(runtime)operator(,) ident(klass)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + operator(})operator(;) + + comment(/** internal + * + */) + directive(private) ident(RubyRational)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(num)operator(,) ident(IRubyObject) ident(den)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) operator(()ident(RubyClass)operator(\))ident(clazz)operator(\))operator(;) + local_variable(this)operator(.)ident(num) operator(=) ident(num)operator(;) + local_variable(this)operator(.)ident(den) operator(=) ident(den)operator(;) + operator(}) + + comment(/** rb_rational_raw + * + */) + directive(static) ident(RubyRational) ident(newRationalRaw)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(x)operator(,) ident(RubyObject) ident(y)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyRational)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRational)operator(()operator(\))operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** rb_rational_raw1 + * + */) + directive(static) ident(RubyRational) ident(newRationalRaw)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyRational)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRational)operator(()operator(\))operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_rational_new1 + * + */) + directive(static) ident(IRubyObject) ident(newRationalCanonicalize)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) ident(newRationalCanonicalize)operator(()ident(context)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_rational_new + * + */) + directive(private) directive(static) ident(IRubyObject) ident(newRationalCanonicalize)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getRational)operator(()operator(\))operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** f_rational_new2 + * + */) + directive(private) directive(static) ident(IRubyObject) ident(newRational)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + ident(assert) ident(x) keyword(instanceof) ident(RubyRational) operator(&&) ident(y) keyword(instanceof) ident(RubyRational)operator(;) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** f_rational_new1 + * + */) + directive(private) directive(static) ident(IRubyObject) ident(newRational)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + ident(assert) ident(x) keyword(instanceof) ident(RubyRational)operator(;) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** f_rational_new_no_reduce2 + * + */) + directive(private) directive(static) ident(IRubyObject) ident(newRationalNoReduce)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + ident(assert) ident(x) keyword(instanceof) ident(RubyRational) operator(&&) ident(y) keyword(instanceof) ident(RubyRational)operator(;) + keyword(return) ident(canonicalizeInternalNoReduce)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** f_rational_new_no_reduce1 + * + */) + directive(private) directive(static) ident(IRubyObject) ident(newRationalNoReduce)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + ident(assert) ident(x) keyword(instanceof) ident(RubyRational)operator(;) + keyword(return) ident(canonicalizeInternalNoReduce)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** f_rational_new_bang2 + * + */) + directive(private) directive(static) ident(RubyRational) ident(newRationalBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + ident(assert) operator(!)ident(f_negative_p)operator(()ident(context)operator(,) ident(y)operator(\)) operator(&&) operator(!)operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(y)operator(\))operator(\))operator(;) + keyword(return) keyword(new) ident(RubyRational)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + comment(/** f_rational_new_bang1 + * + */) + directive(private) directive(static) ident(RubyRational) ident(newRationalBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) ident(newRationalBang)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(num)operator(;) + directive(private) ident(IRubyObject) ident(den)operator(;) + + comment(/** nurat_s_new_bang + * + */) + annotation(@Deprecated) + directive(public) directive(static) ident(IRubyObject) ident(newInstanceBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([])ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) keyword(return) ident(newInstanceBang)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(newInstanceBang)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new!)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstanceBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(num)operator(\)) operator({) + keyword(return) ident(newInstanceBang)operator(()ident(context)operator(,) ident(recv)operator(,) ident(num)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new!)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstanceBang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(num)operator(,) ident(IRubyObject) ident(den)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(num) keyword(instanceof) ident(RubyInteger)operator(\))operator(\)) ident(num) operator(=) ident(f_to_i)operator(()ident(context)operator(,) ident(num)operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(den) keyword(instanceof) ident(RubyInteger)operator(\))operator(\)) ident(den) operator(=) ident(f_to_i)operator(()ident(context)operator(,) ident(den)operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(res) operator(=) ident(f_cmp)operator(()ident(context)operator(,) ident(den)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(res) operator(==) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(\)) operator({) + ident(num) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(num)operator(\))operator(;) + ident(den) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(den)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(res) operator(==) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + + keyword(return) keyword(new) ident(RubyRational)operator(()ident(runtime)operator(,) ident(recv)operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_int_check + * + */) + directive(private) directive(static) type(void) ident(intCheck)operator(()ident(IRubyObject) ident(num)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(num) keyword(instanceof) ident(RubyFixnum) operator(\)) operator(&&) operator(!)operator(()ident(num) keyword(instanceof) ident(RubyBignum)operator(\))operator(\)) keyword(throw) ident(num)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(not an integer)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** nurat_s_canonicalize_internal + * + */) + directive(private) directive(static) ident(IRubyObject) ident(canonicalizeInternal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(num)operator(,) ident(IRubyObject) ident(den)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(res) operator(=) ident(f_cmp)operator(()ident(context)operator(,) ident(den)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(res) operator(==) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(\)) operator({) + ident(num) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(num)operator(\))operator(;) + ident(den) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(den)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(res) operator(==) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(gcd) operator(=) ident(f_gcd)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + ident(num) operator(=) ident(f_idiv)operator(()ident(context)operator(,) ident(num)operator(,) ident(gcd)operator(\))operator(;) + ident(den) operator(=) ident(f_idiv)operator(()ident(context)operator(,) ident(den)operator(,) ident(gcd)operator(\))operator(;) + + keyword(if) operator(()ident(f_one_p)operator(()ident(context)operator(,) ident(den)operator(\)) operator(&&) operator(()operator(()ident(RubyModule)operator(\))ident(clazz)operator(\))operator(.)ident(fastHasConstant)operator(()string<delimiter(")content(Unify)delimiter(")>operator(\))operator(\)) keyword(return) ident(num)operator(;) + keyword(return) keyword(new) ident(RubyRational)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(clazz)operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_s_canonicalize_internal_no_reduce + * + */) + directive(private) directive(static) ident(IRubyObject) ident(canonicalizeInternalNoReduce)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(num)operator(,) ident(IRubyObject) ident(den)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(res) operator(=) ident(f_cmp)operator(()ident(context)operator(,) ident(den)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(res) operator(==) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(\)) operator({) + ident(num) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(num)operator(\))operator(;) + ident(den) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(den)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(res) operator(==) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(f_equal_p)operator(()ident(context)operator(,) ident(den)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\)) operator(&&) operator(()operator(()ident(RubyModule)operator(\))ident(clazz)operator(\))operator(.)ident(fastHasConstant)operator(()string<delimiter(")content(Unify)delimiter(")>operator(\))operator(\)) keyword(return) ident(num)operator(;) + keyword(return) keyword(new) ident(RubyRational)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(clazz)operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_s_new + * + */) + annotation(@Deprecated) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject)type([])ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) keyword(return) ident(newInstance)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(newInstance)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(num)operator(\)) operator({) + ident(intCheck)operator(()ident(num)operator(\))operator(;) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(num)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject) ident(num)operator(,) ident(IRubyObject) ident(den)operator(\)) operator({) + ident(intCheck)operator(()ident(num)operator(\))operator(;) + ident(intCheck)operator(()ident(den)operator(\))operator(;) + keyword(return) ident(canonicalizeInternal)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** rb_Rational1 + * + */) + directive(public) directive(static) ident(IRubyObject) ident(newRationalConvert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(\)) operator({) + keyword(return) ident(newRationalConvert)operator(()ident(context)operator(,) ident(x)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_Rational/rb_Rational2 + * + */) + directive(public) directive(static) ident(IRubyObject) ident(newRationalConvert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(x)operator(,) ident(IRubyObject) ident(y)operator(\)) operator({) + keyword(return) ident(convert)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getRational)operator(()operator(\))operator(,) ident(x)operator(,) ident(y)operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(public) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(clazz)operator(,) ident(IRubyObject)type([])ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) keyword(return) ident(convert)operator(()ident(context)operator(,) ident(clazz)operator(\))operator(;) + keyword(case) integer(1)operator(:) keyword(return) ident(convert)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) keyword(return) ident(convert)operator(()ident(context)operator(,) ident(clazz)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(/** nurat_s_convert + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(convert)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(IRubyObject) ident(nil) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(convertCommon)operator(()ident(context)operator(,) ident(recv)operator(,) ident(nil)operator(,) ident(nil)operator(\))operator(;) + operator(}) + + comment(/** nurat_s_convert + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(convert)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(a1)operator(\)) operator({) + keyword(return) ident(convertCommon)operator(()ident(context)operator(,) ident(recv)operator(,) ident(a1)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** nurat_s_convert + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(convert)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(convert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(a1)operator(,) ident(IRubyObject) ident(a2)operator(\)) operator({) + keyword(return) ident(convertCommon)operator(()ident(context)operator(,) ident(recv)operator(,) ident(a1)operator(,) ident(a2)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(convertCommon)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(a1)operator(,) ident(IRubyObject) ident(a2)operator(\)) operator({) + keyword(if) operator(()ident(a1) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(a1Complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(a1)operator(;) + keyword(if) operator(()ident(a1Complex)operator(.)ident(getImage)operator(()operator(\)) keyword(instanceof) ident(RubyFloat) operator(||) operator(!)ident(f_zero_p)operator(()ident(context)operator(,) ident(a1Complex)operator(.)ident(getImage)operator(()operator(\))operator(\))operator(\)) operator({) + ident(IRubyObject) ident(s) operator(=) ident(f_to_s)operator(()ident(context)operator(,) ident(a1)operator(\))operator(;) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(can't accept )delimiter(")> operator(+) ident(s)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(a1) operator(=) ident(a1Complex)operator(.)ident(getReal)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(a2) keyword(instanceof) ident(RubyComplex)operator(\)) operator({) + ident(RubyComplex) ident(a2Complex) operator(=) operator(()ident(RubyComplex)operator(\))ident(a2)operator(;) + keyword(if) operator(()ident(a2Complex)operator(.)ident(getImage)operator(()operator(\)) keyword(instanceof) ident(RubyFloat) operator(||) operator(!)ident(f_zero_p)operator(()ident(context)operator(,) ident(a2Complex)operator(.)ident(getImage)operator(()operator(\))operator(\))operator(\)) operator({) + ident(IRubyObject) ident(s) operator(=) ident(f_to_s)operator(()ident(context)operator(,) ident(a2)operator(\))operator(;) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(can't accept )delimiter(")> operator(+) ident(s)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(a2) operator(=) ident(a2Complex)operator(.)ident(getReal)operator(()operator(\))operator(;) + operator(}) + + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + ident(IRubyObject) ident(backref) operator(=) ident(frame)operator(.)ident(getBackRef)operator(()operator(\))operator(;) + keyword(if) operator(()ident(backref) operator(!=) keyword(null) operator(&&) ident(backref) keyword(instanceof) ident(RubyMatchData)operator(\)) operator(()operator(()ident(RubyMatchData)operator(\))ident(backref)operator(\))operator(.)ident(use)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(a1) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + ident(a1) operator(=) ident(f_to_r)operator(()ident(context)operator(,) ident(a1)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(a1) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(a1) operator(=) ident(str_to_r_strict)operator(()ident(context)operator(,) ident(a1)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(a2) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + ident(a2) operator(=) ident(f_to_r)operator(()ident(context)operator(,) ident(a2)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(a2) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(a2) operator(=) ident(str_to_r_strict)operator(()ident(context)operator(,) ident(a2)operator(\))operator(;) + operator(}) + + ident(frame)operator(.)ident(setBackRef)operator(()ident(backref)operator(\))operator(;) + + keyword(if) operator(()ident(a1) keyword(instanceof) ident(RubyRational)operator(\)) operator({) + keyword(if) operator(()ident(a2)operator(.)ident(isNil)operator(()operator(\)) operator(||) ident(f_zero_p)operator(()ident(context)operator(,) ident(a2)operator(\))operator(\)) keyword(return) ident(a1)operator(;) + keyword(return) ident(f_div)operator(()ident(context)operator(,) ident(a1)operator(,) ident(a2)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(a2) keyword(instanceof) ident(RubyRational)operator(\)) operator({) + keyword(return) ident(f_div)operator(()ident(context)operator(,) ident(a1)operator(,) ident(a2)operator(\))operator(;) + operator(}) + + keyword(return) ident(a2)operator(.)ident(isNil)operator(()operator(\)) operator(?) ident(newInstance)operator(()ident(context)operator(,) ident(recv)operator(,) ident(a1)operator(\)) operator(:) ident(newInstance)operator(()ident(context)operator(,) ident(recv)operator(,) ident(a1)operator(,) ident(a2)operator(\))operator(;) + operator(}) + + comment(/** nurat_s_induced_from + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(induced_from)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(induced_from)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(f_to_r)operator(()ident(context)operator(,) ident(arg)operator(\))operator(;) + operator(}) + + comment(/** nurat_numerator + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(numerator)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(numerator)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(num)operator(;) + operator(}) + + comment(/** nurat_denominator + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(denominator)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(denominator)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(den)operator(;) + operator(}) + + comment(/** f_imul + * + */) + directive(private) directive(static) ident(IRubyObject) ident(f_imul)operator(()ident(ThreadContext) ident(context)operator(,) type(long) ident(a)operator(,) type(long) ident(b)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(a) operator(==) integer(0) operator(||) ident(b) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(a) operator(==) integer(1)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(b)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(b) operator(==) integer(1)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(a)operator(\))operator(;) + operator(}) + + type(long) ident(c) operator(=) ident(a) operator(*) ident(b)operator(;) + keyword(if)operator(()ident(c) operator(/) ident(a) operator(!=) ident(b)operator(\)) operator({) + keyword(return) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(runtime)operator(,) ident(a)operator(\))operator(.)ident(op_mul)operator(()ident(context)operator(,) ident(RubyBignum)operator(.)ident(newBignum)operator(()ident(runtime)operator(,) ident(b)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(c)operator(\))operator(;) + operator(}) + + comment(/** f_addsub + * + */) + directive(private) ident(IRubyObject) ident(f_addsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(anum)operator(,) ident(IRubyObject) ident(aden)operator(,) ident(IRubyObject) ident(bnum)operator(,) ident(IRubyObject) ident(bden)operator(,) type(boolean) ident(plus)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(num)operator(,) ident(den)operator(,) ident(g)operator(,) ident(a)operator(,) ident(b)operator(;) + keyword(if) operator(()ident(anum) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(aden) keyword(instanceof) ident(RubyFixnum) operator(&&) + ident(bnum) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(bden) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(an) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(anum)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(ad) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(aden)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(bn) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(bnum)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(bd) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(bden)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(ig) operator(=) ident(i_gcd)operator(()ident(ad)operator(,) ident(bd)operator(\))operator(;) + + ident(g) operator(=) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(ig)operator(\))operator(;) + ident(a) operator(=) ident(f_imul)operator(()ident(context)operator(,) ident(an)operator(,) ident(bd) operator(/) ident(ig)operator(\))operator(;) + ident(b) operator(=) ident(f_imul)operator(()ident(context)operator(,) ident(bn)operator(,) ident(ad) operator(/) ident(ig)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(g) operator(=) ident(f_gcd)operator(()ident(context)operator(,) ident(aden)operator(,) ident(bden)operator(\))operator(;) + ident(a) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(anum)operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(bden)operator(,) ident(g)operator(\))operator(\))operator(;) + ident(b) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(bnum)operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(aden)operator(,) ident(g)operator(\))operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(c) operator(=) ident(plus) operator(?) ident(f_add)operator(()ident(context)operator(,) ident(a)operator(,) ident(b)operator(\)) operator(:) ident(f_sub)operator(()ident(context)operator(,) ident(a)operator(,) ident(b)operator(\))operator(;) + + ident(b) operator(=) ident(f_idiv)operator(()ident(context)operator(,) ident(aden)operator(,) ident(g)operator(\))operator(;) + ident(g) operator(=) ident(f_gcd)operator(()ident(context)operator(,) ident(c)operator(,) ident(g)operator(\))operator(;) + ident(num) operator(=) ident(f_idiv)operator(()ident(context)operator(,) ident(c)operator(,) ident(g)operator(\))operator(;) + ident(a) operator(=) ident(f_idiv)operator(()ident(context)operator(,) ident(bden)operator(,) ident(g)operator(\))operator(;) + ident(den) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(a)operator(,) ident(b)operator(\))operator(;) + + keyword(return) ident(RubyRational)operator(.)ident(newRationalNoReduce)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_add + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_add)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(return) ident(f_addsub)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(,) ident(other)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) keyword(true)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(f_add)operator(()ident(context)operator(,) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(other)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(RATIONAL)operator(:) + ident(RubyRational) ident(otherRational) operator(=) operator(()ident(RubyRational)operator(\))ident(other)operator(;) + keyword(return) ident(f_addsub)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(,) ident(otherRational)operator(.)ident(num)operator(,) ident(otherRational)operator(.)ident(den)operator(,) keyword(true)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nurat_sub + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_sub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(return) ident(f_addsub)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(,) ident(other)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) keyword(false)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(f_sub)operator(()ident(context)operator(,) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(other)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(RATIONAL)operator(:) + ident(RubyRational) ident(otherRational) operator(=) operator(()ident(RubyRational)operator(\))ident(other)operator(;) + keyword(return) ident(f_addsub)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(,) ident(otherRational)operator(.)ident(num)operator(,) ident(otherRational)operator(.)ident(den)operator(,) keyword(false)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** f_muldiv + * + */) + directive(private) ident(IRubyObject) ident(f_muldiv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(anum)operator(,) ident(IRubyObject) ident(aden)operator(,) ident(IRubyObject) ident(bnum)operator(,) ident(IRubyObject) ident(bden)operator(,) type(boolean) ident(mult)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(mult)operator(\)) operator({) + keyword(if) operator(()ident(f_negative_p)operator(()ident(context)operator(,) ident(bnum)operator(\))operator(\)) operator({) + ident(anum) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(anum)operator(\))operator(;) + ident(bnum) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(bnum)operator(\))operator(;) + operator(}) + ident(IRubyObject) ident(tmp) operator(=) ident(bnum)operator(;) + ident(bnum) operator(=) ident(bden)operator(;) + ident(bden) operator(=) ident(tmp)operator(;) + operator(}) + + directive(final) ident(IRubyObject) ident(num)operator(,) ident(den)operator(;) + keyword(if) operator(()ident(anum) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(aden) keyword(instanceof) ident(RubyFixnum) operator(&&) + ident(bnum) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(bden) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(an) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(anum)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(ad) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(aden)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(bn) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(bnum)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(bd) operator(=) operator(()operator(()ident(RubyFixnum)operator(\))ident(bden)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + type(long) ident(g1) operator(=) ident(i_gcd)operator(()ident(an)operator(,) ident(bd)operator(\))operator(;) + type(long) ident(g2) operator(=) ident(i_gcd)operator(()ident(ad)operator(,) ident(bn)operator(\))operator(;) + + ident(num) operator(=) ident(f_imul)operator(()ident(context)operator(,) ident(an) operator(/) ident(g1)operator(,) ident(bn) operator(/) ident(g2)operator(\))operator(;) + ident(den) operator(=) ident(f_imul)operator(()ident(context)operator(,) ident(ad) operator(/) ident(g2)operator(,) ident(bd) operator(/) ident(g1)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(g1) operator(=) ident(f_gcd)operator(()ident(context)operator(,) ident(anum)operator(,) ident(bden)operator(\))operator(;) + ident(IRubyObject) ident(g2) operator(=) ident(f_gcd)operator(()ident(context)operator(,) ident(aden)operator(,) ident(bnum)operator(\))operator(;) + + ident(num) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(anum)operator(,) ident(g1)operator(\))operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(bnum)operator(,) ident(g2)operator(\))operator(\))operator(;) + ident(den) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(aden)operator(,) ident(g2)operator(\))operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(bden)operator(,) ident(g1)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RubyRational)operator(.)ident(newRationalNoReduce)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + + operator(}) + + comment(/** nurat_mul + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(*)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_mul)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(return) ident(f_muldiv)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(,) ident(other)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) keyword(true)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(f_mul)operator(()ident(context)operator(,) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(other)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(RATIONAL)operator(:) + ident(RubyRational) ident(otherRational) operator(=) operator(()ident(RubyRational)operator(\))ident(other)operator(;) + keyword(return) ident(f_muldiv)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(,) ident(otherRational)operator(.)ident(num)operator(,) ident(otherRational)operator(.)ident(den)operator(,) keyword(true)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(*)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nurat_div + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(/)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_div)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + keyword(return) ident(f_muldiv)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(,) ident(other)operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(,) keyword(false)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(RATIONAL)operator(:) + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + ident(RubyRational) ident(otherRational) operator(=) operator(()ident(RubyRational)operator(\))ident(other)operator(;) + keyword(return) ident(f_muldiv)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(,) ident(otherRational)operator(.)ident(num)operator(,) ident(otherRational)operator(.)ident(den)operator(,) keyword(false)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(/)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nurat_fdiv + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fdiv)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_fdiv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(f_div)operator(()ident(context)operator(,) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nurat_expt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(**)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_expt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(other)operator(\))operator(\)) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalBang)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyRational)operator(\)) operator({) + ident(RubyRational) ident(otherRational) operator(=) operator(()ident(RubyRational)operator(\))ident(other)operator(;) + keyword(if) operator(()ident(f_one_p)operator(()ident(context)operator(,) ident(otherRational)operator(.)ident(den)operator(\))operator(\)) ident(other) operator(=) ident(otherRational)operator(.)ident(num)operator(;) + operator(}) + + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + directive(final) ident(IRubyObject) ident(tnum)operator(,) ident(tden)operator(;) + ident(IRubyObject) ident(res) operator(=) ident(f_cmp)operator(()ident(context)operator(,) ident(other)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + keyword(if) operator(()ident(res) operator(==) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\)) operator({) + ident(tnum) operator(=) ident(f_expt)operator(()ident(context)operator(,) ident(num)operator(,) ident(other)operator(\))operator(;) + ident(tden) operator(=) ident(f_expt)operator(()ident(context)operator(,) ident(den)operator(,) ident(other)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(res) operator(==) ident(RubyFixnum)operator(.)ident(minus_one)operator(()ident(runtime)operator(\))operator(\))operator({) + ident(tnum) operator(=) ident(f_expt)operator(()ident(context)operator(,) ident(den)operator(,) ident(f_negate)operator(()ident(context)operator(,) ident(other)operator(\))operator(\))operator(;) + ident(tden) operator(=) ident(f_expt)operator(()ident(context)operator(,) ident(num)operator(,) ident(f_negate)operator(()ident(context)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(tnum) operator(=) ident(tden) operator(=) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(;) + operator(}) + keyword(return) ident(RubyRational)operator(.)ident(newRational)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(tnum)operator(,) ident(tden)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(RATIONAL)operator(:) + keyword(return) ident(f_expt)operator(()ident(context)operator(,) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(other)operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(**)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + + comment(/** nurat_cmp + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(if) operator(()ident(den) keyword(instanceof) ident(RubyFixnum) operator(&&) operator(()operator(()ident(RubyFixnum)operator(\))ident(den)operator(\))operator(.)ident(getLongValue)operator(()operator(\)) operator(==) integer(1)operator(\)) keyword(return) ident(f_cmp)operator(()ident(context)operator(,) ident(num)operator(,) ident(other)operator(\))operator(;) + keyword(return) ident(f_cmp)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(RubyRational)operator(.)ident(newRationalBang)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(other)operator(\))operator(\))operator(;) + + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(f_cmp)operator(()ident(context)operator(,) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(other)operator(\))operator(;) + + keyword(case) ident(ClassIndex)operator(.)ident(RATIONAL)operator(:) + ident(RubyRational) ident(otherRational) operator(=) operator(()ident(RubyRational)operator(\))ident(other)operator(;) + directive(final) ident(IRubyObject) ident(num1)operator(,) ident(num2)operator(;) + keyword(if) operator(()ident(num) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(den) keyword(instanceof) ident(RubyFixnum) operator(&&) + ident(otherRational)operator(.)ident(num) keyword(instanceof) ident(RubyFixnum) operator(&&) ident(otherRational)operator(.)ident(den) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(num1) operator(=) ident(f_imul)operator(()ident(context)operator(,) operator(()operator(()ident(RubyFixnum)operator(\))ident(num)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(,) operator(()operator(()ident(RubyFixnum)operator(\))ident(otherRational)operator(.)ident(den)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + ident(num2) operator(=) ident(f_imul)operator(()ident(context)operator(,) operator(()operator(()ident(RubyFixnum)operator(\))ident(otherRational)operator(.)ident(num)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(,) operator(()operator(()ident(RubyFixnum)operator(\))ident(den)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(num1) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(num)operator(,) ident(otherRational)operator(.)ident(den)operator(\))operator(;) + ident(num2) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(otherRational)operator(.)ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + keyword(return) ident(f_cmp)operator(()ident(context)operator(,) ident(f_sub)operator(()ident(context)operator(,) ident(num1)operator(,) ident(num2)operator(\))operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(coerceBin)operator(()ident(context)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** nurat_equal_p + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(num)operator(\)) operator(&&) ident(f_zero_p)operator(()ident(context)operator(,) ident(den)operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(den) keyword(instanceof) ident(RubyFixnum)operator(\)) operator(||) operator(()operator(()ident(RubyFixnum)operator(\))ident(den)operator(\))operator(.)ident(getLongValue)operator(()operator(\)) operator(!=) integer(1)operator(\)) keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(if) operator(()ident(f_equal_p)operator(()ident(context)operator(,) ident(num)operator(,) ident(other)operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(f_equal_p)operator(()ident(context)operator(,) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(,) ident(other)operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + + keyword(case) ident(ClassIndex)operator(.)ident(RATIONAL)operator(:) + ident(RubyRational) ident(otherRational) operator(=) operator(()ident(RubyRational)operator(\))ident(other)operator(;) + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(num)operator(\)) operator(&&) ident(f_zero_p)operator(()ident(context)operator(,) ident(otherRational)operator(.)ident(num)operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(f_equal_p)operator(()ident(context)operator(,) ident(num)operator(,) ident(otherRational)operator(.)ident(num)operator(\)) operator(&&) ident(f_equal_p)operator(()ident(context)operator(,) ident(den)operator(,) ident(otherRational)operator(.)ident(den)operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(f_equal_p)operator(()ident(context)operator(,) ident(other)operator(,) local_variable(this)operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** nurat_coerce + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(coerce)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_coerce)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(switch) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(index)operator(\)) operator({) + keyword(case) ident(ClassIndex)operator(.)ident(FIXNUM)operator(:) + keyword(case) ident(ClassIndex)operator(.)ident(BIGNUM)operator(:) + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(RubyRational)operator(.)ident(newRationalBang)operator(()ident(context)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(other)operator(\))operator(,) local_variable(this)operator(\))operator(;) + keyword(case) ident(ClassIndex)operator(.)ident(FLOAT)operator(:) + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(other)operator(,) ident(f_to_f)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(\))operator(;) + operator(}) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( can't be coerced into )delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** nurat_idiv + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(div)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_idiv)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(f_floor)operator(()ident(context)operator(,) ident(f_div)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) + + comment(/** nurat_mod + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(modulo)delimiter(")>operator(,) string<delimiter(")content(%)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(op_mod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(val) operator(=) ident(f_floor)operator(()ident(context)operator(,) ident(f_div)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(\))operator(;) + keyword(return) ident(f_sub)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(f_mul)operator(()ident(context)operator(,) ident(other)operator(,) ident(val)operator(\))operator(\))operator(;) + operator(}) + + comment(/** nurat_divmod + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(divmod)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_divmod)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(val) operator(=) ident(f_floor)operator(()ident(context)operator(,) ident(f_div)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(val)operator(,) ident(f_sub)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(f_mul)operator(()ident(context)operator(,) ident(other)operator(,) ident(val)operator(\))operator(\))operator(\))operator(;) + operator(}) + + comment(/** nurat_rem + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(remainder)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_rem)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(IRubyObject) ident(val) operator(=) ident(f_truncate)operator(()ident(context)operator(,) ident(f_div)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(\))operator(;) + keyword(return) ident(f_sub)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(f_mul)operator(()ident(context)operator(,) ident(other)operator(,) ident(val)operator(\))operator(\))operator(;) + operator(}) + + comment(/** nurat_abs + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abs)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_abs)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(f_negative_p)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(\)) keyword(return) local_variable(this)operator(;) + keyword(return) ident(f_negate)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** nurat_floor + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(floor)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_floor)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(f_idiv)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_ceil + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ceil)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_ceil)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(f_negate)operator(()ident(context)operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(f_negate)operator(()ident(context)operator(,) ident(num)operator(\))operator(,) ident(den)operator(\))operator(\))operator(;) + operator(}) + + comment(/** nurat_truncate + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(truncate)delimiter(")>operator(,) string<delimiter(")content(to_i)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(op_truncate)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(f_negative_p)operator(()ident(context)operator(,) ident(num)operator(\))operator(\)) operator({) + keyword(return) ident(f_negate)operator(()ident(context)operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(f_negate)operator(()ident(context)operator(,) ident(num)operator(\))operator(,) ident(den)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(f_idiv)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_round + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(round)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_round)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(IRubyObject) ident(two) operator(=) ident(RubyFixnum)operator(.)ident(two)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(f_negative_p)operator(()ident(context)operator(,) ident(num)operator(\))operator(\)) operator({) + ident(IRubyObject) ident(tnum) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(num)operator(\))operator(;) + ident(tnum) operator(=) ident(f_add)operator(()ident(context)operator(,) ident(f_mul)operator(()ident(context)operator(,) ident(tnum)operator(,) ident(two)operator(\))operator(,) ident(den)operator(\))operator(;) + ident(IRubyObject) ident(tden) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(den)operator(,) ident(two)operator(\))operator(;) + keyword(return) ident(f_negate)operator(()ident(context)operator(,) ident(f_idiv)operator(()ident(context)operator(,) ident(tnum)operator(,) ident(tden)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(tnum) operator(=) ident(f_add)operator(()ident(context)operator(,) ident(f_mul)operator(()ident(context)operator(,) ident(num)operator(,) ident(two)operator(\))operator(,) ident(den)operator(\))operator(;) + ident(IRubyObject) ident(tden) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(den)operator(,) ident(two)operator(\))operator(;) + keyword(return) ident(f_idiv)operator(()ident(context)operator(,) ident(tnum)operator(,) ident(tden)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** nurat_to_f + * + */) + directive(private) directive(static) type(long) ident(ML) operator(=) operator(()type(long)operator(\))operator(()type(Math)operator(.)ident(log)operator(()type(Double)operator(.)ident(MAX_VALUE)operator(\)) operator(/) type(Math)operator(.)ident(log)operator(()float(2.0)operator(\)) operator(-) integer(1)operator(\))operator(;) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_f)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_f)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(num)operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(newFloat)operator(()integer(0)operator(\))operator(;) + + ident(IRubyObject) ident(num) operator(=) local_variable(this)operator(.)ident(num)operator(;) + ident(IRubyObject) ident(den) operator(=) local_variable(this)operator(.)ident(den)operator(;) + + type(boolean) ident(minus) operator(=) keyword(false)operator(;) + keyword(if) operator(()ident(f_negative_p)operator(()ident(context)operator(,) ident(num)operator(\))operator(\)) operator({) + ident(num) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(num)operator(\))operator(;) + ident(minus) operator(=) keyword(true)operator(;) + operator(}) + + type(long) ident(nl) operator(=) ident(i_ilog2)operator(()ident(context)operator(,) ident(num)operator(\))operator(;) + type(long) ident(dl) operator(=) ident(i_ilog2)operator(()ident(context)operator(,) ident(den)operator(\))operator(;) + + type(long) ident(ne) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(nl) operator(>) ident(ML)operator(\)) operator({) + ident(ne) operator(=) ident(nl) operator(-) ident(ML)operator(;) + ident(num) operator(=) ident(f_rshift)operator(()ident(context)operator(,) ident(num)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(ne)operator(\))operator(\))operator(;) + operator(}) + + type(long) ident(de) operator(=) integer(0)operator(;) + keyword(if) operator(()ident(dl) operator(>) ident(ML)operator(\)) operator({) + ident(de) operator(=) ident(dl) operator(-) ident(ML)operator(;) + ident(den) operator(=) ident(f_rshift)operator(()ident(context)operator(,) ident(den)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(de)operator(\))operator(\))operator(;) + operator(}) + + type(long) ident(e) operator(=) ident(ne) operator(-) ident(de)operator(;) + + keyword(if) operator(()ident(e) operator(>) integer(1023) operator(||) ident(e) operator(<) operator(-)integer(1022)operator(\)) operator({) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(IRubyWarnings)operator(.)ident(ID)operator(.)ident(FLOAT_OUT_OF_RANGE)operator(,) string<delimiter(")content(out of Float range)delimiter(")>operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newFloat)operator(()ident(e) operator(>) integer(0) operator(?) type(Double)operator(.)ident(MAX_VALUE) operator(:) integer(0)operator(\))operator(;) + operator(}) + + type(double) ident(f) operator(=) ident(RubyNumeric)operator(.)ident(num2dbl)operator(()ident(num)operator(\)) operator(/) ident(RubyNumeric)operator(.)ident(num2dbl)operator(()ident(den)operator(\))operator(;) + + keyword(if) operator(()ident(minus)operator(\)) operator({) + ident(f) operator(=) operator(-)ident(f)operator(;) + ident(f) operator(=) ident(ldexp)operator(()ident(f)operator(,) ident(e)operator(\))operator(;) + operator(}) + + keyword(if) operator(()type(Double)operator(.)ident(isInfinite)operator(()ident(f)operator(\)) operator(||) type(Double)operator(.)ident(isNaN)operator(()ident(f)operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(IRubyWarnings)operator(.)ident(ID)operator(.)ident(FLOAT_OUT_OF_RANGE)operator(,) string<delimiter(")content(out of Float range)delimiter(")>operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFloat)operator(()ident(f)operator(\))operator(;) + operator(}) + + comment(/** nurat_to_r + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_r)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_r)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** nurat_to_r + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(hash)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(f_xor)operator(()ident(context)operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_to_s + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_s)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getKernel)operator(()operator(\))operator(,) string<delimiter(")content(format)delimiter(")>operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(%d/%d)delimiter(")>operator(\))operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_inspect + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getKernel)operator(()operator(\))operator(,) string<delimiter(")content(format)delimiter(")>operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content((%d/%d\))delimiter(")>operator(\))operator(,) ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_marshal_dump + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(marshal_dump)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(marshal_dump)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(num)operator(,) ident(den)operator(\))operator(;) + operator(}) + + comment(/** nurat_marshal_load + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(marshal_load)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(marshal_load)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(RubyArray) ident(a) operator(=) ident(arg)operator(.)ident(convertToArray)operator(()operator(\))operator(;) + ident(num) operator(=) ident(a)operator(.)ident(size)operator(()operator(\)) operator(>) integer(0) operator(?) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(den) operator(=) ident(a)operator(.)ident(size)operator(()operator(\)) operator(>) integer(1) operator(?) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(f_zero_p)operator(()ident(context)operator(,) ident(den)operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newZeroDivisionError)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_gcd + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gcd)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(gcd)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(intCheck)operator(()ident(other)operator(\))operator(;) + keyword(return) ident(f_gcd)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_lcm + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lcm)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(lcm)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(intCheck)operator(()ident(other)operator(\))operator(;) + keyword(return) ident(Numeric)operator(.)ident(f_lcm)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_gcdlcm + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gcdlcm)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(gcdlcm)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(intCheck)operator(()ident(other)operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(f_gcd)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(,) ident(Numeric)operator(.)ident(f_lcm)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(\))operator(;) + operator(}) + + + directive(static) ident(RubyArray) ident(str_to_r_internal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(RubyString) ident(s) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(strip)delimiter(")>operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(ByteList) ident(bytes) operator(=) ident(s)operator(.)ident(getByteList)operator(()operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(bytes)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(,) ident(recv)operator(\))operator(;) + + ident(IRubyObject) ident(m) operator(=) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(Numeric)operator(.)ident(RationalPatterns)operator(.)ident(rat_pat)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(match)delimiter(")>operator(,) ident(s)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(m)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(si) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(one)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(IRubyObject) ident(nu) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(two)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(IRubyObject) ident(de) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(three)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(IRubyObject) ident(re) operator(=) ident(m)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(post_match)delimiter(")>operator(\))operator(;) + + ident(RubyArray) ident(a) operator(=) ident(nu)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(split)delimiter(")>operator(,) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(Numeric)operator(.)ident(RationalPatterns)operator(.)ident(an_e_pat)operator(\))operator(\))operator(.)ident(convertToArray)operator(()operator(\))operator(;) + ident(IRubyObject) ident(ifp) operator(=) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + ident(IRubyObject) ident(exp) operator(=) ident(a)operator(.)ident(size)operator(()operator(\)) operator(!=) integer(2) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(;) + + ident(a) operator(=) ident(ifp)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(split)delimiter(")>operator(,) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(Numeric)operator(.)ident(RationalPatterns)operator(.)ident(a_dot_pat)operator(\))operator(\))operator(.)ident(convertToArray)operator(()operator(\))operator(;) + ident(IRubyObject) ident(ip) operator(=) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + ident(IRubyObject) ident(fp) operator(=) ident(a)operator(.)ident(size)operator(()operator(\)) operator(!=) integer(2) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(;) + + ident(IRubyObject) ident(v) operator(=) ident(RubyRational)operator(.)ident(newRationalCanonicalize)operator(()ident(context)operator(,) ident(f_to_i)operator(()ident(context)operator(,) ident(ip)operator(\))operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(fp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(bytes) operator(=) ident(fp)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + type(int) ident(count) operator(=) integer(0)operator(;) + type(byte)type([])ident(buf) operator(=) ident(bytes)operator(.)ident(bytes)operator(;) + type(int) ident(i) operator(=) ident(bytes)operator(.)ident(begin)operator(;) + type(int) ident(end) operator(=) ident(i) operator(+) ident(bytes)operator(.)ident(realSize)operator(;) + keyword(while) operator(()ident(i) operator(<) ident(end)operator(\)) keyword(if) operator(()ident(ASCIIEncoding)operator(.)ident(INSTANCE)operator(.)ident(isDigit)operator(()ident(buf)operator([)ident(i)operator(++)operator(])operator(\))operator(\)) ident(count)operator(++)operator(;) + ident(IRubyObject) ident(l) operator(=) ident(f_expt)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) integer(10)operator(\))operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) ident(count)operator(\))operator(\))operator(;) + ident(v) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(v)operator(,) ident(l)operator(\))operator(;) + ident(v) operator(=) ident(f_add)operator(()ident(context)operator(,) ident(v)operator(,) ident(f_to_i)operator(()ident(context)operator(,) ident(fp)operator(\))operator(\))operator(;) + ident(v) operator(=) ident(f_div)operator(()ident(context)operator(,) ident(v)operator(,) ident(l)operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(exp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(v) operator(=) ident(f_mul)operator(()ident(context)operator(,) ident(v)operator(,) ident(f_expt)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(runtime)operator(,) integer(10)operator(\))operator(,) ident(f_to_i)operator(()ident(context)operator(,) ident(exp)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(si)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(bytes) operator(=) ident(si)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(bytes)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(&&) ident(bytes)operator(.)ident(get)operator(()integer(0)operator(\)) operator(==) string<delimiter(')content(-)delimiter(')>operator(\)) ident(v) operator(=) ident(f_negate)operator(()ident(context)operator(,) ident(v)operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(de)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(v) operator(=) ident(f_div)operator(()ident(context)operator(,) ident(v)operator(,) ident(f_to_i)operator(()ident(context)operator(,) ident(de)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(v)operator(,) ident(re)operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(newArray)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(,) ident(recv)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(str_to_r_strict)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(RubyArray) ident(a) operator(=) ident(str_to_r_internal)operator(()ident(context)operator(,) ident(recv)operator(\))operator(;) + keyword(if) operator(()ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(.)ident(isNil)operator(()operator(\)) operator(||) ident(a)operator(.)ident(eltInternal)operator(()integer(1)operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(s) operator(=) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(;) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(invalid value for Rational: )delimiter(")> operator(+) ident(s)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 David Corbin <dcorbin@users.sourceforge.net> + * Copyright (C\) 2006 Nick Sieger <nicksieger@gmail.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.lang.ref.SoftReference)operator(;) +keyword(import) include(java.util.concurrent.ConcurrentHashMap)operator(;) +keyword(import) include(java.util.Iterator)operator(;) +keyword(import) include(java.util.Map)operator(;) + +keyword(import) include(org.joni.Matcher)operator(;) +keyword(import) include(org.joni.NameEntry)operator(;) +keyword(import) include(org.joni.Option)operator(;) +keyword(import) include(org.joni.Regex)operator(;) +keyword(import) include(org.joni.Region)operator(;) +keyword(import) include(org.joni.Syntax)operator(;) +keyword(import) include(org.joni.WarnCallback)operator(;) +keyword(import) include(org.joni.encoding.Encoding)operator(;) +keyword(import) include(org.joni.exception.JOniException)operator(;) + +keyword(import) include(static) include(org.jruby.anno.FrameField)operator(.)operator(*)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.parser.ReOptions)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.Frame)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.KCode)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) + +comment(/** + * + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Regexp)delimiter(")>operator(\)) +directive(public) type(class) class(RubyRegexp) directive(extends) ident(RubyObject) directive(implements) ident(ReOptions)operator(,) ident(WarnCallback) operator({) + directive(private) ident(KCode) ident(kcode)operator(;) + directive(private) ident(Regex) ident(pattern)operator(;) + directive(private) ident(ByteList) ident(str)operator(;) + + directive(private) directive(static) directive(final) type(int) ident(REGEXP_LITERAL_F) operator(=) integer(1) operator(<)operator(<) integer(11)operator(;) + directive(private) directive(static) directive(final) type(int) ident(REGEXP_KCODE_DEFAULT) operator(=) integer(1) operator(<)operator(<) integer(12)operator(;) + + directive(public) type(void) ident(setLiteral)operator(()operator(\)) operator({) + ident(flags) operator(|=) ident(REGEXP_LITERAL_F)operator(;) + operator(}) + + directive(public) type(void) ident(clearLiteral)operator(()operator(\)) operator({) + ident(flags) operator(&=) operator(~)ident(REGEXP_LITERAL_F)operator(;) + operator(}) + + directive(public) type(boolean) ident(isLiteral)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(REGEXP_LITERAL_F)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + directive(public) type(void) ident(setKCodeDefault)operator(()operator(\)) operator({) + ident(flags) operator(|=) ident(REGEXP_KCODE_DEFAULT)operator(;) + operator(}) + + directive(public) type(void) ident(clearKCodeDefault)operator(()operator(\)) operator({) + ident(flags) operator(&=) operator(~)ident(REGEXP_KCODE_DEFAULT)operator(;) + operator(}) + + directive(public) type(boolean) ident(isKCodeDefault)operator(()operator(\)) operator({) + keyword(return) operator(()ident(flags) operator(&) ident(REGEXP_KCODE_DEFAULT)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + directive(public) ident(KCode) ident(getKCode)operator(()operator(\)) operator({) + keyword(return) ident(kcode)operator(;) + operator(}) + + directive(private) directive(static) type(Map)operator(<)ident(ByteList)operator(,) ident(Regex)operator(>) ident(getPatternCache)operator(()operator(\)) operator({) + type(Map)operator(<)ident(ByteList)operator(,) ident(Regex)operator(>) ident(cache) operator(=) ident(patternCache)operator(.)ident(get)operator(()operator(\))operator(;) + keyword(if) operator(()ident(cache) operator(==) keyword(null)operator(\)) operator({) + ident(cache) operator(=) keyword(new) type(ConcurrentHashMap)operator(<)ident(ByteList)operator(,) ident(Regex)operator(>)operator(()integer(5)operator(\))operator(;) + ident(patternCache) operator(=) keyword(new) type(SoftReference)operator(<)type(Map)operator(<)ident(ByteList)operator(,) ident(Regex)operator(>)operator(>)operator(()ident(cache)operator(\))operator(;) + operator(}) + keyword(return) ident(cache)operator(;) + operator(}) + + directive(static) directive(volatile) type(SoftReference)operator(<)type(Map)operator(<)ident(ByteList)operator(,) ident(Regex)operator(>)operator(>) ident(patternCache) operator(=) keyword(new) type(SoftReference)operator(<)type(Map)operator(<)ident(ByteList)operator(,) ident(Regex)operator(>)operator(>)operator(()keyword(null)operator(\))operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createRegexpClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(regexpClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Regexp)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(REGEXP_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setRegexp)operator(()ident(regexpClass)operator(\))operator(;) + ident(regexpClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(REGEXP)operator(;) + ident(regexpClass)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyRegexp)operator(;) + operator(}) + operator(})operator(;) + + ident(regexpClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(IGNORECASE)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RE_OPTION_IGNORECASE)operator(\))operator(\))operator(;) + ident(regexpClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(EXTENDED)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RE_OPTION_EXTENDED)operator(\))operator(\))operator(;) + ident(regexpClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MULTILINE)delimiter(")>operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(RE_OPTION_MULTILINE)operator(\))operator(\))operator(;) + + ident(regexpClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyRegexp)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(regexpClass)operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(REGEXP_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(RubyRegexp) ident(instance) operator(=) keyword(new) ident(RubyRegexp)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + keyword(return) ident(instance)operator(;) + operator(}) + operator(})operator(;) + + comment(/** used by allocator + * + */) + directive(private) ident(RubyRegexp)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + + comment(/** default constructor + * + */) + directive(private) ident(RubyRegexp)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRegexp)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(// used only by the compiler/interpreter (will set the literal flag\)) + directive(public) directive(static) ident(RubyRegexp) ident(newRegexp)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(pattern)operator(,) type(int) ident(options)operator(\)) operator({) + keyword(return) ident(newRegexp)operator(()ident(runtime)operator(,) ident(ByteList)operator(.)ident(create)operator(()ident(pattern)operator(\))operator(,) ident(options)operator(\))operator(;) + operator(}) + + comment(// used only by the compiler/interpreter (will set the literal flag\)) + directive(public) directive(static) ident(RubyRegexp) ident(newRegexp)operator(()ident(Ruby) ident(runtime)operator(,) ident(ByteList) ident(pattern)operator(,) type(int) ident(options)operator(\)) operator({) + ident(RubyRegexp) ident(regexp) operator(=) ident(newRegexp)operator(()ident(runtime)operator(,) ident(pattern)operator(,) ident(options)operator(,) keyword(false)operator(\))operator(;) + ident(regexp)operator(.)ident(setLiteral)operator(()operator(\))operator(;) + keyword(return) ident(regexp)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyRegexp) ident(newRegexp)operator(()ident(Ruby) ident(runtime)operator(,) ident(ByteList) ident(pattern)operator(,) type(int) ident(options)operator(,) type(boolean) ident(quote)operator(\)) operator({) + ident(RubyRegexp) ident(regexp) operator(=) keyword(new) ident(RubyRegexp)operator(()ident(runtime)operator(\))operator(;) + ident(regexp)operator(.)ident(initialize)operator(()ident(pattern)operator(,) ident(options)operator(,) ident(quote)operator(\))operator(;) + keyword(return) ident(regexp)operator(;) + operator(}) + + comment(// internal usage) + directive(static) ident(RubyRegexp) ident(newRegexp)operator(()ident(Ruby) ident(runtime)operator(,) ident(Regex) ident(regex)operator(\)) operator({) + ident(RubyRegexp) ident(regexp) operator(=) keyword(new) ident(RubyRegexp)operator(()ident(runtime)operator(\))operator(;) + ident(regexp)operator(.)ident(pattern) operator(=) ident(regex)operator(;) + ident(regexp)operator(.)ident(str) operator(=) ident(ByteList)operator(.)ident(EMPTY_BYTELIST)operator(;) + keyword(return) ident(regexp)operator(;) + operator(}) + + directive(public) type(void) ident(warn)operator(()type(String) ident(message)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(MISCELLANEOUS)operator(,) ident(message)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(kcode)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(kcode)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) operator(()operator(!)ident(isKCodeDefault)operator(()operator(\)) operator(&&) ident(kcode) operator(!=) keyword(null)operator(\)) operator(?) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(kcode)operator(.)ident(name)operator(()operator(\))operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(REGEXP)operator(;) + operator(}) + + directive(public) ident(Regex) ident(getPattern)operator(()operator(\)) operator({) + keyword(return) ident(pattern)operator(;) + operator(}) + + directive(private) type(void) ident(check)operator(()operator(\)) operator({) + keyword(if) operator(()ident(pattern) operator(==) keyword(null) operator(||) ident(str) operator(==) keyword(null)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(uninitialized Regexp)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + type(int) ident(hashval) operator(=) operator(()type(int)operator(\))ident(pattern)operator(.)ident(getOptions)operator(()operator(\))operator(;) + type(int) ident(len) operator(=) local_variable(this)operator(.)ident(str)operator(.)ident(realSize)operator(;) + type(int) ident(p) operator(=) local_variable(this)operator(.)ident(str)operator(.)ident(begin)operator(;) + keyword(while) operator(()ident(len)operator(--)operator(>)integer(0)operator(\)) operator({) + ident(hashval) operator(=) ident(hashval) operator(*) integer(33) operator(+) ident(str)operator(.)ident(bytes)operator([)ident(p)operator(++)operator(])operator(;) + operator(}) + ident(hashval) operator(=) ident(hashval) operator(+) operator(()ident(hashval)operator(>)operator(>)integer(5)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(hashval)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(==)delimiter(")>operator(,) string<delimiter(")content(eql?)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if)operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if)operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyRegexp)operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + ident(RubyRegexp) ident(otherRegex) operator(=) operator(()ident(RubyRegexp)operator(\))ident(other)operator(;) + + ident(check)operator(()operator(\))operator(;) + ident(otherRegex)operator(.)ident(check)operator(()operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(str)operator(.)ident(equal)operator(()ident(otherRegex)operator(.)ident(str)operator(\)) operator(&&) + ident(kcode) operator(==) ident(otherRegex)operator(.)ident(kcode) operator(&&) ident(pattern)operator(.)ident(getOptions)operator(()operator(\)) operator(==) ident(otherRegex)operator(.)ident(pattern)operator(.)ident(getOptions)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(~)delimiter(")>operator(,) ident(reads) operator(=) operator({)ident(LASTLINE)operator(,) ident(BACKREF)operator(})operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(op_match2)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(line) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getLastLine)operator(()operator(\))operator(;) + keyword(if)operator(()operator(!)operator(()ident(line) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(setBackRef)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + type(int) ident(start) operator(=) ident(search)operator(()ident(context)operator(,) operator(()ident(RubyString)operator(\))ident(line)operator(,) integer(0)operator(,) keyword(false)operator(\))operator(;) + keyword(if)operator(()ident(start) operator(<) integer(0)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(start)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_reg_eqq + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(===)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(eqq)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if)operator(()operator(!)operator(()ident(str) keyword(instanceof) ident(RubyString)operator(\))operator(\)) ident(str) operator(=) ident(str)operator(.)ident(checkStringType)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(str)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(setBackRef)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + type(int) ident(start) operator(=) ident(search)operator(()ident(context)operator(,) operator(()ident(RubyString)operator(\))ident(str)operator(,) integer(0)operator(,) keyword(false)operator(\))operator(;) + keyword(return) operator(()ident(start) operator(<) integer(0)operator(\)) operator(?) ident(runtime)operator(.)ident(getFalse)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(int) ident(REGEX_QUOTED) operator(=) integer(1)operator(;) + directive(private) type(void) ident(initialize)operator(()ident(ByteList) ident(bytes)operator(,) type(int) ident(options)operator(,) type(boolean) ident(quote)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(isTaint)operator(()operator(\)) operator(&&) ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't modify regexp)delimiter(")>operator(\))operator(;) + ident(checkFrozen)operator(()operator(\))operator(;) + keyword(if) operator(()ident(isLiteral)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(can't modify literal regexp)delimiter(")>operator(\))operator(;) + + ident(setKCode)operator(()ident(options)operator(\))operator(;) + + type(Map)operator(<)ident(ByteList)operator(,) ident(Regex)operator(>) ident(cache) operator(=) ident(getPatternCache)operator(()operator(\))operator(;) + ident(Regex) ident(pat) operator(=) ident(cache)operator(.)ident(get)operator(()ident(bytes)operator(\))operator(;) + + keyword(if) operator(()ident(pat) operator(!=) keyword(null) operator(&&) + ident(pat)operator(.)ident(getEncoding)operator(()operator(\)) operator(==) ident(kcode)operator(.)ident(getEncoding)operator(()operator(\)) operator(&&) + ident(pat)operator(.)ident(getOptions)operator(()operator(\)) operator(==) operator(()ident(options) operator(&) hex(0xf)operator(\)) operator(&&) + operator(()operator(()ident(pat)operator(.)ident(getUserOptions)operator(()operator(\)) operator(&) ident(REGEX_QUOTED)operator(\)) operator(!=) integer(0)operator(\)) operator(==) ident(quote)operator(\)) operator({) comment(// cache hit) + ident(pattern) operator(=) ident(pat)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(quote)operator(\)) ident(bytes) operator(=) ident(quote)operator(()ident(bytes)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getKCode)operator(()operator(\))operator(\))operator(;) + ident(makeRegexp)operator(()ident(bytes)operator(,) ident(bytes)operator(.)ident(begin)operator(,) ident(bytes)operator(.)ident(realSize)operator(,) ident(options) operator(&) hex(0xf)operator(,) ident(kcode)operator(.)ident(getEncoding)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(quote)operator(\)) ident(pattern)operator(.)ident(setUserOptions)operator(()ident(REGEX_QUOTED)operator(\))operator(;) + ident(cache)operator(.)ident(put)operator(()ident(bytes)operator(,) ident(pattern)operator(\))operator(;) + operator(}) + + ident(str) operator(=) ident(bytes)operator(;) + operator(}) + + directive(private) type(void) ident(makeRegexp)operator(()ident(ByteList) ident(bytes)operator(,) type(int) ident(start)operator(,) type(int) ident(len)operator(,) type(int) ident(flags)operator(,) ident(Encoding) ident(enc)operator(\)) operator({) + keyword(try) operator({) + ident(pattern) operator(=) keyword(new) ident(Regex)operator(()ident(bytes)operator(.)ident(bytes)operator(,) ident(start)operator(,) ident(start) operator(+) ident(len)operator(,) ident(flags)operator(,) ident(enc)operator(,) ident(Syntax)operator(.)ident(DEFAULT)operator(,) local_variable(this)operator(\))operator(;) + operator(}) keyword(catch)operator(()type(Exception) ident(e)operator(\)) operator({) + ident(rb_reg_raise)operator(()ident(bytes)operator(.)ident(bytes)operator(,) ident(start)operator(,) ident(len)operator(,) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(,) ident(flags)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(final) type(void) ident(rb_reg_raise)operator(()type(byte)type([]) ident(s)operator(,) type(int) ident(start)operator(,) type(int) ident(len)operator(,) type(String) ident(err)operator(,)type(int) ident(flags)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRegexpError)operator(()ident(err) operator(+) string<delimiter(")content(: )delimiter(")> operator(+) ident(rb_reg_desc)operator(()ident(s)operator(,)ident(start)operator(,) ident(len)operator(,)ident(flags)operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(final) type(StringBuilder) ident(rb_reg_desc)operator(()type(byte)type([]) ident(s)operator(,) type(int) ident(start)operator(,) type(int) ident(len)operator(,) type(int) ident(flags)operator(\)) operator({) + type(StringBuilder) ident(sb) operator(=) keyword(new) type(StringBuilder)operator(()string<delimiter(")content(/)delimiter(")>operator(\))operator(;) + ident(rb_reg_expr_str)operator(()ident(sb)operator(,) ident(s)operator(,) ident(start)operator(,) ident(len)operator(\))operator(;) + ident(sb)operator(.)ident(append)operator(()string<delimiter(")content(/)delimiter(")>operator(\))operator(;) + + keyword(if)operator(()operator(()ident(flags) operator(&) ident(ReOptions)operator(.)ident(RE_OPTION_MULTILINE)operator(\)) operator(!=) integer(0)operator(\)) ident(sb)operator(.)ident(append)operator(()string<delimiter(")content(m)delimiter(")>operator(\))operator(;) + keyword(if)operator(()operator(()ident(flags) operator(&) ident(ReOptions)operator(.)ident(RE_OPTION_IGNORECASE)operator(\)) operator(!=) integer(0)operator(\)) ident(sb)operator(.)ident(append)operator(()string<delimiter(")content(i)delimiter(")>operator(\))operator(;) + keyword(if)operator(()operator(()ident(flags) operator(&) ident(ReOptions)operator(.)ident(RE_OPTION_EXTENDED)operator(\)) operator(!=) integer(0)operator(\)) ident(sb)operator(.)ident(append)operator(()string<delimiter(")content(x)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(kcode) operator(!=) keyword(null) operator(&&) operator(!)ident(isKCodeDefault)operator(()operator(\))operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()ident(kcode)operator(.)ident(name)operator(()operator(\))operator(.)ident(charAt)operator(()integer(0)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(sb)operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(rb_reg_expr_str)operator(()type(StringBuilder) ident(sb)operator(,) type(byte)type([]) ident(s)operator(,) type(int) ident(start)operator(,) type(int) ident(len)operator(\)) operator({) + type(int) ident(p)operator(,)ident(pend)operator(;) + type(boolean) ident(need_escape) operator(=) keyword(false)operator(;) + ident(p) operator(=) ident(start)operator(;) + ident(pend) operator(=) ident(start)operator(+)ident(len)operator(;) + ident(Encoding) ident(enc) operator(=) ident(kcode)operator(.)ident(getEncoding)operator(()operator(\))operator(;) + keyword(while)operator(()ident(p)operator(<)ident(pend)operator(\)) operator({) + keyword(if)operator(()ident(s)operator([)ident(p)operator(]) operator(==) string<delimiter(')content(/)delimiter(')> operator(||) operator(()operator(!)operator(()string<delimiter(')content( )delimiter(')> operator(==) ident(s)operator([)ident(p)operator(]) operator(||) operator(()operator(!)type(Character)operator(.)ident(isWhitespace)operator(()ident(s)operator([)ident(p)operator(])operator(\)) operator(&&) + operator(!)type(Character)operator(.)ident(isISOControl)operator(()ident(s)operator([)ident(p)operator(])operator(\))operator(\))operator(\)) operator(&&) + ident(enc)operator(.)ident(length)operator(()ident(s)operator([)ident(p)operator(])operator(\))operator(==)integer(1)operator(\))operator(\)) operator({) + ident(need_escape) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + operator(}) + ident(p) operator(+=) ident(enc)operator(.)ident(length)operator(()ident(s)operator([)ident(p)operator(])operator(\))operator(;) + operator(}) + keyword(if)operator(()operator(!)ident(need_escape)operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()keyword(new) ident(ByteList)operator(()ident(s)operator(,)ident(start)operator(,)ident(len)operator(,)keyword(false)operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(p) operator(=) integer(0)operator(;) + keyword(while)operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + keyword(if)operator(()ident(s)operator([)ident(p)operator(]) operator(==) string<delimiter(')char(\\\\)delimiter(')>operator(\)) operator({) + type(int) ident(n) operator(=) ident(enc)operator(.)ident(length)operator(()ident(s)operator([)ident(p)operator(+)integer(1)operator(])operator(\)) operator(+) integer(1)operator(;) + ident(sb)operator(.)ident(append)operator(()keyword(new) ident(ByteList)operator(()ident(s)operator(,)ident(p)operator(,)ident(n)operator(,)keyword(false)operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(p) operator(+=) ident(n)operator(;) + keyword(continue)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(s)operator([)ident(p)operator(]) operator(==) string<delimiter(')content(/)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(")char(\\\\)content(/)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(enc)operator(.)ident(length)operator(()ident(s)operator([)ident(p)operator(])operator(\))operator(!=)integer(1)operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()keyword(new) ident(ByteList)operator(()ident(s)operator(,)ident(p)operator(,)ident(enc)operator(.)ident(length)operator(()ident(s)operator([)ident(p)operator(])operator(\))operator(,)keyword(false)operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(p) operator(+=) ident(enc)operator(.)ident(length)operator(()ident(s)operator([)ident(p)operator(])operator(\))operator(;) + keyword(continue)operator(;) + operator(}) keyword(else) keyword(if)operator(()operator(()string<delimiter(')content( )delimiter(')> operator(==) ident(s)operator([)ident(p)operator(]) operator(||) operator(()operator(!)type(Character)operator(.)ident(isWhitespace)operator(()ident(s)operator([)ident(p)operator(])operator(\)) operator(&&) + operator(!)type(Character)operator(.)ident(isISOControl)operator(()ident(s)operator([)ident(p)operator(])operator(\))operator(\))operator(\))operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()operator(()type(char)operator(\))operator(()ident(s)operator([)ident(p)operator(])operator(&)hex(0xFF)operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if)operator(()operator(!)type(Character)operator(.)ident(isWhitespace)operator(()operator(()type(char)operator(\))operator(()ident(s)operator([)ident(p)operator(])operator(&)hex(0xFF)operator(\))operator(\))operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(;) + ident(sb)operator(.)ident(append)operator(()type(Integer)operator(.)ident(toString)operator(()operator(()type(int)operator(\))operator(()ident(s)operator([)ident(p)operator(])operator(&)oct(0377)operator(\))operator(,)integer(8)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(sb)operator(.)ident(append)operator(()operator(()type(char)operator(\))operator(()ident(s)operator([)ident(p)operator(])operator(&)hex(0xFF)operator(\))operator(\))operator(;) + operator(}) + ident(p)operator(++)operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** rb_reg_init_copy + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(re)operator(\)) operator({) + keyword(if)operator(()local_variable(this) operator(==) ident(re)operator(\)) keyword(return) local_variable(this)operator(;) + + ident(checkFrozen)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\)) operator(!=) ident(re)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyRegexp) ident(regexp) operator(=) operator(()ident(RubyRegexp)operator(\))ident(re)operator(;) + ident(regexp)operator(.)ident(check)operator(()operator(\))operator(;) + + ident(initialize)operator(()ident(regexp)operator(.)ident(str)operator(,) ident(regexp)operator(.)ident(getOptions)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_set_kcode + */) + directive(private) type(int) ident(getKcode)operator(()operator(\)) operator({) + keyword(if)operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(NONE)operator(\)) operator({) + keyword(return) integer(16)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(EUC)operator(\)) operator({) + keyword(return) integer(32)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(SJIS)operator(\)) operator({) + keyword(return) integer(48)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(UTF8)operator(\)) operator({) + keyword(return) integer(64)operator(;) + operator(}) + keyword(return) integer(0)operator(;) + operator(}) + + comment(/** + */) + directive(private) type(void) ident(setKCode)operator(()type(int) ident(options)operator(\)) operator({) + ident(clearKCodeDefault)operator(()operator(\))operator(;) + keyword(switch)operator(()ident(options) operator(&) operator(~)hex(0xf)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(default)operator(:) + ident(setKCodeDefault)operator(()operator(\))operator(;) + ident(kcode) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getKCode)operator(()operator(\))operator(;) + keyword(break)operator(;) + keyword(case) integer(16)operator(:) + ident(kcode) operator(=) ident(KCode)operator(.)ident(NONE)operator(;) + keyword(break)operator(;) + keyword(case) integer(32)operator(:) + ident(kcode) operator(=) ident(KCode)operator(.)ident(EUC)operator(;) + keyword(break)operator(;) + keyword(case) integer(48)operator(:) + ident(kcode) operator(=) ident(KCode)operator(.)ident(SJIS)operator(;) + keyword(break)operator(;) + keyword(case) integer(64)operator(:) + ident(kcode) operator(=) ident(KCode)operator(.)ident(UTF8)operator(;) + keyword(break)operator(;) + operator(}) + operator(}) + + comment(/** rb_reg_options + */) + directive(private) type(int) ident(getOptions)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + type(int) ident(options) operator(=) operator(()type(int)operator(\))operator(()ident(pattern)operator(.)ident(getOptions)operator(()operator(\)) operator(&) operator(()ident(RE_OPTION_IGNORECASE)operator(|)ident(RE_OPTION_MULTILINE)operator(|)ident(RE_OPTION_EXTENDED)operator(\))operator(\))operator(;) + keyword(if)operator(()operator(!)ident(isKCodeDefault)operator(()operator(\))operator(\)) operator({) + ident(options) operator(|=) ident(getKcode)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(options)operator(;) + operator(}) + + comment(/** rb_reg_initialize_m + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(3)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize_m)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(ByteList) ident(bytes)operator(;) + type(int) ident(regexFlags) operator(=) integer(0)operator(;) + + keyword(if)operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(REGEXP_IGNORED_FLAGS)operator(,) string<delimiter(")content(flags)delimiter(")> operator(+) operator(()ident(args)operator(.)ident(length) operator(==) integer(3) operator(?) string<delimiter(")content( and encoding)delimiter(")> operator(:) string<delimiter(")delimiter(")>operator(\)) operator(+) string<delimiter(")content( ignored)delimiter(")>operator(\))operator(;) + operator(}) + ident(RubyRegexp) ident(regexp) operator(=) operator(()ident(RubyRegexp)operator(\))ident(args)operator([)integer(0)operator(])operator(;) + ident(regexp)operator(.)ident(check)operator(()operator(\))operator(;) + + ident(regexFlags) operator(=) operator(()type(int)operator(\))ident(regexp)operator(.)ident(pattern)operator(.)ident(getOptions)operator(()operator(\)) operator(&) hex(0xF)operator(;) + keyword(if) operator(()operator(!)ident(regexp)operator(.)ident(isKCodeDefault)operator(()operator(\)) operator(&&) ident(regexp)operator(.)ident(kcode) operator(!=) keyword(null) operator(&&) ident(regexp)operator(.)ident(kcode) operator(!=) ident(KCode)operator(.)ident(NIL)operator(\)) operator({) + keyword(if) operator(()ident(regexp)operator(.)ident(kcode) operator(==) ident(KCode)operator(.)ident(NONE)operator(\)) operator({) + ident(regexFlags) operator(|=) integer(16)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(regexp)operator(.)ident(kcode) operator(==) ident(KCode)operator(.)ident(EUC)operator(\)) operator({) + ident(regexFlags) operator(|=) integer(32)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(regexp)operator(.)ident(kcode) operator(==) ident(KCode)operator(.)ident(SJIS)operator(\)) operator({) + ident(regexFlags) operator(|=) integer(48)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(regexp)operator(.)ident(kcode) operator(==) ident(KCode)operator(.)ident(UTF8)operator(\)) operator({) + ident(regexFlags) operator(|=) integer(64)operator(;) + operator(}) + operator(}) + ident(bytes) operator(=) ident(regexp)operator(.)ident(str)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>=) integer(2)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(regexFlags) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(1)operator(])operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(regexFlags) operator(=) ident(RE_OPTION_IGNORECASE)operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(3) operator(&&) operator(!)ident(args)operator([)integer(2)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(ByteList) ident(kcodeBytes) operator(=) ident(args)operator([)integer(2)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + type(char) ident(first) operator(=) ident(kcodeBytes)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0) operator(?) ident(kcodeBytes)operator(.)ident(charAt)operator(()integer(0)operator(\)) operator(:) integer(0)operator(;) + ident(regexFlags) operator(&=) operator(~)hex(0x70)operator(;) + keyword(switch) operator(()ident(first)operator(\)) operator({) + keyword(case) string<delimiter(')content(n)delimiter(')>operator(:) keyword(case) string<delimiter(')content(N)delimiter(')>operator(:) + ident(regexFlags) operator(|=) integer(16)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(e)delimiter(')>operator(:) keyword(case) string<delimiter(')content(E)delimiter(')>operator(:) + ident(regexFlags) operator(|=) integer(32)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(s)delimiter(')>operator(:) keyword(case) string<delimiter(')content(S)delimiter(')>operator(:) + ident(regexFlags) operator(|=) integer(48)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(u)delimiter(')>operator(:) keyword(case) string<delimiter(')content(U)delimiter(')>operator(:) + ident(regexFlags) operator(|=) integer(64)operator(;) + keyword(break)operator(;) + keyword(default)operator(:) + keyword(break)operator(;) + operator(}) + operator(}) + ident(bytes) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + operator(}) + ident(initialize)operator(()ident(bytes)operator(,) ident(regexFlags)operator(,) keyword(false)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(new)delimiter(")>operator(,) string<delimiter(")content(compile)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(2)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyRegexp) ident(newInstance)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyClass) ident(klass) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + + ident(RubyRegexp) ident(re) operator(=) operator(()ident(RubyRegexp)operator(\)) ident(klass)operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(re)operator(.)ident(callInit)operator(()ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + + keyword(return) ident(re)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(options)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(options)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getOptions)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_reg_search + */) + directive(public) type(int) ident(search)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyString) ident(str)operator(,) type(int) ident(pos)operator(,) type(boolean) ident(reverse)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getCurrentRubyFrame)operator(()operator(\))operator(;) + + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>) ident(value)operator(.)ident(realSize) operator(||) ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(frame)operator(.)ident(setBackRef)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) operator(-)integer(1)operator(;) + operator(}) + + keyword(return) ident(performSearch)operator(()ident(reverse)operator(,) ident(pos)operator(,) ident(value)operator(,) ident(frame)operator(,) ident(runtime)operator(,) ident(context)operator(,) ident(str)operator(\))operator(;) + operator(}) + + directive(private) type(int) ident(performSearch)operator(()type(boolean) ident(reverse)operator(,) type(int) ident(pos)operator(,) ident(ByteList) ident(value)operator(,) type(Frame) ident(frame)operator(,) ident(Ruby) ident(runtime)operator(,) ident(ThreadContext) ident(context)operator(,) ident(RubyString) ident(str)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + + type(int) ident(realSize) operator(=) ident(value)operator(.)ident(realSize)operator(;) + type(int) ident(begin) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(range) operator(=) ident(reverse) operator(?) operator(-)ident(pos) operator(:) ident(realSize) operator(-) ident(pos)operator(;) + + type(Matcher) ident(matcher) operator(=) ident(pattern)operator(.)ident(matcher)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(begin)operator(,) ident(begin) operator(+) ident(realSize)operator(\))operator(;) + + type(int) ident(result) operator(=) ident(matcher)operator(.)ident(search)operator(()ident(begin) operator(+) ident(pos)operator(,) ident(begin) operator(+) ident(pos) operator(+) ident(range)operator(,) type(Option)operator(.)ident(NONE)operator(\))operator(;) + + keyword(if) operator(()ident(result) operator(<) integer(0)operator(\)) operator({) + ident(frame)operator(.)ident(setBackRef)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + ident(updateBackRef)operator(()ident(context)operator(,) ident(str)operator(,) ident(frame)operator(,) ident(matcher)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(final) ident(RubyMatchData) ident(updateBackRef)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyString) ident(str)operator(,) type(Frame) ident(frame)operator(,) type(Matcher) ident(matcher)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(backref) operator(=) ident(frame)operator(.)ident(getBackRef)operator(()operator(\))operator(;) + directive(final) ident(RubyMatchData) ident(match)operator(;) + keyword(if) operator(()ident(backref) operator(==) keyword(null) operator(||) ident(backref)operator(.)ident(isNil)operator(()operator(\)) operator(||) operator(()operator(()ident(RubyMatchData)operator(\))ident(backref)operator(\))operator(.)ident(used)operator(()operator(\))operator(\)) operator({) + ident(match) operator(=) keyword(new) ident(RubyMatchData)operator(()ident(runtime)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(match) operator(=) operator(()ident(RubyMatchData)operator(\))ident(backref)operator(;) + ident(match)operator(.)ident(setTaint)operator(()ident(runtime)operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(3)operator(\))operator(;) + operator(}) + + ident(match)operator(.)ident(regs) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) comment(// lazy, null when no groups defined) + ident(match)operator(.)ident(begin) operator(=) ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(;) + ident(match)operator(.)ident(end) operator(=) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(;) + + ident(match)operator(.)ident(str) operator(=) operator(()ident(RubyString)operator(\))ident(str)operator(.)ident(strDup)operator(()ident(runtime)operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(match)operator(.)ident(pattern) operator(=) ident(pattern)operator(;) + + ident(frame)operator(.)ident(setBackRef)operator(()ident(match)operator(\))operator(;) + + ident(match)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + ident(match)operator(.)ident(infectBy)operator(()ident(str)operator(\))operator(;) + keyword(return) ident(match)operator(;) + operator(}) + + comment(/** rb_reg_match + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(=~)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_match)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + type(int) ident(start)operator(;) + keyword(if)operator(()ident(str)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(setBackRef)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + ident(start) operator(=) ident(search)operator(()ident(context)operator(,) ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(,) integer(0)operator(,) keyword(false)operator(\))operator(;) + + keyword(if) operator(()ident(start) operator(<) integer(0)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(start)operator(\))operator(;) + operator(}) + + comment(/** rb_reg_match_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(match)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(reads) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(match_m)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + keyword(if) operator(()ident(op_match)operator(()ident(context)operator(,) ident(str)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(IRubyObject) ident(result) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(;) + keyword(if) operator(()ident(result) keyword(instanceof) ident(RubyMatchData)operator(\)) operator({) + operator(()operator(()ident(RubyMatchData)operator(\))ident(result)operator(\))operator(.)ident(use)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + + directive(public) ident(RubyString) ident(regsub)operator(()ident(RubyString) ident(str)operator(,) ident(RubyString) ident(src)operator(,) type(Matcher) ident(matcher)operator(\)) operator({) + type(Region) ident(regs) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) + type(int) ident(mbeg) operator(=) ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(;) + type(int) ident(mend) operator(=) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(;) + + type(int) ident(p)operator(,)ident(s)operator(,)ident(e)operator(;) + ident(p) operator(=) ident(s) operator(=) integer(0)operator(;) + type(int) ident(no) operator(=) operator(-)integer(1)operator(;) + ident(ByteList) ident(bs) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + ident(ByteList) ident(srcbs) operator(=) ident(src)operator(.)ident(getByteList)operator(()operator(\))operator(;) + ident(e) operator(=) ident(bs)operator(.)ident(length)operator(()operator(\))operator(;) + ident(RubyString) ident(val) operator(=) keyword(null)operator(;) + ident(Encoding) ident(enc) operator(=) ident(kcode)operator(.)ident(getEncoding)operator(()operator(\))operator(;) + + type(int) ident(beg)operator(,) ident(end)operator(;) + keyword(while)operator(()ident(s) operator(<) ident(e)operator(\)) operator({) + type(int) ident(ss) operator(=) ident(s)operator(;) + type(char) ident(c) operator(=) ident(bs)operator(.)ident(charAt)operator(()ident(s)operator(++)operator(\))operator(;) + keyword(if)operator(()ident(enc)operator(.)ident(length)operator(()operator(()type(byte)operator(\))ident(c)operator(\)) operator(!=) integer(1)operator(\)) operator({) + ident(s) operator(+=) ident(enc)operator(.)ident(length)operator(()operator(()type(byte)operator(\))ident(c)operator(\)) operator(-) integer(1)operator(;) + keyword(continue)operator(;) + operator(}) + keyword(if) operator(()ident(c) operator(!=) string<delimiter(')char(\\\\)delimiter(')> operator(||) ident(s) operator(==) ident(e)operator(\)) keyword(continue)operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) ident(val) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) keyword(new) ident(ByteList)operator(()ident(ss) operator(-) ident(p)operator(\))operator(\))operator(;) + + ident(val)operator(.)ident(cat)operator(()ident(bs)operator(.)ident(bytes)operator(,) ident(bs)operator(.)ident(begin) operator(+) ident(p)operator(,) ident(ss) operator(-) ident(p)operator(\))operator(;) + ident(c) operator(=) ident(bs)operator(.)ident(charAt)operator(()ident(s)operator(++)operator(\))operator(;) + ident(p) operator(=) ident(s)operator(;) + + keyword(switch)operator(()ident(c)operator(\)) operator({) + keyword(case) string<delimiter(')content(0)delimiter(')>operator(:) keyword(case) string<delimiter(')content(1)delimiter(')>operator(:) keyword(case) string<delimiter(')content(2)delimiter(')>operator(:) keyword(case) string<delimiter(')content(3)delimiter(')>operator(:) keyword(case) string<delimiter(')content(4)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(5)delimiter(')>operator(:) keyword(case) string<delimiter(')content(6)delimiter(')>operator(:) keyword(case) string<delimiter(')content(7)delimiter(')>operator(:) keyword(case) string<delimiter(')content(8)delimiter(')>operator(:) keyword(case) string<delimiter(')content(9)delimiter(')>operator(:) + ident(no) operator(=) ident(c) operator(-) string<delimiter(')content(0)delimiter(')>operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(&)delimiter(')>operator(:) + ident(no) operator(=) integer(0)operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content(`)delimiter(')>operator(:) + ident(beg) operator(=) ident(regs) operator(==) keyword(null) operator(?) ident(mbeg) operator(:) ident(regs)operator(.)ident(beg)operator([)integer(0)operator(])operator(;) + ident(val)operator(.)ident(cat)operator(()ident(srcbs)operator(.)ident(bytes)operator(,) ident(srcbs)operator(.)ident(begin)operator(,) ident(beg)operator(\))operator(;) + keyword(continue)operator(;) + + keyword(case) string<delimiter(')char(\\')delimiter(')>operator(:) + ident(end) operator(=) ident(regs) operator(==) keyword(null) operator(?) ident(mend) operator(:) ident(regs)operator(.)ident(end)operator([)integer(0)operator(])operator(;) + ident(val)operator(.)ident(cat)operator(()ident(srcbs)operator(.)ident(bytes)operator(,) ident(srcbs)operator(.)ident(begin) operator(+) ident(end)operator(,) ident(src)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(-) ident(end)operator(\))operator(;) + keyword(continue)operator(;) + + keyword(case) string<delimiter(')content(+)delimiter(')>operator(:) + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(mbeg) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(no) operator(=) integer(0)operator(;) + keyword(continue)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(no) operator(=) ident(regs)operator(.)ident(numRegs)operator(-)integer(1)operator(;) + keyword(while)operator(()ident(regs)operator(.)ident(beg)operator([)ident(no)operator(]) operator(==) operator(-)integer(1) operator(&&) ident(no) operator(>) integer(0)operator(\)) ident(no)operator(--)operator(;) + keyword(if) operator(()ident(no) operator(==) integer(0)operator(\)) keyword(continue)operator(;) + operator(}) + keyword(break)operator(;) + keyword(case) string<delimiter(')char(\\\\)delimiter(')>operator(:) + ident(val)operator(.)ident(cat)operator(()ident(bs)operator(.)ident(bytes)operator(,) ident(s) operator(-) integer(1)operator(,) integer(1)operator(\))operator(;) + keyword(continue)operator(;) + keyword(default)operator(:) + ident(val)operator(.)ident(cat)operator(()ident(bs)operator(.)ident(bytes)operator(,) ident(s) operator(-) integer(2)operator(,) integer(2)operator(\))operator(;) + keyword(continue)operator(;) + operator(}) + + keyword(if) operator(()ident(regs) operator(!=) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(no) operator(>=) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(no) operator(>=) ident(regs)operator(.)ident(numRegs) operator(||) ident(regs)operator(.)ident(beg)operator([)ident(no)operator(]) operator(==) operator(-)integer(1)operator(\)) keyword(continue)operator(;) + ident(val)operator(.)ident(cat)operator(()ident(srcbs)operator(.)ident(bytes)operator(,) ident(srcbs)operator(.)ident(begin) operator(+) ident(regs)operator(.)ident(beg)operator([)ident(no)operator(])operator(,) ident(regs)operator(.)ident(end)operator([)ident(no)operator(]) operator(-) ident(regs)operator(.)ident(beg)operator([)ident(no)operator(])operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(no) operator(!=) integer(0) operator(||) ident(mbeg) operator(==) operator(-)integer(1)operator(\)) keyword(continue)operator(;) + ident(val)operator(.)ident(cat)operator(()ident(srcbs)operator(.)ident(bytes)operator(,) ident(srcbs)operator(.)ident(begin) operator(+) ident(mbeg)operator(,) ident(mend) operator(-) ident(mbeg)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if)operator(()ident(p) operator(<) ident(e)operator(\)) operator({) + keyword(if)operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + ident(val) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(bs)operator(.)ident(makeShared)operator(()ident(p)operator(,) ident(e)operator(-)ident(p)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(val)operator(.)ident(cat)operator(()ident(bs)operator(.)ident(bytes)operator(,) ident(bs)operator(.)ident(begin) operator(+) ident(p)operator(,) ident(e) operator(-) ident(p)operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) keyword(return) ident(str)operator(;) + + keyword(return) ident(val)operator(;) + operator(}) + + directive(final) type(int) ident(adjustStartPos)operator(()ident(RubyString) ident(str)operator(,) type(int) ident(pos)operator(,) type(boolean) ident(reverse)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(return) ident(pattern)operator(.)ident(adjustStartPosition)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin)operator(,) ident(value)operator(.)ident(realSize)operator(,) ident(pos)operator(,) ident(reverse)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(casefold?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(casefold_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()operator(()ident(pattern)operator(.)ident(getOptions)operator(()operator(\)) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) operator(!=) integer(0)operator(\))operator(;) + operator(}) + + comment(/** rb_reg_source + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(source)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(source)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(check)operator(()operator(\))operator(;) + ident(RubyString) ident(str) operator(=) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(runtime)operator(,) local_variable(this)operator(.)ident(str)operator(\))operator(;) + keyword(if)operator(()ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(str)operator(.)ident(taint)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(str)operator(;) + operator(}) + + directive(final) type(int) ident(length)operator(()operator(\)) operator({) + keyword(return) ident(str)operator(.)ident(realSize)operator(;) + operator(}) + + comment(/** rb_reg_inspect + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(ByteList)operator(.)ident(create)operator(()ident(rb_reg_desc)operator(()ident(str)operator(.)ident(bytes)operator(,) ident(str)operator(.)ident(begin)operator(,) ident(str)operator(.)ident(realSize)operator(,) ident(pattern)operator(.)ident(getOptions)operator(()operator(\))operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(final) directive(static) type(int) ident(EMBEDDABLE) operator(=) ident(RE_OPTION_MULTILINE)operator(|)ident(RE_OPTION_IGNORECASE)operator(|)ident(RE_OPTION_EXTENDED)operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + ident(RubyString) ident(ss) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content((?)delimiter(")>operator(\))operator(;) + ident(check)operator(()operator(\))operator(;) + + type(int) ident(options) operator(=) ident(pattern)operator(.)ident(getOptions)operator(()operator(\))operator(;) + type(int) ident(ptr) operator(=) ident(str)operator(.)ident(begin)operator(;) + type(int) ident(len) operator(=) ident(str)operator(.)ident(realSize)operator(;) + type(byte)type([]) ident(bytes) operator(=) ident(str)operator(.)ident(bytes)operator(;) + ident(again)operator(:) keyword(do) operator({) + keyword(if) operator(()ident(len) operator(>=) integer(4) operator(&&) ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(()delimiter(')> operator(&&) ident(bytes)operator([)ident(ptr) operator(+) integer(1)operator(]) operator(==) string<delimiter(')content(?)delimiter(')>operator(\)) operator({) + type(boolean) ident(err) operator(=) keyword(true)operator(;) + ident(ptr) operator(+=) integer(2)operator(;) + keyword(if) operator(()operator(()ident(len) operator(-=) integer(2)operator(\)) operator(>) integer(0)operator(\)) operator({) + keyword(do) operator({) + keyword(if) operator(()ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(m)delimiter(')>operator(\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_MULTILINE)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(i)delimiter(')>operator(\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_IGNORECASE)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(x)delimiter(')>operator(\)) operator({) + ident(options) operator(|=) ident(RE_OPTION_EXTENDED)operator(;) + operator(}) keyword(else) operator({) + keyword(break)operator(;) + operator(}) + ident(ptr)operator(++)operator(;) + operator(}) keyword(while)operator(()operator(--)ident(len) operator(>) integer(0)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(len) operator(>) integer(1) operator(&&) ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(-)delimiter(')>operator(\)) operator({) + operator(++)ident(ptr)operator(;) + operator(--)ident(len)operator(;) + keyword(do) operator({) + keyword(if) operator(()ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(m)delimiter(')>operator(\)) operator({) + ident(options) operator(&=) operator(~)ident(RE_OPTION_MULTILINE)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(i)delimiter(')>operator(\)) operator({) + ident(options) operator(&=) operator(~)ident(RE_OPTION_IGNORECASE)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(x)delimiter(')>operator(\)) operator({) + ident(options) operator(&=) operator(~)ident(RE_OPTION_EXTENDED)operator(;) + operator(}) keyword(else) operator({) + keyword(break)operator(;) + operator(}) + ident(ptr)operator(++)operator(;) + operator(}) keyword(while)operator(()operator(--)ident(len) operator(>) integer(0)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(\))delimiter(')>operator(\)) operator({) + operator(--)ident(len)operator(;) + operator(++)ident(ptr)operator(;) + keyword(continue) ident(again)operator(;) + operator(}) + + keyword(if) operator(()ident(bytes)operator([)ident(ptr)operator(]) operator(==) string<delimiter(')content(:)delimiter(')> operator(&&) ident(bytes)operator([)ident(ptr) operator(+) ident(len) operator(-) integer(1)operator(]) operator(==) string<delimiter(')content(\))delimiter(')>operator(\)) operator({) + keyword(try) operator({) + keyword(new) ident(Regex)operator(()ident(bytes)operator(,) operator(++)ident(ptr)operator(,) ident(ptr) operator(+) operator(()ident(len)operator(-=)integer(2)operator(\)) operator(,)type(Option)operator(.)ident(DEFAULT)operator(,) ident(kcode)operator(.)ident(getEncoding)operator(()operator(\))operator(,) ident(Syntax)operator(.)ident(DEFAULT)operator(\))operator(;) + ident(err) operator(=) keyword(false)operator(;) + operator(}) keyword(catch) operator(()ident(JOniException) ident(e)operator(\)) operator({) + ident(err) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(err)operator(\)) operator({) + ident(options) operator(=) operator(()type(int)operator(\))ident(pattern)operator(.)ident(getOptions)operator(()operator(\))operator(;) + ident(ptr) operator(=) ident(str)operator(.)ident(begin)operator(;) + ident(len) operator(=) ident(str)operator(.)ident(realSize)operator(;) + operator(}) + operator(}) + keyword(if) operator(()operator(()ident(options) operator(&) ident(RE_OPTION_MULTILINE)operator(\)) operator(!=)integer(0) operator(\)) ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(m)delimiter(')>operator(\))operator(;) + keyword(if) operator(()operator(()ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) operator(!=)integer(0) operator(\)) ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(i)delimiter(')>operator(\))operator(;) + keyword(if) operator(()operator(()ident(options) operator(&) ident(RE_OPTION_EXTENDED)operator(\)) operator(!=)integer(0) operator(\)) ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(x)delimiter(')>operator(\))operator(;) + + keyword(if) operator(()operator(()ident(options) operator(&) ident(EMBEDDABLE)operator(\)) operator(!=) ident(EMBEDDABLE)operator(\)) operator({) + ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(-)delimiter(')>operator(\))operator(;) + keyword(if) operator(()operator(()ident(options) operator(&) ident(RE_OPTION_MULTILINE)operator(\)) operator(==) integer(0)operator(\)) ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(m)delimiter(')>operator(\))operator(;) + keyword(if) operator(()operator(()ident(options) operator(&) ident(RE_OPTION_IGNORECASE)operator(\)) operator(==) integer(0)operator(\)) ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(i)delimiter(')>operator(\))operator(;) + keyword(if) operator(()operator(()ident(options) operator(&) ident(RE_OPTION_EXTENDED)operator(\)) operator(==) integer(0)operator(\)) ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(x)delimiter(')>operator(\))operator(;) + operator(}) + ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(:)delimiter(')>operator(\))operator(;) + ident(rb_reg_expr_str)operator(()ident(ss)operator(,) ident(ptr)operator(,) ident(len)operator(\))operator(;) + ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(\))delimiter(')>operator(\))operator(;) + ident(ss)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(ss)operator(;) + operator(}) keyword(while)operator(()keyword(true)operator(\))operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(rb_reg_expr_str)operator(()ident(RubyString) ident(ss)operator(,) type(int) ident(s)operator(,) type(int) ident(len)operator(\)) operator({) + type(int) ident(p) operator(=) ident(s)operator(;) + type(int) ident(pend) operator(=) ident(p) operator(+) ident(len)operator(;) + type(boolean) ident(need_escape) operator(=) keyword(false)operator(;) + ident(Encoding) ident(enc) operator(=) ident(kcode)operator(.)ident(getEncoding)operator(()operator(\))operator(;) + keyword(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + keyword(if) operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(]) operator(==) string<delimiter(')content(/)delimiter(')> operator(||) operator(()operator(!)ident(enc)operator(.)ident(isPrint)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(]) operator(&) hex(0xff)operator(\)) operator(&&) ident(enc)operator(.)ident(length)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(])operator(\)) operator(==) integer(1)operator(\))operator(\)) operator({) + ident(need_escape) operator(=) keyword(true)operator(;) + keyword(break)operator(;) + operator(}) + ident(p) operator(+=) ident(enc)operator(.)ident(length)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(])operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(!)ident(need_escape)operator(\)) operator({) + ident(ss)operator(.)ident(cat)operator(()ident(str)operator(.)ident(bytes)operator(,) ident(s)operator(,) ident(len)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(p) operator(=) ident(s)operator(;) + keyword(while) operator(()ident(p)operator(<)ident(pend)operator(\)) operator({) + keyword(if) operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(]) operator(==) string<delimiter(')char(\\\\)delimiter(')>operator(\)) operator({) + type(int) ident(n) operator(=) ident(enc)operator(.)ident(length)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(+)integer(1)operator(])operator(\)) operator(+) integer(1)operator(;) + ident(ss)operator(.)ident(cat)operator(()ident(str)operator(.)ident(bytes)operator(,) ident(p)operator(,) ident(n)operator(\))operator(;) + ident(p) operator(+=) ident(n)operator(;) + keyword(continue)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(]) operator(==) string<delimiter(')content(/)delimiter(')>operator(\)) operator({) + ident(ss)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(;) + ident(ss)operator(.)ident(cat)operator(()ident(str)operator(.)ident(bytes)operator(,) ident(p)operator(,) integer(1)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(enc)operator(.)ident(length)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(])operator(\)) operator(!=) integer(1)operator(\)) operator({) + ident(ss)operator(.)ident(cat)operator(()ident(str)operator(.)ident(bytes)operator(,) ident(p)operator(,) ident(enc)operator(.)ident(length)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(])operator(\))operator(\))operator(;) + ident(p) operator(+=) ident(enc)operator(.)ident(length)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(])operator(\))operator(;) + keyword(continue)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(enc)operator(.)ident(isPrint)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(]) operator(&) hex(0xff)operator(\))operator(\)) operator({) + ident(ss)operator(.)ident(cat)operator(()ident(str)operator(.)ident(bytes)operator(,)ident(p)operator(,)integer(1)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(!)ident(enc)operator(.)ident(isSpace)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(]) operator(&) hex(0xff)operator(\))operator(\)) operator({) + ident(ss)operator(.)ident(cat)operator(()ident(ByteList)operator(.)ident(create)operator(()type(Integer)operator(.)ident(toString)operator(()ident(str)operator(.)ident(bytes)operator([)ident(p)operator(]) operator(&) oct(0377)operator(,) integer(8)operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(ss)operator(.)ident(cat)operator(()ident(str)operator(.)ident(bytes)operator(,) ident(p)operator(,) integer(1)operator(\))operator(;) + operator(}) + ident(p)operator(++)operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** rb_reg_s_quote + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(quote)delimiter(")>operator(,) string<delimiter(")content(escape)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyString) ident(quote)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(kcode) operator(=) ident(args)operator(.)ident(length) operator(==) integer(2) operator(?) ident(args)operator([)integer(1)operator(]) operator(:) keyword(null)operator(;) + ident(IRubyObject) ident(str) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(KCode) ident(code) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getKCode)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(kcode) operator(!=) keyword(null) operator(&&) operator(!)ident(kcode)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(code) operator(=) ident(KCode)operator(.)ident(create)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(kcode)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(RubyString) ident(src) operator(=) ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(RubyString) ident(dst) operator(=) ident(RubyString)operator(.)ident(newString)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(quote)operator(()ident(src)operator(.)ident(getByteList)operator(()operator(\))operator(,) ident(code)operator(\))operator(\))operator(;) + ident(dst)operator(.)ident(infectBy)operator(()ident(src)operator(\))operator(;) + keyword(return) ident(dst)operator(;) + operator(}) + + comment(/** rb_reg_quote + * + */) + directive(public) directive(static) ident(ByteList) ident(quote)operator(()ident(ByteList) ident(str)operator(,) ident(KCode) ident(kcode)operator(\)) operator({) + ident(ByteList) ident(bs) operator(=) ident(str)operator(;) + type(int) ident(tix) operator(=) integer(0)operator(;) + type(int) ident(s) operator(=) ident(bs)operator(.)ident(begin)operator(;) + type(char) ident(c)operator(;) + type(int) ident(send) operator(=) ident(s)operator(+)ident(bs)operator(.)ident(length)operator(()operator(\))operator(;) + ident(Encoding) ident(enc) operator(=) ident(kcode)operator(.)ident(getEncoding)operator(()operator(\))operator(;) + ident(meta_found)operator(:) keyword(do) operator({) + keyword(for)operator(()operator(;) ident(s)operator(<)ident(send)operator(;) ident(s)operator(++)operator(\)) operator({) + ident(c) operator(=) operator(()type(char)operator(\))operator(()ident(bs)operator(.)ident(bytes)operator([)ident(s)operator(])operator(&)hex(0xFF)operator(\))operator(;) + keyword(if)operator(()ident(enc)operator(.)ident(length)operator(()operator(()type(byte)operator(\))ident(c)operator(\)) operator(!=) integer(1)operator(\)) operator({) + type(int) ident(n) operator(=) ident(enc)operator(.)ident(length)operator(()operator(()type(byte)operator(\))ident(c)operator(\))operator(;) + keyword(while)operator(()ident(n)operator(--) operator(>) integer(0) operator(&&) ident(s) operator(<) ident(send)operator(\)) operator({) + ident(s)operator(++)operator(;) + operator(}) + ident(s)operator(--)operator(;) + keyword(continue)operator(;) + operator(}) + keyword(switch) operator(()ident(c)operator(\)) operator({) + keyword(case) string<delimiter(')content([)delimiter(')>operator(:) keyword(case) string<delimiter(')content(])delimiter(')>operator(:) keyword(case) string<delimiter(')content({)delimiter(')>operator(:) keyword(case) string<delimiter(')content(})delimiter(')>operator(:) + keyword(case) string<delimiter(')content(()delimiter(')>operator(:) keyword(case) string<delimiter(')content(\))delimiter(')>operator(:) keyword(case) string<delimiter(')content(|)delimiter(')>operator(:) keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(*)delimiter(')>operator(:) keyword(case) string<delimiter(')content(.)delimiter(')>operator(:) keyword(case) string<delimiter(')char(\\\\)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(?)delimiter(')>operator(:) keyword(case) string<delimiter(')content(+)delimiter(')>operator(:) keyword(case) string<delimiter(')content(^)delimiter(')>operator(:) keyword(case) string<delimiter(')content($)delimiter(')>operator(:) + keyword(case) string<delimiter(')content( )delimiter(')>operator(:) keyword(case) string<delimiter(')content(#)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(\\t)delimiter(')>operator(:) keyword(case) string<delimiter(')content(\\f)delimiter(')>operator(:) keyword(case) string<delimiter(')content(\\n)delimiter(')>operator(:) keyword(case) string<delimiter(')content(\\r)delimiter(')>operator(:) + keyword(break) ident(meta_found)operator(;) + operator(}) + operator(}) + keyword(return) ident(bs)operator(;) + operator(}) keyword(while)operator(()keyword(false)operator(\))operator(;) + ident(ByteList) ident(b1) operator(=) keyword(new) ident(ByteList)operator(()ident(send)operator(*)integer(2)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(bs)operator(.)ident(bytes)operator(,)ident(bs)operator(.)ident(begin)operator(,)ident(b1)operator(.)ident(bytes)operator(,)ident(b1)operator(.)ident(begin)operator(,)ident(s)operator(-)ident(bs)operator(.)ident(begin)operator(\))operator(;) + ident(tix) operator(+=) operator(()ident(s)operator(-)ident(bs)operator(.)ident(begin)operator(\))operator(;) + + keyword(for)operator(()operator(;) ident(s)operator(<)ident(send)operator(;) ident(s)operator(++)operator(\)) operator({) + ident(c) operator(=) operator(()type(char)operator(\))operator(()ident(bs)operator(.)ident(bytes)operator([)ident(s)operator(])operator(&)hex(0xFF)operator(\))operator(;) + keyword(if)operator(()ident(enc)operator(.)ident(length)operator(()operator(()type(byte)operator(\))ident(c)operator(\)) operator(!=) integer(1)operator(\)) operator({) + type(int) ident(n) operator(=) ident(enc)operator(.)ident(length)operator(()operator(()type(byte)operator(\))ident(c)operator(\))operator(;) + keyword(while)operator(()ident(n)operator(--) operator(>) integer(0) operator(&&) ident(s) operator(<) ident(send)operator(\)) operator({) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) ident(bs)operator(.)ident(bytes)operator([)ident(s)operator(++)operator(])operator(;) + operator(}) + ident(s)operator(--)operator(;) + keyword(continue)operator(;) + operator(}) + + keyword(switch)operator(()ident(c)operator(\)) operator({) + keyword(case) string<delimiter(')content([)delimiter(')>operator(:) keyword(case) string<delimiter(')content(])delimiter(')>operator(:) keyword(case) string<delimiter(')content({)delimiter(')>operator(:) keyword(case) string<delimiter(')content(})delimiter(')>operator(:) + keyword(case) string<delimiter(')content(()delimiter(')>operator(:) keyword(case) string<delimiter(')content(\))delimiter(')>operator(:) keyword(case) string<delimiter(')content(|)delimiter(')>operator(:) keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(*)delimiter(')>operator(:) keyword(case) string<delimiter(')content(.)delimiter(')>operator(:) keyword(case) string<delimiter(')char(\\\\)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(?)delimiter(')>operator(:) keyword(case) string<delimiter(')content(+)delimiter(')>operator(:) keyword(case) string<delimiter(')content(^)delimiter(')>operator(:) keyword(case) string<delimiter(')content($)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(#)delimiter(')>operator(:) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')char(\\\\)delimiter(')>operator(;) + keyword(break)operator(;) + keyword(case) string<delimiter(')content( )delimiter(')>operator(:) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')char(\\\\)delimiter(')>operator(;) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')content( )delimiter(')>operator(;) + keyword(continue)operator(;) + keyword(case) string<delimiter(')content(\\t)delimiter(')>operator(:) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')char(\\\\)delimiter(')>operator(;) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')content(t)delimiter(')>operator(;) + keyword(continue)operator(;) + keyword(case) string<delimiter(')content(\\n)delimiter(')>operator(:) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')char(\\\\)delimiter(')>operator(;) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')content(n)delimiter(')>operator(;) + keyword(continue)operator(;) + keyword(case) string<delimiter(')content(\\r)delimiter(')>operator(:) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')char(\\\\)delimiter(')>operator(;) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')content(r)delimiter(')>operator(;) + keyword(continue)operator(;) + keyword(case) string<delimiter(')content(\\f)delimiter(')>operator(:) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')char(\\\\)delimiter(')>operator(;) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) string<delimiter(')content(f)delimiter(')>operator(;) + keyword(continue)operator(;) + operator(}) + ident(b1)operator(.)ident(bytes)operator([)ident(tix)operator(++)operator(]) operator(=) operator(()type(byte)operator(\))ident(c)operator(;) + operator(}) + ident(b1)operator(.)ident(realSize) operator(=) ident(tix)operator(;) + keyword(return) ident(b1)operator(;) + operator(}) + + + comment(/** rb_reg_nth_match + * + */) + directive(public) directive(static) ident(IRubyObject) ident(nth_match)operator(()type(int) ident(nth)operator(,) ident(IRubyObject) ident(match)operator(\)) operator({) + keyword(if) operator(()ident(match)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(match)operator(;) + ident(RubyMatchData) ident(m) operator(=) operator(()ident(RubyMatchData)operator(\))ident(match)operator(;) + + type(int) ident(start)operator(,) ident(end)operator(;) + + keyword(if) operator(()ident(m)operator(.)ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(nth) operator(>=) integer(1)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(if) operator(()ident(nth) operator(<) integer(0) operator(&&) operator(++)ident(nth) operator(<=) integer(0)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(start) operator(=) ident(m)operator(.)ident(begin)operator(;) + ident(end) operator(=) ident(m)operator(.)ident(end)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(nth) operator(>=) ident(m)operator(.)ident(regs)operator(.)ident(numRegs)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(if) operator(()ident(nth) operator(<) integer(0) operator(&&) operator(()ident(nth)operator(+=)ident(m)operator(.)ident(regs)operator(.)ident(numRegs)operator(\)) operator(<=) integer(0)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(start) operator(=) ident(m)operator(.)ident(regs)operator(.)ident(beg)operator([)ident(nth)operator(])operator(;) + ident(end) operator(=) ident(m)operator(.)ident(regs)operator(.)ident(end)operator([)ident(nth)operator(])operator(;) + operator(}) + + keyword(if) operator(()ident(start) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(RubyString) ident(str) operator(=) ident(m)operator(.)ident(str)operator(.)ident(makeShared)operator(()ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(start)operator(,) ident(end) operator(-) ident(start)operator(\))operator(;) + ident(str)operator(.)ident(infectBy)operator(()ident(match)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_reg_last_match + * + */) + directive(public) directive(static) ident(IRubyObject) ident(last_match)operator(()ident(IRubyObject) ident(match)operator(\)) operator({) + keyword(return) ident(nth_match)operator(()integer(0)operator(,) ident(match)operator(\))operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) directive(static) ident(IRubyObject) ident(last_match_s)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(return) ident(last_match_s)operator(()ident(context)operator(,) ident(recv)operator(\))operator(;) + keyword(case) integer(1)operator(:) + keyword(return) ident(last_match_s)operator(()ident(context)operator(,) ident(recv)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_reg_s_last_match / match_getter + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(last_match)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(last_match_s)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(IRubyObject) ident(match) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(;) + keyword(if) operator(()ident(match) keyword(instanceof) ident(RubyMatchData)operator(\)) operator(()operator(()ident(RubyMatchData)operator(\))ident(match)operator(\))operator(.)ident(use)operator(()operator(\))operator(;) + keyword(return) ident(match)operator(;) + operator(}) + + comment(/** rb_reg_s_last_match + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(last_match)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(last_match_s)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(nth)operator(\)) operator({) + ident(IRubyObject) ident(match) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(;) + keyword(if) operator(()ident(match)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(match)operator(;) + keyword(return) ident(nth_match)operator(()operator(()operator(()ident(RubyMatchData)operator(\))ident(match)operator(\))operator(.)ident(backrefNumber)operator(()ident(nth)operator(\))operator(,) ident(match)operator(\))operator(;) + operator(}) + + comment(/** rb_reg_match_pre + * + */) + directive(public) directive(static) ident(IRubyObject) ident(match_pre)operator(()ident(IRubyObject) ident(match)operator(\)) operator({) + keyword(if) operator(()ident(match)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(match)operator(;) + ident(RubyMatchData) ident(m) operator(=) operator(()ident(RubyMatchData)operator(\))ident(match)operator(;) + + type(int) ident(beg) operator(=) ident(m)operator(.)ident(regs) operator(==) keyword(null) operator(?) ident(m)operator(.)ident(begin) operator(:) ident(m)operator(.)ident(regs)operator(.)ident(beg)operator([)integer(0)operator(])operator(;) + + keyword(if)operator(()ident(beg) operator(==) operator(-)integer(1)operator(\)) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(RubyString) ident(str) operator(=) ident(m)operator(.)ident(str)operator(.)ident(makeShared)operator(()ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(,) integer(0)operator(,) ident(beg)operator(\))operator(;) + ident(str)operator(.)ident(infectBy)operator(()ident(match)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_reg_match_post + * + */) + directive(public) directive(static) ident(IRubyObject) ident(match_post)operator(()ident(IRubyObject) ident(match)operator(\)) operator({) + keyword(if) operator(()ident(match)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(match)operator(;) + ident(RubyMatchData) ident(m) operator(=) operator(()ident(RubyMatchData)operator(\))ident(match)operator(;) + + type(int) ident(end)operator(;) + keyword(if) operator(()ident(m)operator(.)ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(m)operator(.)ident(begin) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(end) operator(=) ident(m)operator(.)ident(end)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(m)operator(.)ident(regs)operator(.)ident(beg)operator([)integer(0)operator(]) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(end) operator(=) ident(m)operator(.)ident(regs)operator(.)ident(end)operator([)integer(0)operator(])operator(;) + operator(}) + + ident(RubyString) ident(str) operator(=) ident(m)operator(.)ident(str)operator(.)ident(makeShared)operator(()ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(end)operator(,) ident(m)operator(.)ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(-) ident(end)operator(\))operator(;) + ident(str)operator(.)ident(infectBy)operator(()ident(match)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_reg_match_last + * + */) + directive(public) directive(static) ident(IRubyObject) ident(match_last)operator(()ident(IRubyObject) ident(match)operator(\)) operator({) + keyword(if) operator(()ident(match)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(match)operator(;) + ident(RubyMatchData) ident(m) operator(=) operator(()ident(RubyMatchData)operator(\))ident(match)operator(;) + + keyword(if) operator(()ident(m)operator(.)ident(regs) operator(==) keyword(null) operator(||) ident(m)operator(.)ident(regs)operator(.)ident(beg)operator([)integer(0)operator(]) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + type(int) ident(i)operator(;) + keyword(for) operator(()ident(i)operator(=)ident(m)operator(.)ident(regs)operator(.)ident(numRegs)operator(-)integer(1)operator(;) ident(m)operator(.)ident(regs)operator(.)ident(beg)operator([)ident(i)operator(])operator(==)operator(-)integer(1) operator(&&) ident(i)operator(>)integer(0)operator(;) ident(i)operator(--)operator(\))operator(;) + keyword(if) operator(()ident(i) operator(==) integer(0)operator(\)) keyword(return) ident(match)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(return) ident(nth_match)operator(()ident(i)operator(,)ident(match)operator(\))operator(;) + operator(}) + + comment(/** rb_reg_s_union + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(union)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(union)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(newRegexp)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(ByteList)operator(.)ident(create)operator(()string<delimiter(")content((?!\))delimiter(")>operator(\))operator(,) integer(0)operator(,) keyword(false)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(IRubyObject) ident(v) operator(=) ident(TypeConverter)operator(.)ident(convertToTypeWithCheck)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getRegexp)operator(()operator(\))operator(,) integer(0)operator(,) string<delimiter(")content(to_regexp)delimiter(")>operator(\))operator(;) + keyword(if)operator(()operator(!)ident(v)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(v)operator(;) + operator(}) keyword(else) operator({) + comment(// newInstance here) + keyword(return) ident(newRegexp)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(quote)operator(()ident(recv)operator(,)ident(args)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(,) integer(0)operator(,) keyword(false)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(KCode) ident(kcode) operator(=) keyword(null)operator(;) + ident(IRubyObject) ident(kcode_re) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(RubyString) ident(source) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()operator(\))operator(;) + ident(IRubyObject)type([]) ident(_args) operator(=) keyword(new) ident(IRubyObject)operator([)integer(3)operator(])operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()integer(0) operator(<) ident(i)operator(\)) operator({) + ident(source)operator(.)ident(cat)operator(()operator(()type(byte)operator(\))string<delimiter(')content(|)delimiter(')>operator(\))operator(;) + operator(}) + ident(IRubyObject) ident(v) operator(=) ident(TypeConverter)operator(.)ident(convertToTypeWithCheck)operator(()ident(args)operator([)ident(i)operator(])operator(,) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getRegexp)operator(()operator(\))operator(,) integer(0)operator(,) string<delimiter(")content(to_regexp)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(!)ident(v)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()operator(()ident(RubyRegexp)operator(\))ident(v)operator(\))operator(.)ident(isKCodeDefault)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(kcode) operator(==) keyword(null)operator(\)) operator({) + ident(kcode_re) operator(=) ident(v)operator(;) + ident(kcode) operator(=) operator(()operator(()ident(RubyRegexp)operator(\))ident(v)operator(\))operator(.)ident(kcode)operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(()operator(()ident(RubyRegexp)operator(\))ident(v)operator(\))operator(.)ident(kcode) operator(!=) ident(kcode)operator(\)) operator({) + ident(IRubyObject) ident(str1) operator(=) ident(kcode_re)operator(.)ident(inspect)operator(()operator(\))operator(;) + ident(IRubyObject) ident(str2) operator(=) ident(v)operator(.)ident(inspect)operator(()operator(\))operator(;) + keyword(throw) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(mixed kcode )delimiter(")> operator(+) ident(str1) operator(+) string<delimiter(")content( and )delimiter(")> operator(+) ident(str2)operator(\))operator(;) + operator(}) + operator(}) + ident(v) operator(=) operator(()operator(()ident(RubyRegexp)operator(\))ident(v)operator(\))operator(.)ident(to_s)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(v) operator(=) ident(quote)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([])operator({)ident(args)operator([)ident(i)operator(])operator(})operator(\))operator(;) + operator(}) + ident(source)operator(.)ident(append)operator(()ident(v)operator(\))operator(;) + operator(}) + + ident(_args)operator([)integer(0)operator(]) operator(=) ident(source)operator(;) + ident(_args)operator([)integer(1)operator(]) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(if) operator(()ident(kcode) operator(==) keyword(null)operator(\)) operator({) + ident(_args)operator([)integer(2)operator(]) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(NONE)operator(\)) operator({) + ident(_args)operator([)integer(2)operator(]) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(n)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(EUC)operator(\)) operator({) + ident(_args)operator([)integer(2)operator(]) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(e)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(SJIS)operator(\)) operator({) + ident(_args)operator([)integer(2)operator(]) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(s)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(kcode) operator(==) ident(KCode)operator(.)ident(UTF8)operator(\)) operator({) + ident(_args)operator([)integer(2)operator(]) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(u)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(new)delimiter(")>operator(,) ident(_args)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_reg_names + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(names)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(names)operator(()operator(\)) operator({) + keyword(if) operator(()ident(pattern)operator(.)ident(numberOfNames)operator(()operator(\)) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newEmptyArray)operator(()operator(\))operator(;) + + ident(RubyArray) ident(ary) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(pattern)operator(.)ident(numberOfNames)operator(()operator(\))operator(\))operator(;) + keyword(for) operator(()type(Iterator)operator(<)ident(NameEntry)operator(>) ident(i) operator(=) ident(pattern)operator(.)ident(namedBackrefIterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(NameEntry) ident(e) operator(=) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + ident(ary)operator(.)ident(append)operator(()ident(RubyString)operator(.)ident(newStringShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(e)operator(.)ident(name)operator(,) ident(e)operator(.)ident(nameP)operator(,) ident(e)operator(.)ident(nameEnd) operator(-) ident(e)operator(.)ident(nameP)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(ary)operator(;) + operator(}) + + comment(/** rb_reg_named_captures + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(named_captures)delimiter(")>operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(named_captures)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyHash) ident(hash) operator(=) ident(RubyHash)operator(.)ident(newHash)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(pattern)operator(.)ident(numberOfNames)operator(()operator(\)) operator(==) integer(0)operator(\)) keyword(return) ident(hash)operator(;) + + keyword(for) operator(()type(Iterator)operator(<)ident(NameEntry)operator(>) ident(i) operator(=) ident(pattern)operator(.)ident(namedBackrefIterator)operator(()operator(\))operator(;) ident(i)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(NameEntry) ident(e) operator(=) ident(i)operator(.)ident(next)operator(()operator(\))operator(;) + type(int)type([])ident(backrefs) operator(=) ident(e)operator(.)ident(getBackRefs)operator(()operator(\))operator(;) + ident(RubyArray) ident(ary) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(backrefs)operator(.)ident(length)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(backref) operator(:) ident(backrefs)operator(\)) ident(ary)operator(.)ident(append)operator(()ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(backref)operator(\))operator(\))operator(;) + ident(hash)operator(.)ident(fastASet)operator(()ident(RubyString)operator(.)ident(newStringShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(e)operator(.)ident(name)operator(,) ident(e)operator(.)ident(nameP)operator(,) ident(e)operator(.)ident(nameEnd) operator(-) ident(e)operator(.)ident(nameP)operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(,) ident(ary)operator(\))operator(;) + operator(}) + keyword(return) ident(hash)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyRegexp) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(RubyRegexp) ident(result) operator(=) ident(newRegexp)operator(()ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(input)operator(.)ident(unmarshalString)operator(()operator(\))operator(,) ident(input)operator(.)ident(unmarshalInt)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(marshalTo)operator(()ident(RubyRegexp) ident(regexp)operator(,) ident(MarshalStream) ident(output)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(output)operator(.)ident(registerLinkTarget)operator(()ident(regexp)operator(\))operator(;) + ident(output)operator(.)ident(writeString)operator(()keyword(new) type(String)operator(()ident(regexp)operator(.)ident(str)operator(.)ident(bytes)operator(,)ident(regexp)operator(.)ident(str)operator(.)ident(begin)operator(,)ident(regexp)operator(.)ident(str)operator(.)ident(realSize)operator(\))operator(\))operator(;) + ident(output)operator(.)ident(writeInt)operator(()ident(regexp)operator(.)ident(pattern)operator(.)ident(getOptions)operator(()operator(\)) operator(&) ident(EMBEDDABLE)operator(\))operator(;) + operator(}) +operator(}) + +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * + * @author nicksieger + */) +directive(public) type(interface) ident(RubyRuntimeAdapter) operator({) + ident(IRubyObject) ident(eval)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(script)operator(\))operator(;) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.CallType)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +keyword(import) include(org.jruby.util.SignalFacade)operator(;) +keyword(import) include(org.jruby.util.NoFunctionalitySignalFacade)operator(;) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Signal)delimiter(")>operator(\)) +directive(public) type(class) class(RubySignal) operator({) + directive(private) directive(final) directive(static) ident(SignalFacade) ident(SIGNALS) operator(=) ident(getSignalFacade)operator(()operator(\))operator(;) + + directive(private) directive(final) directive(static) ident(SignalFacade) ident(getSignalFacade)operator(()operator(\)) operator({) + keyword(try) operator({) + type(Class) ident(realFacadeClass) operator(=) type(Class)operator(.)ident(forName)operator(()string<delimiter(")content(org.jruby.util.SunSignalFacade)delimiter(")>operator(\))operator(;) + keyword(return) operator(()ident(SignalFacade)operator(\))ident(realFacadeClass)operator(.)ident(newInstance)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()type(Throwable) ident(e)operator(\)) operator({) + keyword(return) keyword(new) ident(NoFunctionalitySignalFacade)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(// NOTE: The indicies here match exactly the signal values; do not reorder) + directive(public) directive(static) directive(final) type(String)type([]) ident(NAMES) operator(=) operator({) + string<delimiter(")content(EXIT)delimiter(")>operator(,) string<delimiter(")content(HUP)delimiter(")>operator(,) string<delimiter(")content(INT)delimiter(")>operator(,) string<delimiter(")content(QUIT)delimiter(")>operator(,) string<delimiter(")content(ILL)delimiter(")>operator(,) string<delimiter(")content(TRAP)delimiter(")>operator(,) string<delimiter(")content(ABRT)delimiter(")>operator(,) string<delimiter(")content(EMT)delimiter(")>operator(,) + string<delimiter(")content(FPE)delimiter(")>operator(,) string<delimiter(")content(KILL)delimiter(")>operator(,) string<delimiter(")content(BUS)delimiter(")>operator(,) string<delimiter(")content(SEGV)delimiter(")>operator(,) string<delimiter(")content(SYS)delimiter(")>operator(,) string<delimiter(")content(PIPE)delimiter(")>operator(,) string<delimiter(")content(ALRM)delimiter(")>operator(,) string<delimiter(")content(TERM)delimiter(")>operator(,) string<delimiter(")content(URG)delimiter(")>operator(,) + string<delimiter(")content(STOP)delimiter(")>operator(,) string<delimiter(")content(TSTP)delimiter(")>operator(,) string<delimiter(")content(CONT)delimiter(")>operator(,) string<delimiter(")content(CHLD)delimiter(")>operator(,) string<delimiter(")content(TTIN)delimiter(")>operator(,) string<delimiter(")content(TTOU)delimiter(")>operator(,) string<delimiter(")content(IO)delimiter(")>operator(,) string<delimiter(")content(XCPU)delimiter(")>operator(,) + string<delimiter(")content(XFSZ)delimiter(")>operator(,) string<delimiter(")content(VTALRM)delimiter(")>operator(,) string<delimiter(")content(PROF)delimiter(")>operator(,) string<delimiter(")content(WINCH)delimiter(")>operator(,) string<delimiter(")content(INFO)delimiter(")>operator(,) string<delimiter(")content(USR1)delimiter(")>operator(,) string<delimiter(")content(USR2)delimiter(")>operator(})operator(;) + + directive(public) directive(static) type(void) ident(createSignal)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(mSignal) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Signal)delimiter(")>operator(\))operator(;) + + ident(mSignal)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubySignal)operator(.)ident(class)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(trap)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(trap)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getLoadService)operator(()operator(\))operator(.)ident(require)operator(()string<delimiter(")content(jsignal)delimiter(")>operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getKernel)operator(()operator(\))operator(,) string<delimiter(")content(__jtrap)delimiter(")>operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(list)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(list)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyHash) ident(names) operator(=) ident(RubyHash)operator(.)ident(newHash)operator(()ident(runtime)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(NAMES)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(names)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newString)operator(()ident(NAMES)operator([)ident(i)operator(])operator(\))operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(i)operator(\))operator(\))operator(;) + operator(}) + comment(// IOT is also 6) + ident(names)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(IOT)delimiter(")>operator(\))operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()integer(6)operator(\))operator(\))operator(;) + comment(// CLD is also 20) + ident(names)operator(.)ident(op_aset)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(CLD)delimiter(")>operator(\))operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()integer(20)operator(\))operator(\))operator(;) + keyword(return) ident(names)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(__jtrap_kernel)delimiter(")>operator(,) ident(required) operator(=) integer(3)operator(,)ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(__jtrap_kernel)operator(()directive(final) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(,) ident(IRubyObject) ident(arg3)operator(\)) operator({) + keyword(return) ident(SIGNALS)operator(.)ident(trap)operator(()ident(recv)operator(,) ident(arg1)operator(,) ident(arg2)operator(,) ident(arg3)operator(\))operator(;) + operator(}) +operator(})comment(// RubySignal) +comment(/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2004 David Corbin <dcorbin@users.sourceforge.net> + * Copyright (C\) 2005 Tim Azzopardi <tim@tigerfive.com> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2006 Ola Bini <ola@ologix.com> + * Copyright (C\) 2007 Nick Sieger <nicksieger@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(static) include(org.jruby.anno.FrameField.BACKREF)operator(;) +keyword(import) include(static) include(org.jruby.anno.FrameField.LASTLINE)operator(;) + +keyword(import) include(java.io.UnsupportedEncodingException)operator(;) +keyword(import) include(java.util.Locale)operator(;) + +keyword(import) include(org.joni.Matcher)operator(;) +keyword(import) include(org.joni.Option)operator(;) +keyword(import) include(org.joni.Regex)operator(;) +keyword(import) include(org.joni.Region)operator(;) +keyword(import) include(org.joni.encoding.Encoding)operator(;) +keyword(import) include(org.joni.encoding.specific.ASCIIEncoding)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.java.MiniJava)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.Frame)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.Numeric)operator(;) +keyword(import) include(org.jruby.util.Pack)operator(;) +keyword(import) include(org.jruby.util.Sprintf)operator(;) +keyword(import) include(org.jruby.util.string.JavaCrypt)operator(;) + +comment(/** + * Implementation of Ruby String class + * + * Concurrency: no synchronization is required among readers, but + * all users must synchronize externally with writers. + * + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(String)delimiter(")>operator(,) ident(include)operator(=)operator({)string<delimiter(")content(Enumerable)delimiter(")>operator(,) string<delimiter(")content(Comparable)delimiter(")>operator(})operator(\)) +directive(public) type(class) class(RubyString) directive(extends) ident(RubyObject) operator({) + directive(private) directive(static) directive(final) ident(ASCIIEncoding) ident(ASCII) operator(=) ident(ASCIIEncoding)operator(.)ident(INSTANCE)operator(;) + + comment(// string doesn't share any resources) + directive(private) directive(static) directive(final) type(int) ident(SHARE_LEVEL_NONE) operator(=) integer(0)operator(;) + comment(// string has it's own ByteList, but it's pointing to a shared buffer (byte[]\)) + directive(private) directive(static) directive(final) type(int) ident(SHARE_LEVEL_BUFFER) operator(=) integer(1)operator(;) + comment(// string doesn't have it's own ByteList (values\)) + directive(private) directive(static) directive(final) type(int) ident(SHARE_LEVEL_BYTELIST) operator(=) integer(2)operator(;) + + directive(private) directive(volatile) type(int) ident(shareLevel) operator(=) ident(SHARE_LEVEL_NONE)operator(;) + + directive(private) ident(ByteList) ident(value)operator(;) + + directive(private) directive(static) ident(ObjectAllocator) ident(STRING_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createStringClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(stringClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(String)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(STRING_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setString)operator(()ident(stringClass)operator(\))operator(;) + ident(stringClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(STRING)operator(;) + ident(stringClass)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + annotation(@Override) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubyString)operator(;) + operator(}) + operator(})operator(;) + + ident(stringClass)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getComparable)operator(()operator(\))operator(\))operator(;) + ident(stringClass)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + ident(stringClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyString)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(stringClass)operator(;) + operator(}) + + comment(/** short circuit for String key comparison + * + */) + annotation(@Override) + directive(public) directive(final) type(boolean) ident(eql)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other)operator(.)ident(getMetaClass)operator(()operator(\)) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getString)operator(()operator(\))operator(\)) keyword(return) ident(value)operator(.)ident(equal)operator(()operator(()operator(()ident(RubyString)operator(\))ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + keyword(return) local_variable(super)operator(.)ident(eql)operator(()ident(other)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyString)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) type(CharSequence) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + ident(assert) ident(value) operator(!=) keyword(null)operator(;) + local_variable(this)operator(.)ident(value) operator(=) keyword(new) ident(ByteList)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(value)operator(\))operator(,) keyword(false)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyString)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) type(byte)type([]) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + ident(assert) ident(value) operator(!=) keyword(null)operator(;) + local_variable(this)operator(.)ident(value) operator(=) keyword(new) ident(ByteList)operator(()ident(value)operator(\))operator(;) + operator(}) + + directive(private) ident(RubyString)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) ident(ByteList) ident(value)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + ident(assert) ident(value) operator(!=) keyword(null)operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + operator(}) + + directive(private) ident(RubyString)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) ident(ByteList) ident(value)operator(,) type(boolean) ident(objectSpace)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(,) ident(objectSpace)operator(\))operator(;) + ident(assert) ident(value) operator(!=) keyword(null)operator(;) + local_variable(this)operator(.)ident(value) operator(=) ident(value)operator(;) + operator(}) + + + comment(/** Create a new String which uses the same Ruby runtime and the same + * class like this String. + * + * This method should be used to satisfy RCR #38. + * @deprecated + */) + directive(public) ident(RubyString) ident(newString)operator(()type(CharSequence) ident(s)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getType)operator(()operator(\))operator(,) ident(s)operator(\))operator(;) + operator(}) + + comment(/** Create a new String which uses the same Ruby runtime and the same + * class like this String. + * + * This method should be used to satisfy RCR #38. + * @deprecated + */) + directive(public) ident(RubyString) ident(newString)operator(()ident(ByteList) ident(s)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(s)operator(\))operator(;) + operator(}) + + comment(// Methods of the String class (rb_str_*\):) + + comment(/** rb_str_new2 + * + */) + directive(public) directive(static) ident(RubyString) ident(newString)operator(()ident(Ruby) ident(runtime)operator(,) type(CharSequence) ident(str)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) ident(str)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newEmptyString)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(newEmptyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newEmptyString)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(metaClass)operator(\)) operator({) + ident(RubyString) ident(empty) operator(=) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(metaClass)operator(,) ident(ByteList)operator(.)ident(EMPTY_BYTELIST)operator(\))operator(;) + ident(empty)operator(.)ident(shareLevel) operator(=) ident(SHARE_LEVEL_BYTELIST)operator(;) + keyword(return) ident(empty)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newUnicodeString)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(str)operator(\)) operator({) + keyword(try) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) keyword(new) ident(ByteList)operator(()ident(str)operator(.)ident(getBytes)operator(()string<delimiter(")content(UTF8)delimiter(")>operator(\))operator(,) keyword(false)operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(UnsupportedEncodingException) ident(uee)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) ident(str)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Deprecated) + directive(public) directive(static) ident(RubyString) ident(newString)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(clazz)operator(,) type(CharSequence) ident(str)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(clazz)operator(,) ident(str)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newString)operator(()ident(Ruby) ident(runtime)operator(,) type(byte)type([]) ident(bytes)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) ident(bytes)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newString)operator(()ident(Ruby) ident(runtime)operator(,) type(byte)type([]) ident(bytes)operator(,) type(int) ident(start)operator(,) type(int) ident(length)operator(\)) operator({) + type(byte)type([]) ident(copy) operator(=) keyword(new) type(byte)operator([)ident(length)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(bytes)operator(,) ident(start)operator(,) ident(copy)operator(,) integer(0)operator(,) ident(length)operator(\))operator(;) + keyword(return) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) keyword(new) ident(ByteList)operator(()ident(copy)operator(,) keyword(false)operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newString)operator(()ident(Ruby) ident(runtime)operator(,) ident(ByteList) ident(bytes)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) ident(bytes)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newStringLight)operator(()ident(Ruby) ident(runtime)operator(,) ident(ByteList) ident(bytes)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) ident(bytes)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newStringShared)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyString) ident(orig)operator(\)) operator({) + ident(orig)operator(.)ident(shareLevel) operator(=) ident(SHARE_LEVEL_BYTELIST)operator(;) + ident(RubyString) ident(str) operator(=) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) ident(orig)operator(.)ident(value)operator(\))operator(;) + ident(str)operator(.)ident(shareLevel) operator(=) ident(SHARE_LEVEL_BYTELIST)operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newStringShared)operator(()ident(Ruby) ident(runtime)operator(,) ident(ByteList) ident(bytes)operator(\)) operator({) + keyword(return) ident(newStringShared)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) ident(bytes)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newStringShared)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(clazz)operator(,) ident(ByteList) ident(bytes)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(clazz)operator(,) ident(bytes)operator(\))operator(;) + ident(str)operator(.)ident(shareLevel) operator(=) ident(SHARE_LEVEL_BYTELIST)operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(newStringShared)operator(()ident(Ruby) ident(runtime)operator(,) type(byte)type([]) ident(bytes)operator(,) type(int) ident(start)operator(,) type(int) ident(length)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(,) keyword(new) ident(ByteList)operator(()ident(bytes)operator(,) ident(start)operator(,) ident(length)operator(,) keyword(false)operator(\))operator(\))operator(;) + ident(str)operator(.)ident(shareLevel) operator(=) ident(SHARE_LEVEL_BUFFER)operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(STRING)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(Class) ident(getJavaClass)operator(()operator(\)) operator({) + keyword(return) type(String)operator(.)ident(class)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyString) ident(convertToString)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(String) ident(toString)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_dup + * + */) + annotation(@Deprecated) + directive(public) directive(final) ident(RubyString) ident(strDup)operator(()operator(\)) operator({) + keyword(return) ident(strDup)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(final) ident(RubyString) ident(strDup)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) ident(strDup)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Deprecated) + directive(final) ident(RubyString) ident(strDup)operator(()ident(RubyClass) ident(clazz)operator(\)) operator({) + keyword(return) ident(strDup)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(final) ident(RubyString) ident(strDup)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(clazz)operator(\)) operator({) + ident(shareLevel) operator(=) ident(SHARE_LEVEL_BYTELIST)operator(;) + ident(RubyString) ident(dup) operator(=) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(clazz)operator(,) ident(value)operator(\))operator(;) + ident(dup)operator(.)ident(shareLevel) operator(=) ident(SHARE_LEVEL_BYTELIST)operator(;) + + ident(dup)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(dup)operator(;) + operator(}) + + directive(public) directive(final) ident(RubyString) ident(makeShared)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(index)operator(,) type(int) ident(len)operator(\)) operator({) + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) operator({) + ident(RubyString) ident(s) operator(=) ident(newEmptyString)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + ident(s)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(s)operator(;) + operator(}) + + keyword(if) operator(()ident(shareLevel) operator(==) ident(SHARE_LEVEL_NONE)operator(\)) ident(shareLevel) operator(=) ident(SHARE_LEVEL_BUFFER)operator(;) + ident(RubyString) ident(shared) operator(=) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(value)operator(.)ident(makeShared)operator(()ident(index)operator(,) ident(len)operator(\))operator(\))operator(;) + ident(shared)operator(.)ident(shareLevel) operator(=) ident(SHARE_LEVEL_BUFFER)operator(;) + + ident(shared)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(shared)operator(;) + operator(}) + + directive(final) type(void) ident(modifyCheck)operator(()operator(\)) operator({) + keyword(if) operator(()operator(()ident(flags) operator(&) ident(FROZEN_F)operator(\)) operator(!=) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newFrozenError)operator(()string<delimiter(")content(string)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isTaint)operator(()operator(\)) operator(&&) ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't modify string)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(final) type(void) ident(modifyCheck)operator(()type(byte)type([]) ident(b)operator(,) type(int) ident(len)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(bytes) operator(!=) ident(b) operator(||) ident(value)operator(.)ident(realSize) operator(!=) ident(len)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRuntimeError)operator(()string<delimiter(")content(string modified)delimiter(")>operator(\))operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(frozenCheck)operator(()operator(\)) operator({) + keyword(if) operator(()ident(isFrozen)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRuntimeError)operator(()string<delimiter(")content(string frozen)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** rb_str_modify + * + */) + directive(public) directive(final) type(void) ident(modify)operator(()operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(shareLevel) operator(!=) ident(SHARE_LEVEL_NONE)operator(\)) operator({) + keyword(if) operator(()ident(shareLevel) operator(==) ident(SHARE_LEVEL_BYTELIST)operator(\)) operator({) + ident(value) operator(=) ident(value)operator(.)ident(dup)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(value)operator(.)ident(unshare)operator(()operator(\))operator(;) + operator(}) + ident(shareLevel) operator(=) ident(SHARE_LEVEL_NONE)operator(;) + operator(}) + + ident(value)operator(.)ident(invalidate)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_modify (with length bytes ensured\) + * + */) + directive(public) directive(final) type(void) ident(modify)operator(()type(int) ident(length)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(shareLevel) operator(!=) ident(SHARE_LEVEL_NONE)operator(\)) operator({) + keyword(if) operator(()ident(shareLevel) operator(==) ident(SHARE_LEVEL_BYTELIST)operator(\)) operator({) + ident(value) operator(=) ident(value)operator(.)ident(dup)operator(()ident(length)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(value)operator(.)ident(unshare)operator(()ident(length)operator(\))operator(;) + operator(}) + ident(shareLevel) operator(=) ident(SHARE_LEVEL_NONE)operator(;) + operator(}) keyword(else) operator({) + ident(value)operator(.)ident(ensure)operator(()ident(length)operator(\))operator(;) + operator(}) + + ident(value)operator(.)ident(invalidate)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(view)operator(()ident(ByteList) ident(bytes)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + + ident(value) operator(=) ident(bytes)operator(;) + ident(shareLevel) operator(=) ident(SHARE_LEVEL_NONE)operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(view)operator(()type(byte)type([])ident(bytes)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + + ident(value)operator(.)ident(replace)operator(()ident(bytes)operator(\))operator(;) + ident(shareLevel) operator(=) ident(SHARE_LEVEL_NONE)operator(;) + + ident(value)operator(.)ident(invalidate)operator(()operator(\))operator(;) + operator(}) + + directive(private) directive(final) type(void) ident(view)operator(()type(int) ident(index)operator(,) type(int) ident(len)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(shareLevel) operator(!=) ident(SHARE_LEVEL_NONE)operator(\)) operator({) + keyword(if) operator(()ident(shareLevel) operator(==) ident(SHARE_LEVEL_BYTELIST)operator(\)) operator({) + comment(// if len == 0 then shared empty) + ident(value) operator(=) ident(value)operator(.)ident(makeShared)operator(()ident(index)operator(,) ident(len)operator(\))operator(;) + ident(shareLevel) operator(=) ident(SHARE_LEVEL_BUFFER)operator(;) + operator(}) keyword(else) operator({) + ident(value)operator(.)ident(view)operator(()ident(index)operator(,) ident(len)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(value)operator(.)ident(view)operator(()ident(index)operator(,) ident(len)operator(\))operator(;) + comment(// FIXME this below is temporary, but its much safer for COW (it prevents not shared Strings with begin != 0\)) + comment(// this allows now e.g.: ByteList#set not to be begin aware) + ident(shareLevel) operator(=) ident(SHARE_LEVEL_BUFFER)operator(;) + operator(}) + + ident(value)operator(.)ident(invalidate)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(String) ident(bytesToString)operator(()type(byte)type([]) ident(bytes)operator(,) type(int) ident(beg)operator(,) type(int) ident(len)operator(\)) operator({) + keyword(return) keyword(new) type(String)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(bytes)operator(,) ident(beg)operator(,) ident(len)operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(String) ident(byteListToString)operator(()ident(ByteList) ident(bytes)operator(\)) operator({) + keyword(return) ident(bytesToString)operator(()ident(bytes)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(begin)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(String) ident(bytesToString)operator(()type(byte)type([]) ident(bytes)operator(\)) operator({) + keyword(return) ident(bytesToString)operator(()ident(bytes)operator(,) integer(0)operator(,) ident(bytes)operator(.)ident(length)operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(byte)type([]) ident(stringToBytes)operator(()type(String) ident(string)operator(\)) operator({) + keyword(return) ident(ByteList)operator(.)ident(plain)operator(()ident(string)operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(isDigit)operator(()type(int) ident(c)operator(\)) operator({) + keyword(return) ident(c) operator(>=) string<delimiter(')content(0)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(9)delimiter(')>operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(isUpper)operator(()type(int) ident(c)operator(\)) operator({) + keyword(return) ident(c) operator(>=) string<delimiter(')content(A)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(Z)delimiter(')>operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(isLower)operator(()type(int) ident(c)operator(\)) operator({) + keyword(return) ident(c) operator(>=) string<delimiter(')content(a)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(z)delimiter(')>operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(isLetter)operator(()type(int) ident(c)operator(\)) operator({) + keyword(return) ident(isUpper)operator(()ident(c)operator(\)) operator(||) ident(isLower)operator(()ident(c)operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(isAlnum)operator(()type(int) ident(c)operator(\)) operator({) + keyword(return) ident(isUpper)operator(()ident(c)operator(\)) operator(||) ident(isLower)operator(()ident(c)operator(\)) operator(||) ident(isDigit)operator(()ident(c)operator(\))operator(;) + operator(}) + + directive(public) directive(static) type(boolean) ident(isPrint)operator(()type(int) ident(c)operator(\)) operator({) + keyword(return) ident(c) operator(>=) hex(0x20) operator(&&) ident(c) operator(<=) hex(0x7E)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyString) ident(asString)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(checkStringType)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_s)delimiter(")>operator(,) string<delimiter(")content(to_str)delimiter(")>operator(})operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\)) operator(!=) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(strDup)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/* rb_str_cmp_m */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(op_cmp)operator(()operator(()ident(RubyString)operator(\))ident(other)operator(\))operator(\))operator(;) + operator(}) + + comment(// deal with case when "other" is not a string) + keyword(if) operator(()ident(other)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\)) operator(&&) ident(other)operator(.)ident(respondsTo)operator(()string<delimiter(")content(<=>)delimiter(")>operator(\))operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + + keyword(if) operator(()ident(result) keyword(instanceof) ident(RubyNumeric)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyNumeric)operator(\)) ident(result)operator(\))operator(.)ident(op_uminus)operator(()ident(context)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + keyword(if) operator(()operator(!)ident(other)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_str)delimiter(")>operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + + keyword(return) ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(EQUALEQUAL)operator(,) string<delimiter(")content(==)delimiter(")>operator(,) local_variable(this)operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(value)operator(.)ident(equal)operator(()operator(()operator(()ident(RubyString)operator(\))ident(other)operator(\))operator(.)ident(value)operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_plus)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(other)operator(.)ident(convertToString)operator(()operator(\))operator(;) + + ident(ByteList) ident(result) operator(=) keyword(new) ident(ByteList)operator(()ident(value)operator(.)ident(realSize) operator(+) ident(str)operator(.)ident(value)operator(.)ident(realSize)operator(\))operator(;) + ident(result)operator(.)ident(realSize) operator(=) ident(value)operator(.)ident(realSize) operator(+) ident(str)operator(.)ident(value)operator(.)ident(realSize)operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin)operator(,) ident(result)operator(.)ident(bytes)operator(,) integer(0)operator(,) ident(value)operator(.)ident(realSize)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(str)operator(.)ident(value)operator(.)ident(bytes)operator(,) ident(str)operator(.)ident(value)operator(.)ident(begin)operator(,) ident(result)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(realSize)operator(,) ident(str)operator(.)ident(value)operator(.)ident(realSize)operator(\))operator(;) + + ident(RubyString) ident(resultStr) operator(=) ident(newString)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(result)operator(\))operator(;) + keyword(if) operator(()ident(isTaint)operator(()operator(\)) operator(||) ident(str)operator(.)ident(isTaint)operator(()operator(\))operator(\)) ident(resultStr)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + keyword(return) ident(resultStr)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(*)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_mul)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(RubyInteger) ident(otherInteger) operator(=) operator(()ident(RubyInteger)operator(\)) ident(other)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + type(long) ident(len) operator(=) ident(otherInteger)operator(.)ident(getLongValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative argument)delimiter(")>operator(\))operator(;) + + comment(// we limit to int because ByteBuffer can only allocate int sizes) + keyword(if) operator(()ident(len) operator(>) integer(0) operator(&&) type(Integer)operator(.)ident(MAX_VALUE) operator(/) ident(len) operator(<) ident(value)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(argument too big)delimiter(")>operator(\))operator(;) + operator(}) + ident(ByteList) ident(newBytes) operator(=) keyword(new) ident(ByteList)operator(()ident(value)operator(.)ident(length)operator(()operator(\)) operator(*) operator(()type(int)operator(\))ident(len)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(newBytes)operator(.)ident(append)operator(()ident(value)operator(\))operator(;) + operator(}) + + ident(RubyString) ident(newString) operator(=) keyword(new) ident(RubyString)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(newBytes)operator(\))operator(;) + ident(newString)operator(.)ident(setTaint)operator(()ident(isTaint)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(newString)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(%)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_format)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + directive(final) ident(RubyString) ident(s)operator(;) + + ident(IRubyObject) ident(tmp) operator(=) ident(arg)operator(.)ident(checkArrayType)operator(()operator(\))operator(;) + keyword(if) operator(()ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(tmp) operator(=) ident(arg)operator(;) + operator(}) + + comment(// FIXME: Should we make this work with platform's locale,) + comment(// or continue hardcoding US?) + ident(s) operator(=) ident(Sprintf)operator(.)ident(sprintf)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) type(Locale)operator(.)ident(US)operator(,) ident(value)operator(,) ident(tmp)operator(\))operator(;) + + ident(s)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(s)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(.)ident(hashCode)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(hashCode)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(hashCode)operator(()operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(equals)operator(()type(Object) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) keyword(true)operator(;) + + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(RubyString) ident(string) operator(=) operator(()ident(RubyString)operator(\)) ident(other)operator(;) + + keyword(if) operator(()ident(string)operator(.)ident(value)operator(.)ident(equal)operator(()ident(value)operator(\))operator(\)) keyword(return) keyword(true)operator(;) + operator(}) + + keyword(return) keyword(false)operator(;) + operator(}) + + comment(/** rb_obj_as_string + * + */) + directive(public) directive(static) ident(RubyString) ident(objAsString)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()ident(obj) keyword(instanceof) ident(RubyString)operator(\)) keyword(return) operator(()ident(RubyString)operator(\)) ident(obj)operator(;) + + ident(IRubyObject) ident(str) operator(=) ident(obj)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_S)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()operator(!)operator(()ident(str) keyword(instanceof) ident(RubyString)operator(\))operator(\)) keyword(return) operator(()ident(RubyString)operator(\)) ident(obj)operator(.)ident(anyToString)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(obj)operator(.)ident(isTaint)operator(()operator(\))operator(\)) ident(str)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + + keyword(return) operator(()ident(RubyString)operator(\)) ident(str)operator(;) + operator(}) + + comment(/** rb_str_cmp + * + */) + directive(public) type(int) ident(op_cmp)operator(()ident(RubyString) ident(other)operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(cmp)operator(()ident(other)operator(.)ident(value)operator(\))operator(;) + operator(}) + + comment(/** rb_to_id + * + */) + annotation(@Override) + directive(public) type(String) ident(asJavaString)operator(()operator(\)) operator({) + comment(// TODO: This used to intern; but it didn't appear to change anything) + comment(// turning that off, and it's unclear if it was needed. Plus, we intern) + comment(// ) + keyword(return) ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(doClone)operator(()operator(\))operator({) + keyword(return) ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(dup)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(RubyString) ident(cat)operator(()type(byte)type([]) ident(str)operator(\)) operator({) + ident(modify)operator(()ident(value)operator(.)ident(realSize) operator(+) ident(str)operator(.)ident(length)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(str)operator(,) integer(0)operator(,) ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(,) ident(str)operator(.)ident(length)operator(\))operator(;) + ident(value)operator(.)ident(realSize) operator(+=) ident(str)operator(.)ident(length)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) ident(RubyString) ident(cat)operator(()type(byte)type([]) ident(str)operator(,) type(int) ident(beg)operator(,) type(int) ident(len)operator(\)) operator({) + ident(modify)operator(()ident(value)operator(.)ident(realSize) operator(+) ident(len)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(str)operator(,) ident(beg)operator(,) ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(,) ident(len)operator(\))operator(;) + ident(value)operator(.)ident(realSize) operator(+=) ident(len)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) ident(RubyString) ident(cat)operator(()ident(ByteList) ident(str)operator(\)) operator({) + ident(modify)operator(()ident(value)operator(.)ident(realSize) operator(+) ident(str)operator(.)ident(realSize)operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(str)operator(.)ident(bytes)operator(,) ident(str)operator(.)ident(begin)operator(,) ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(,) ident(str)operator(.)ident(realSize)operator(\))operator(;) + ident(value)operator(.)ident(realSize) operator(+=) ident(str)operator(.)ident(realSize)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) ident(RubyString) ident(cat)operator(()type(byte) ident(ch)operator(\)) operator({) + ident(modify)operator(()ident(value)operator(.)ident(realSize) operator(+) integer(1)operator(\))operator(;) + ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(]) operator(=) ident(ch)operator(;) + ident(value)operator(.)ident(realSize)operator(++)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_str_replace_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(replace)delimiter(")>operator(,) string<delimiter(")content(initialize_copy)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyString) ident(replace)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) local_variable(this)operator(;) + + ident(modifyCheck)operator(()operator(\))operator(;) + + ident(RubyString) ident(otherStr) operator(=) ident(stringValue)operator(()ident(other)operator(\))operator(;) + + ident(otherStr)operator(.)ident(shareLevel) operator(=) ident(shareLevel) operator(=) ident(SHARE_LEVEL_BYTELIST)operator(;) + + ident(value) operator(=) ident(otherStr)operator(.)ident(value)operator(;) + + ident(infectBy)operator(()ident(other)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reverse)delimiter(")>operator(\)) + directive(public) ident(RubyString) ident(reverse)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(length)operator(()operator(\)) operator(<=) integer(1)operator(\)) keyword(return) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + ident(ByteList) ident(buf) operator(=) keyword(new) ident(ByteList)operator(()ident(value)operator(.)ident(length)operator(()operator(\))operator(+)integer(2)operator(\))operator(;) + ident(buf)operator(.)ident(realSize) operator(=) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) + type(int) ident(src) operator(=) ident(value)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(;) + type(int) ident(dst) operator(=) integer(0)operator(;) + + keyword(while) operator(()ident(src) operator(>=) integer(0)operator(\)) ident(buf)operator(.)ident(set)operator(()ident(dst)operator(++)operator(,) ident(value)operator(.)ident(get)operator(()ident(src)operator(--)operator(\))operator(\))operator(;) + + ident(RubyString) ident(rev) operator(=) keyword(new) ident(RubyString)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(buf)operator(\))operator(;) + ident(rev)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(rev)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reverse!)delimiter(")>operator(\)) + directive(public) ident(RubyString) ident(reverse_bang)operator(()operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(length)operator(()operator(\)) operator(>) integer(1)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) operator(()ident(value)operator(.)ident(length)operator(()operator(\)) operator(/) integer(2)operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + type(byte) ident(b) operator(=) operator(()type(byte)operator(\)) ident(value)operator(.)ident(get)operator(()ident(i)operator(\))operator(;) + + ident(value)operator(.)ident(set)operator(()ident(i)operator(,) ident(value)operator(.)ident(get)operator(()ident(value)operator(.)ident(length)operator(()operator(\)) operator(-) ident(i) operator(-) integer(1)operator(\))operator(\))operator(;) + ident(value)operator(.)ident(set)operator(()ident(value)operator(.)ident(length)operator(()operator(\)) operator(-) ident(i) operator(-) integer(1)operator(,) ident(b)operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_str_s_new + * + */) + directive(public) directive(static) ident(RubyString) ident(newInstance)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(newString) operator(=) ident(newStringShared)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(ByteList)operator(.)ident(EMPTY_BYTELIST)operator(\))operator(;) + ident(newString)operator(.)ident(setMetaClass)operator(()operator(()ident(RubyClass)operator(\)) ident(recv)operator(\))operator(;) + ident(newString)operator(.)ident(callInit)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(newString)operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with zero or one arguments + */) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(return) local_variable(this)operator(;) + keyword(case) integer(1)operator(:) + keyword(return) ident(initialize)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + ident(replace)operator(()ident(arg0)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(casecmp)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + type(int) ident(compare) operator(=) ident(value)operator(.)ident(caseInsensitiveCmp)operator(()ident(stringValue)operator(()ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(compare)operator(\))operator(;) + operator(}) + + comment(/** rb_str_match + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(=~)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_match)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyRegexp)operator(\)) keyword(return) operator(()operator(()ident(RubyRegexp)operator(\)) ident(other)operator(\))operator(.)ident(op_match)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(type mismatch: String given)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(other)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(=~)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** rb_str_match2 + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(~)delimiter(")>operator(,) ident(reads) operator(=) operator({)ident(LASTLINE)operator(,) ident(BACKREF)operator(})operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(op_match2)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(,) integer(0)operator(,) keyword(false)operator(\))operator(.)ident(op_match2)operator(()ident(context)operator(\))operator(;) + operator(}) + + comment(/** + * String#match(pattern\) + * + * rb_str_match_m + * + * @param pattern Regexp or String + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(match)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(pattern)operator(\)) operator({) + keyword(return) ident(getPattern)operator(()ident(pattern)operator(,) keyword(false)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(match)delimiter(")>operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** rb_str_capitalize + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(capitalize)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(capitalize_bang)operator(()ident(context)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_capitalize_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(capitalize!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(capitalize_bang)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + type(int) ident(s) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(send) operator(=) ident(s) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(byte)type([])ident(buf) operator(=) ident(value)operator(.)ident(bytes)operator(;) + + + + type(boolean) ident(modify) operator(=) keyword(false)operator(;) + + type(int) ident(c) operator(=) ident(buf)operator([)ident(s)operator(]) operator(&) hex(0xff)operator(;) + keyword(if) operator(()ident(ASCII)operator(.)ident(isLower)operator(()ident(c)operator(\))operator(\)) operator({) + ident(buf)operator([)ident(s)operator(]) operator(=) operator(()type(byte)operator(\))ident(ASCIIEncoding)operator(.)ident(asciiToUpper)operator(()ident(c)operator(\))operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) + + keyword(while) operator(()operator(++)ident(s) operator(<) ident(send)operator(\)) operator({) + ident(c) operator(=) operator(()type(char)operator(\))operator(()ident(buf)operator([)ident(s)operator(]) operator(&) hex(0xff)operator(\))operator(;) + keyword(if) operator(()ident(ASCII)operator(.)ident(isUpper)operator(()ident(c)operator(\))operator(\)) operator({) + ident(buf)operator([)ident(s)operator(]) operator(=) operator(()type(byte)operator(\))ident(ASCIIEncoding)operator(.)ident(asciiToLower)operator(()ident(c)operator(\))operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(modify)operator(\)) keyword(return) local_variable(this)operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>=)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_ge)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(op_cmp)operator(()operator(()ident(RubyString)operator(\)) ident(other)operator(\)) operator(>=) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyComparable)operator(.)ident(op_ge)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_gt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(op_cmp)operator(()operator(()ident(RubyString)operator(\)) ident(other)operator(\)) operator(>) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyComparable)operator(.)ident(op_gt)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_le)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(op_cmp)operator(()operator(()ident(RubyString)operator(\)) ident(other)operator(\)) operator(<=) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyComparable)operator(.)ident(op_le)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(op_lt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(op_cmp)operator(()operator(()ident(RubyString)operator(\)) ident(other)operator(\)) operator(<) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyComparable)operator(.)ident(op_lt)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eql?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(str_eql_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyString)operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + ident(RubyString) ident(otherString) operator(=) operator(()ident(RubyString)operator(\))ident(other)operator(;) + keyword(return) ident(value)operator(.)ident(equal)operator(()ident(otherString)operator(.)ident(value)operator(\)) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_upcase + * + */) + annotation(@JRubyMethod) + directive(public) ident(RubyString) ident(upcase)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(upcase_bang)operator(()ident(context)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_upcase_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(upcase!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(upcase_bang)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + type(int) ident(s) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(send) operator(=) ident(s) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(byte) type([])ident(buf) operator(=) ident(value)operator(.)ident(bytes)operator(;) + + type(boolean) ident(modify) operator(=) keyword(false)operator(;) + keyword(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + type(int) ident(c) operator(=) ident(buf)operator([)ident(s)operator(]) operator(&) hex(0xff)operator(;) + keyword(if) operator(()ident(ASCII)operator(.)ident(isLower)operator(()ident(c)operator(\))operator(\)) operator({) + ident(buf)operator([)ident(s)operator(]) operator(=) operator(()type(byte)operator(\))ident(ASCIIEncoding)operator(.)ident(asciiToUpper)operator(()ident(c)operator(\))operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) + ident(s)operator(++)operator(;) + operator(}) + + keyword(if) operator(()ident(modify)operator(\)) keyword(return) local_variable(this)operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_downcase + * + */) + annotation(@JRubyMethod) + directive(public) ident(RubyString) ident(downcase)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(downcase_bang)operator(()ident(context)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_downcase_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(downcase!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(downcase_bang)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + type(int) ident(s) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(send) operator(=) ident(s) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(byte) type([])ident(buf) operator(=) ident(value)operator(.)ident(bytes)operator(;) + + type(boolean) ident(modify) operator(=) keyword(false)operator(;) + keyword(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + type(int) ident(c) operator(=) ident(buf)operator([)ident(s)operator(]) operator(&) hex(0xff)operator(;) + keyword(if) operator(()ident(ASCII)operator(.)ident(isUpper)operator(()ident(c)operator(\))operator(\)) operator({) + ident(buf)operator([)ident(s)operator(]) operator(=) operator(()type(byte)operator(\))ident(ASCIIEncoding)operator(.)ident(asciiToLower)operator(()ident(c)operator(\))operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) + ident(s)operator(++)operator(;) + operator(}) + + keyword(if) operator(()ident(modify)operator(\)) keyword(return) local_variable(this)operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_swapcase + * + */) + annotation(@JRubyMethod) + directive(public) ident(RubyString) ident(swapcase)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(swapcase_bang)operator(()ident(context)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_swapcase_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(swapcase!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(swapcase_bang)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + type(int) ident(s) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(send) operator(=) ident(s) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(byte)type([])ident(buf) operator(=) ident(value)operator(.)ident(bytes)operator(;) + + type(boolean) ident(modify) operator(=) keyword(false)operator(;) + keyword(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + type(int) ident(c) operator(=) ident(buf)operator([)ident(s)operator(]) operator(&) hex(0xff)operator(;) + keyword(if) operator(()ident(ASCII)operator(.)ident(isUpper)operator(()ident(c)operator(\))operator(\)) operator({) + ident(buf)operator([)ident(s)operator(]) operator(=) operator(()type(byte)operator(\))ident(ASCIIEncoding)operator(.)ident(asciiToLower)operator(()ident(c)operator(\))operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(ASCII)operator(.)ident(isLower)operator(()ident(c)operator(\))operator(\)) operator({) + ident(buf)operator([)ident(s)operator(]) operator(=) operator(()type(byte)operator(\))ident(ASCIIEncoding)operator(.)ident(asciiToUpper)operator(()ident(c)operator(\))operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) + ident(s)operator(++)operator(;) + operator(}) + + keyword(if) operator(()ident(modify)operator(\)) keyword(return) local_variable(this)operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_dump + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(dump)operator(()operator(\)) operator({) + ident(RubyString) ident(s) operator(=) keyword(new) ident(RubyString)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(inspectIntoByteList)operator(()keyword(true)operator(\))operator(\))operator(;) + ident(s)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(s)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(insert)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(indexArg)operator(,) ident(IRubyObject) ident(stringArg)operator(\)) operator({) + comment(// MRI behavior: first check for ability to convert to String...) + ident(RubyString) ident(s) operator(=) operator(()ident(RubyString)operator(\))ident(stringArg)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(ByteList) ident(insert) operator(=) ident(s)operator(.)ident(value)operator(;) + + comment(// ... and then the index) + type(int) ident(index) operator(=) operator(()type(int)operator(\)) ident(indexArg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(index) operator(<) integer(0)operator(\)) ident(index) operator(+=) ident(value)operator(.)ident(length)operator(()operator(\)) operator(+) integer(1)operator(;) + + keyword(if) operator(()ident(index) operator(<) integer(0) operator(||) ident(index) operator(>) ident(value)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(index) operator(+) string<delimiter(")content( out of range)delimiter(")>operator(\))operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + ident(value)operator(.)ident(unsafeReplace)operator(()ident(index)operator(,) integer(0)operator(,) ident(insert)operator(\))operator(;) + local_variable(this)operator(.)ident(infectBy)operator(()ident(s)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_str_inspect + * + */) + annotation(@JRubyMethod) + annotation(@Override) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + ident(RubyString) ident(s) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(inspectIntoByteList)operator(()keyword(false)operator(\))operator(\))operator(;) + ident(s)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(s)operator(;) + operator(}) + + directive(private) ident(ByteList) ident(inspectIntoByteList)operator(()type(boolean) ident(ignoreKCode)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(Encoding) ident(enc) operator(=) ident(runtime)operator(.)ident(getKCode)operator(()operator(\))operator(.)ident(getEncoding)operator(()operator(\))operator(;) + directive(final) type(int) ident(length) operator(=) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) + ident(ByteList) ident(sb) operator(=) keyword(new) ident(ByteList)operator(()ident(length) operator(+) integer(2) operator(+) ident(length) operator(/) integer(100)operator(\))operator(;) + + ident(sb)operator(.)ident(append)operator(()string<delimiter(')content(\\")delimiter(')>operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + type(int) ident(c) operator(=) ident(value)operator(.)ident(get)operator(()ident(i)operator(\)) operator(&) hex(0xFF)operator(;) + + keyword(if) operator(()operator(!)ident(ignoreKCode)operator(\)) operator({) + type(int) ident(seqLength) operator(=) ident(enc)operator(.)ident(length)operator(()operator(()type(byte)operator(\))ident(c)operator(\))operator(;) + + keyword(if) operator(()ident(seqLength) operator(>) integer(1) operator(&&) operator(()ident(i) operator(+) ident(seqLength) operator(-)integer(1) operator(<) ident(length)operator(\))operator(\)) operator({) + comment(// don't escape multi-byte characters, leave them as bytes) + ident(sb)operator(.)ident(append)operator(()ident(value)operator(,) ident(i)operator(,) ident(seqLength)operator(\))operator(;) + ident(i) operator(+=) ident(seqLength) operator(-) integer(1)operator(;) + keyword(continue)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(isAlnum)operator(()ident(c)operator(\))operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()operator(()type(char)operator(\))ident(c)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\")delimiter(')> operator(||) ident(c) operator(==) string<delimiter(')char(\\\\)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()operator(()type(char)operator(\))ident(c)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(#)delimiter(')> operator(&&) ident(isEVStr)operator(()ident(i)operator(,) ident(length)operator(\))operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()operator(()type(char)operator(\))ident(c)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(isPrint)operator(()ident(c)operator(\))operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()operator(()type(char)operator(\))ident(c)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(n)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\r)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(r)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\t)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(t)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\f)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(f)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\u000B)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(v)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\u0007)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(a)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\u0008)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(b)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(c) operator(==) string<delimiter(')content(\\u001B)delimiter(')>operator(\)) operator({) + ident(sb)operator(.)ident(append)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content(e)delimiter(')>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(sb)operator(.)ident(append)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(Sprintf)operator(.)ident(sprintf)operator(()ident(runtime)operator(,)string<delimiter(")char(\\\\)content(%03o)delimiter(")>operator(,)ident(c)operator(\))operator(\))operator(\))operator(;) + operator(}) + operator(}) + + ident(sb)operator(.)ident(append)operator(()string<delimiter(')content(\\")delimiter(')>operator(\))operator(;) + keyword(return) ident(sb)operator(;) + operator(}) + + directive(private) type(boolean) ident(isEVStr)operator(()type(int) ident(i)operator(,) type(int) ident(length)operator(\)) operator({) + keyword(if) operator(()ident(i)operator(+)integer(1) operator(>=) ident(length)operator(\)) keyword(return) keyword(false)operator(;) + type(int) ident(c) operator(=) ident(value)operator(.)ident(get)operator(()ident(i)operator(+)integer(1)operator(\)) operator(&) hex(0xFF)operator(;) + + keyword(return) ident(c) operator(==) string<delimiter(')content($)delimiter(')> operator(||) ident(c) operator(==) string<delimiter(')content(@)delimiter(')> operator(||) ident(c) operator(==) string<delimiter(')content({)delimiter(')>operator(;) + operator(}) + + comment(/** rb_str_length + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(length)delimiter(")>operator(,) string<delimiter(")content(size)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyFixnum) ident(length)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_str_empty + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(empty?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(empty_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(isEmpty)operator(()operator(\)) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(isEmpty)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(;) + operator(}) + + comment(/** rb_str_append + * + */) + directive(public) ident(RubyString) ident(append)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + ident(infectBy)operator(()ident(other)operator(\))operator(;) + keyword(return) ident(cat)operator(()ident(stringValue)operator(()ident(other)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + + comment(/** rb_str_concat + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(concat)delimiter(")>operator(,) string<delimiter(")content(<<)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyString) ident(concat)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(long) ident(value) operator(=) operator(()operator(()ident(RubyFixnum)operator(\)) ident(other)operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(value) operator(>=) integer(0) operator(&&) ident(value) operator(<) integer(256)operator(\)) keyword(return) ident(cat)operator(()operator(()type(byte)operator(\)) ident(value)operator(\))operator(;) + operator(}) + keyword(return) ident(append)operator(()ident(other)operator(\))operator(;) + operator(}) + + comment(/** rb_str_crypt + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(crypt)delimiter(")>operator(\)) + directive(public) ident(RubyString) ident(crypt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + ident(ByteList) ident(salt) operator(=) ident(stringValue)operator(()ident(other)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(salt)operator(.)ident(realSize) operator(<) integer(2)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(salt too short(need >=2 bytes\))delimiter(")>operator(\))operator(;) + operator(}) + + ident(salt) operator(=) ident(salt)operator(.)ident(makeShared)operator(()integer(0)operator(,) integer(2)operator(\))operator(;) + ident(RubyString) ident(s) operator(=) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(JavaCrypt)operator(.)ident(crypt)operator(()ident(salt)operator(,) local_variable(this)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(\))operator(;) + ident(s)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + ident(s)operator(.)ident(infectBy)operator(()ident(other)operator(\))operator(;) + keyword(return) ident(s)operator(;) + operator(}) + + comment(/* RubyString aka rb_string_value */) + directive(public) directive(static) ident(RubyString) ident(stringValue)operator(()ident(IRubyObject) ident(object)operator(\)) operator({) + keyword(return) operator(()ident(RubyString)operator(\)) operator(()ident(object) keyword(instanceof) ident(RubyString) operator(?) ident(object) operator(:) + ident(object)operator(.)ident(convertToString)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two args. + */) + directive(public) ident(IRubyObject) ident(sub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_sub + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(sub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_sub + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(sub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(sub_bang)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two arguments. + */) + directive(public) ident(IRubyObject) ident(sub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(sub_bang)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(sub_bang)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_sub_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(sub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(RubyRegexp) ident(rubyRegex) operator(=) ident(getPattern)operator(()ident(arg0)operator(,) keyword(true)operator(\))operator(;) + ident(Regex) ident(regex) operator(=) ident(rubyRegex)operator(.)ident(getPattern)operator(()operator(\))operator(;) + keyword(return) ident(subBangCommon)operator(()ident(regex)operator(,) ident(context)operator(,) keyword(true)operator(,) ident(rubyRegex)operator(,) ident(block)operator(,) keyword(null)operator(,) keyword(false)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments (1 for 2\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/** rb_str_sub_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sub!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(sub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(repl) operator(=) ident(arg1)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(RubyRegexp) ident(rubyRegex) operator(=) ident(getPattern)operator(()ident(arg0)operator(,) keyword(true)operator(\))operator(;) + ident(Regex) ident(regex) operator(=) ident(rubyRegex)operator(.)ident(getPattern)operator(()operator(\))operator(;) + keyword(return) ident(subBangCommon)operator(()ident(regex)operator(,) ident(context)operator(,) keyword(false)operator(,) ident(rubyRegex)operator(,) ident(block)operator(,) ident(repl)operator(,) ident(repl)operator(.)ident(isTaint)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(subBangCommon)operator(()ident(Regex) ident(regex)operator(,) ident(ThreadContext) ident(context)operator(,) directive(final) type(boolean) ident(iter)operator(,) ident(RubyRegexp) ident(rubyRegex)operator(,) ident(Block) ident(block)operator(,) ident(RubyString) ident(repl)operator(,) type(boolean) ident(tainted)operator(\)) operator({) + + type(int) ident(range) operator(=) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(Matcher) ident(matcher) operator(=) ident(regex)operator(.)ident(matcher)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin)operator(,) ident(range)operator(\))operator(;) + + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(;) + keyword(if) operator(()ident(matcher)operator(.)ident(search)operator(()ident(value)operator(.)ident(begin)operator(,) ident(range)operator(,) type(Option)operator(.)ident(NONE)operator(\)) operator(>=) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(iter)operator(\)) operator({) + type(byte)type([]) ident(bytes) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(size) operator(=) ident(value)operator(.)ident(realSize)operator(;) + ident(RubyMatchData) ident(match) operator(=) ident(rubyRegex)operator(.)ident(updateBackRef)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(frame)operator(,) ident(matcher)operator(\))operator(;) + ident(match)operator(.)ident(use)operator(()operator(\))operator(;) + keyword(if) operator(()ident(regex)operator(.)ident(numberOfCaptures)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(repl) operator(=) ident(objAsString)operator(()ident(context)operator(,) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(substr)operator(()ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(,) ident(matcher)operator(.)ident(getEnd)operator(()operator(\)) operator(-) ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + type(Region) ident(region) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) + ident(repl) operator(=) ident(objAsString)operator(()ident(context)operator(,) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(substr)operator(()ident(region)operator(.)ident(beg)operator([)integer(0)operator(])operator(,) ident(region)operator(.)ident(end)operator([)integer(0)operator(]) operator(-) ident(region)operator(.)ident(beg)operator([)integer(0)operator(])operator(\))operator(\))operator(\))operator(;) + operator(}) + ident(modifyCheck)operator(()ident(bytes)operator(,) ident(size)operator(\))operator(;) + ident(frozenCheck)operator(()operator(\))operator(;) + ident(frame)operator(.)ident(setBackRef)operator(()ident(match)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(repl) operator(=) ident(rubyRegex)operator(.)ident(regsub)operator(()ident(repl)operator(,) local_variable(this)operator(,) ident(matcher)operator(\))operator(;) + ident(rubyRegex)operator(.)ident(updateBackRef)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(frame)operator(,) ident(matcher)operator(\))operator(;) + operator(}) + + directive(final) type(int) ident(beg)operator(;) + directive(final) type(int) ident(plen)operator(;) + keyword(if) operator(()ident(regex)operator(.)ident(numberOfCaptures)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(beg) operator(=) ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(;) + ident(plen) operator(=) ident(matcher)operator(.)ident(getEnd)operator(()operator(\)) operator(-) ident(beg)operator(;) + operator(}) keyword(else) operator({) + type(Region) ident(region) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) + ident(beg) operator(=) ident(region)operator(.)ident(beg)operator([)integer(0)operator(])operator(;) + ident(plen) operator(=) ident(region)operator(.)ident(end)operator([)integer(0)operator(]) operator(-) ident(beg)operator(;) + operator(}) + + ident(ByteList) ident(replValue) operator(=) ident(repl)operator(.)ident(value)operator(;) + keyword(if) operator(()ident(replValue)operator(.)ident(realSize) operator(>) ident(plen)operator(\)) operator({) + ident(modify)operator(()ident(value)operator(.)ident(realSize) operator(+) ident(replValue)operator(.)ident(realSize) operator(-) ident(plen)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modify)operator(()operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(repl)operator(.)ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(tainted) operator(=) keyword(true)operator(;) + operator(}) + keyword(if) operator(()ident(replValue)operator(.)ident(realSize) operator(!=) ident(plen)operator(\)) operator({) + type(int) ident(src) operator(=) ident(value)operator(.)ident(begin) operator(+) ident(beg) operator(+) ident(plen)operator(;) + type(int) ident(dst) operator(=) ident(value)operator(.)ident(begin) operator(+) ident(beg) operator(+) ident(replValue)operator(.)ident(realSize)operator(;) + type(int) ident(length) operator(=) ident(value)operator(.)ident(realSize) operator(-) ident(beg) operator(-) ident(plen)operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(src)operator(,) ident(value)operator(.)ident(bytes)operator(,) ident(dst)operator(,) ident(length)operator(\))operator(;) + operator(}) + type(System)operator(.)ident(arraycopy)operator(()ident(replValue)operator(.)ident(bytes)operator(,) ident(replValue)operator(.)ident(begin)operator(,) ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(beg)operator(,) ident(replValue)operator(.)ident(realSize)operator(\))operator(;) + ident(value)operator(.)ident(realSize) operator(+=) ident(replValue)operator(.)ident(realSize) operator(-) ident(plen)operator(;) + keyword(if) operator(()ident(tainted)operator(\)) operator({) + ident(setTaint)operator(()keyword(true)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) keyword(else) operator({) + ident(frame)operator(.)ident(setBackRef)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two arguments. + */) + directive(public) ident(IRubyObject) ident(gsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(gsub)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(gsub)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_gsub + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gsub)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(gsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(gsub)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(block)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** rb_str_gsub + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gsub)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(gsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(gsub)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two arguments. + */) + directive(public) ident(IRubyObject) ident(gsub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(gsub_bang)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(gsub_bang)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(block)operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_gsub_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gsub!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(gsub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(gsub)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(block)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + comment(/** rb_str_gsub_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gsub!)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(gsub_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(gsub)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(block)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + directive(private) directive(final) ident(IRubyObject) ident(gsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(Block) ident(block)operator(,) directive(final) type(boolean) ident(bang)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(RubyRegexp) ident(rubyRegex) operator(=) ident(getPattern)operator(()ident(arg0)operator(,) keyword(true)operator(\))operator(;) + ident(Regex) ident(regex) operator(=) ident(rubyRegex)operator(.)ident(getPattern)operator(()operator(\))operator(;) + keyword(return) ident(gsubCommon)operator(()ident(regex)operator(,) ident(context)operator(,) ident(bang)operator(,) keyword(true)operator(,) ident(rubyRegex)operator(,) ident(block)operator(,) keyword(null)operator(,) keyword(false)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments (1 for 2\))delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(final) ident(IRubyObject) ident(gsub)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(Block) ident(block)operator(,) directive(final) type(boolean) ident(bang)operator(\)) operator({) + ident(IRubyObject) ident(repl) operator(=) ident(arg1)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(RubyRegexp) ident(rubyRegex) operator(=) ident(getPattern)operator(()ident(arg0)operator(,) keyword(true)operator(\))operator(;) + ident(Regex) ident(regex) operator(=) ident(rubyRegex)operator(.)ident(getPattern)operator(()operator(\))operator(;) + keyword(return) ident(gsubCommon)operator(()ident(regex)operator(,) ident(context)operator(,) ident(bang)operator(,) keyword(false)operator(,) ident(rubyRegex)operator(,) ident(block)operator(,) ident(repl)operator(,) ident(repl)operator(.)ident(isTaint)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(gsubCommon)operator(()ident(Regex) ident(regex)operator(,) ident(ThreadContext) ident(context)operator(,) directive(final) type(boolean) ident(bang)operator(,) directive(final) type(boolean) ident(iter)operator(,) ident(RubyRegexp) ident(rubyRegex)operator(,) ident(Block) ident(block)operator(,) ident(IRubyObject) ident(repl)operator(,) type(boolean) ident(tainted)operator(\)) operator({) + + type(int) ident(begin) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(range) operator(=) ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(Matcher) ident(matcher) operator(=) ident(regex)operator(.)ident(matcher)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(begin)operator(,) ident(range)operator(\))operator(;) + + type(int) ident(beg) operator(=) ident(matcher)operator(.)ident(search)operator(()ident(begin)operator(,) ident(range)operator(,) type(Option)operator(.)ident(NONE)operator(\))operator(;) + + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(frame)operator(.)ident(setBackRef)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(bang) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) comment(/* bang: true, no match, no substitution */) + operator(}) + + type(int) ident(blen) operator(=) ident(value)operator(.)ident(realSize) operator(+) integer(30)operator(;) comment(/* len + margin */) + ident(ByteList) ident(dest) operator(=) keyword(new) ident(ByteList)operator(()ident(blen)operator(\))operator(;) + ident(dest)operator(.)ident(realSize) operator(=) ident(blen)operator(;) + type(int) ident(buf) operator(=) integer(0)operator(;) + type(int) ident(bp) operator(=) integer(0)operator(;) + type(int) ident(cp) operator(=) ident(value)operator(.)ident(begin)operator(;) + + type(int) ident(offset) operator(=) integer(0)operator(;) + ident(RubyString) ident(val)operator(;) + + ident(RubyMatchData) ident(match) operator(=) keyword(null)operator(;) + keyword(while) operator(()ident(beg) operator(>=) integer(0)operator(\)) operator({) + directive(final) type(int) ident(begz)operator(;) + directive(final) type(int) ident(endz)operator(;) + keyword(if) operator(()ident(iter)operator(\)) operator({) + type(byte)type([]) ident(bytes) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(size) operator(=) ident(value)operator(.)ident(realSize)operator(;) + ident(match) operator(=) ident(rubyRegex)operator(.)ident(updateBackRef)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(frame)operator(,) ident(matcher)operator(\))operator(;) + ident(match)operator(.)ident(use)operator(()operator(\))operator(;) + keyword(if) operator(()ident(regex)operator(.)ident(numberOfCaptures)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(begz) operator(=) ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(;) + ident(endz) operator(=) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(;) + ident(val) operator(=) ident(objAsString)operator(()ident(context)operator(,) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(substr)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(begz)operator(,) ident(endz) operator(-) ident(begz)operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + type(Region) ident(region) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) + ident(begz) operator(=) ident(region)operator(.)ident(beg)operator([)integer(0)operator(])operator(;) + ident(endz) operator(=) ident(region)operator(.)ident(end)operator([)integer(0)operator(])operator(;) + ident(val) operator(=) ident(objAsString)operator(()ident(context)operator(,) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(substr)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(begz)operator(,) ident(endz) operator(-) ident(begz)operator(\))operator(\))operator(\))operator(;) + operator(}) + ident(modifyCheck)operator(()ident(bytes)operator(,) ident(size)operator(\))operator(;) + keyword(if) operator(()ident(bang)operator(\)) operator({) + ident(frozenCheck)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(val) operator(=) ident(rubyRegex)operator(.)ident(regsub)operator(()operator(()ident(RubyString)operator(\)) ident(repl)operator(,) local_variable(this)operator(,) ident(matcher)operator(\))operator(;) + keyword(if) operator(()ident(regex)operator(.)ident(numberOfCaptures)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(begz) operator(=) ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(;) + ident(endz) operator(=) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + type(Region) ident(region) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) + ident(begz) operator(=) ident(region)operator(.)ident(beg)operator([)integer(0)operator(])operator(;) + ident(endz) operator(=) ident(region)operator(.)ident(end)operator([)integer(0)operator(])operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(val)operator(.)ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(tainted) operator(=) keyword(true)operator(;) + operator(}) + ident(ByteList) ident(vbuf) operator(=) ident(val)operator(.)ident(value)operator(;) + type(int) ident(len) operator(=) operator(()ident(bp) operator(-) ident(buf)operator(\)) operator(+) operator(()ident(beg) operator(-) ident(offset)operator(\)) operator(+) ident(vbuf)operator(.)ident(realSize) operator(+) integer(3)operator(;) + keyword(if) operator(()ident(blen) operator(<) ident(len)operator(\)) operator({) + keyword(while) operator(()ident(blen) operator(<) ident(len)operator(\)) operator({) + ident(blen) operator(<)operator(<=) integer(1)operator(;) + operator(}) + ident(len) operator(=) ident(bp) operator(-) ident(buf)operator(;) + ident(dest)operator(.)ident(realloc)operator(()ident(blen)operator(\))operator(;) + ident(dest)operator(.)ident(realSize) operator(=) ident(blen)operator(;) + ident(bp) operator(=) ident(buf) operator(+) ident(len)operator(;) + operator(}) + ident(len) operator(=) ident(beg) operator(-) ident(offset)operator(;) comment(/* copy pre-match substr */) + type(System)operator(.)ident(arraycopy)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(cp)operator(,) ident(dest)operator(.)ident(bytes)operator(,) ident(bp)operator(,) ident(len)operator(\))operator(;) + ident(bp) operator(+=) ident(len)operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(vbuf)operator(.)ident(bytes)operator(,) ident(vbuf)operator(.)ident(begin)operator(,) ident(dest)operator(.)ident(bytes)operator(,) ident(bp)operator(,) ident(vbuf)operator(.)ident(realSize)operator(\))operator(;) + ident(bp) operator(+=) ident(vbuf)operator(.)ident(realSize)operator(;) + ident(offset) operator(=) ident(endz)operator(;) + + keyword(if) operator(()ident(begz) operator(==) ident(endz)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(<=) ident(endz)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(len) operator(=) ident(regex)operator(.)ident(getEncoding)operator(()operator(\))operator(.)ident(length)operator(()ident(value)operator(.)ident(bytes)operator([)ident(begin) operator(+) ident(endz)operator(])operator(\))operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(begin) operator(+) ident(endz)operator(,) ident(dest)operator(.)ident(bytes)operator(,) ident(bp)operator(,) ident(len)operator(\))operator(;) + ident(bp) operator(+=) ident(len)operator(;) + ident(offset) operator(=) ident(endz) operator(+) ident(len)operator(;) + operator(}) + ident(cp) operator(=) ident(begin) operator(+) ident(offset)operator(;) + keyword(if) operator(()ident(offset) operator(>) ident(value)operator(.)ident(realSize)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(beg) operator(=) ident(matcher)operator(.)ident(search)operator(()ident(cp)operator(,) ident(range)operator(,) type(Option)operator(.)ident(NONE)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(>) ident(offset)operator(\)) operator({) + type(int) ident(len) operator(=) ident(bp) operator(-) ident(buf)operator(;) + keyword(if) operator(()ident(blen) operator(-) ident(len) operator(<) ident(value)operator(.)ident(realSize) operator(-) ident(offset)operator(\)) operator({) + ident(blen) operator(=) ident(len) operator(+) ident(value)operator(.)ident(realSize) operator(-) ident(offset)operator(;) + ident(dest)operator(.)ident(realloc)operator(()ident(blen)operator(\))operator(;) + ident(bp) operator(=) ident(buf) operator(+) ident(len)operator(;) + operator(}) + type(System)operator(.)ident(arraycopy)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(cp)operator(,) ident(dest)operator(.)ident(bytes)operator(,) ident(bp)operator(,) ident(value)operator(.)ident(realSize) operator(-) ident(offset)operator(\))operator(;) + ident(bp) operator(+=) ident(value)operator(.)ident(realSize) operator(-) ident(offset)operator(;) + operator(}) + + keyword(if) operator(()ident(match) operator(!=) keyword(null)operator(\)) operator({) + ident(frame)operator(.)ident(setBackRef)operator(()ident(match)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(rubyRegex)operator(.)ident(updateBackRef)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(frame)operator(,) ident(matcher)operator(\))operator(;) + operator(}) + + ident(dest)operator(.)ident(realSize) operator(=) ident(bp) operator(-) ident(buf)operator(;) + keyword(if) operator(()ident(bang)operator(\)) operator({) + ident(view)operator(()ident(dest)operator(\))operator(;) + keyword(if) operator(()ident(tainted)operator(\)) operator({) + ident(setTaint)operator(()keyword(true)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) keyword(else) operator({) + ident(RubyString) ident(destStr) operator(=) keyword(new) ident(RubyString)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(dest)operator(\))operator(;) + ident(destStr)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(if) operator(()ident(tainted)operator(\)) operator({) + ident(destStr)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + operator(}) + keyword(return) ident(destStr)operator(;) + operator(}) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two args. + */) + directive(public) ident(IRubyObject) ident(index)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(index)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(index)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_index_m + * + */) + annotation(@JRubyMethod)operator(()ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(index)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(indexCommon)operator(()integer(0)operator(,) ident(arg0)operator(,) ident(context)operator(\))operator(;) + operator(}) + + comment(/** rb_str_index_m + * + */) + annotation(@JRubyMethod)operator(()ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(index)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + type(int) ident(pos) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg1)operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(pos) operator(+=) ident(value)operator(.)ident(realSize)operator(;) + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setBackRef)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(indexCommon)operator(()ident(pos)operator(,) ident(arg0)operator(,) ident(context)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(indexCommon)operator(()type(int) ident(pos)operator(,) ident(IRubyObject) ident(sub)operator(,) ident(ThreadContext) ident(context)operator(\)) directive(throws) ident(RaiseException) operator({) + keyword(if) operator(()ident(sub) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + ident(RubyRegexp) ident(regSub) operator(=) operator(()ident(RubyRegexp)operator(\)) ident(sub)operator(;) + + ident(pos) operator(=) ident(regSub)operator(.)ident(adjustStartPos)operator(()local_variable(this)operator(,) ident(pos)operator(,) keyword(false)operator(\))operator(;) + ident(pos) operator(=) ident(regSub)operator(.)ident(search)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(pos)operator(,) keyword(false)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(sub) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(int) ident(c_int) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(sub)operator(\))operator(;) + keyword(if) operator(()ident(c_int) operator(<) hex(0x00) operator(||) ident(c_int) operator(>) hex(0xFF)operator(\)) operator({) + comment(// out of byte range) + comment(// there will be no match for sure) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + type(byte) ident(c) operator(=) operator(()type(byte)operator(\)) ident(c_int)operator(;) + type(byte)type([]) ident(bytes) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(end) operator(=) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(;) + + ident(pos) operator(+=) ident(value)operator(.)ident(begin)operator(;) + keyword(for) operator(()operator(;) ident(pos) operator(<) ident(end)operator(;) ident(pos)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(bytes)operator([)ident(pos)operator(]) operator(==) ident(c)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(pos) operator(-) ident(value)operator(.)ident(begin)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(sub) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(pos) operator(=) ident(strIndex)operator(()operator(()ident(RubyString)operator(\)) ident(sub)operator(,) ident(pos)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(sub)operator(.)ident(checkStringType)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(type mismatch: )delimiter(")> operator(+) ident(sub)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + operator(}) + ident(pos) operator(=) ident(strIndex)operator(()operator(()ident(RubyString)operator(\)) ident(tmp)operator(,) ident(pos)operator(\))operator(;) + operator(}) + + keyword(return) ident(pos) operator(==) operator(-)integer(1) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(pos)operator(\))operator(;) + operator(}) + + directive(private) type(int) ident(strIndex)operator(()ident(RubyString) ident(sub)operator(,) type(int) ident(offset)operator(\)) operator({) + keyword(if) operator(()ident(offset) operator(<) integer(0)operator(\)) operator({) + ident(offset) operator(+=) ident(value)operator(.)ident(realSize)operator(;) + keyword(if) operator(()ident(offset) operator(<) integer(0)operator(\)) keyword(return) operator(-)integer(1)operator(;) + operator(}) + + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(-) ident(offset) operator(<) ident(sub)operator(.)ident(value)operator(.)ident(realSize)operator(\)) keyword(return) operator(-)integer(1)operator(;) + keyword(if) operator(()ident(sub)operator(.)ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(offset)operator(;) + keyword(return) ident(value)operator(.)ident(indexOf)operator(()ident(sub)operator(.)ident(value)operator(,) ident(offset)operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two arguments. + */) + directive(public) ident(IRubyObject) ident(rindex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(rindex)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(rindex)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_rindex_m + * + */) + annotation(@JRubyMethod)operator(()ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(rindex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(rindexCommon)operator(()ident(arg0)operator(,) ident(value)operator(.)ident(realSize)operator(,) ident(context)operator(\))operator(;) + operator(}) + + comment(/** rb_str_rindex_m + * + */) + annotation(@JRubyMethod)operator(()ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(rindex)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + type(int) ident(pos) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg1)operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + ident(pos) operator(+=) ident(value)operator(.)ident(realSize)operator(;) + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(.)ident(setBackRef)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(pos) operator(>) ident(value)operator(.)ident(realSize)operator(\)) ident(pos) operator(=) ident(value)operator(.)ident(realSize)operator(;) + + keyword(return) ident(rindexCommon)operator(()ident(arg0)operator(,) ident(pos)operator(,) ident(context)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(rindexCommon)operator(()directive(final) ident(IRubyObject) ident(sub)operator(,) type(int) ident(pos)operator(,) ident(ThreadContext) ident(context)operator(\)) directive(throws) ident(RaiseException) operator({) + + keyword(if) operator(()ident(sub) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + ident(RubyRegexp) ident(regSub) operator(=) operator(()ident(RubyRegexp)operator(\)) ident(sub)operator(;) + keyword(if) operator(()ident(regSub)operator(.)ident(length)operator(()operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(pos) operator(=) ident(regSub)operator(.)ident(adjustStartPos)operator(()local_variable(this)operator(,) ident(pos)operator(,) keyword(true)operator(\))operator(;) + ident(pos) operator(=) ident(regSub)operator(.)ident(search)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(pos)operator(,) keyword(true)operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(pos) operator(>=) integer(0)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(pos)operator(\))operator(;) + operator(}) + operator(}) keyword(else) keyword(if) operator(()ident(sub) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(pos) operator(=) ident(strRindex)operator(()operator(()ident(RubyString)operator(\)) ident(sub)operator(,) ident(pos)operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>=) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(pos)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(sub) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(int) ident(c_int) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(sub)operator(\))operator(;) + keyword(if) operator(()ident(c_int) operator(<) hex(0x00) operator(||) ident(c_int) operator(>) hex(0xFF)operator(\)) operator({) + comment(// out of byte range) + comment(// there will be no match for sure) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + type(byte) ident(c) operator(=) operator(()type(byte)operator(\)) ident(c_int)operator(;) + + type(byte)type([]) ident(bytes) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(pbeg) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(p) operator(=) ident(pbeg) operator(+) ident(pos)operator(;) + + keyword(if) operator(()ident(pos) operator(==) ident(value)operator(.)ident(realSize)operator(\)) operator({) + keyword(if) operator(()ident(pos) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(--)ident(p)operator(;) + operator(}) + keyword(while) operator(()ident(pbeg) operator(<=) ident(p)operator(\)) operator({) + keyword(if) operator(()ident(bytes)operator([)ident(p)operator(]) operator(==) ident(c)operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(p) operator(-) ident(value)operator(.)ident(begin)operator(\))operator(;) + operator(}) + ident(p)operator(--)operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(sub)operator(.)ident(checkStringType)operator(()operator(\))operator(;) + keyword(if) operator(()ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(type mismatch: )delimiter(")> operator(+) ident(sub)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + ident(pos) operator(=) ident(strRindex)operator(()operator(()ident(RubyString)operator(\)) ident(tmp)operator(,) ident(pos)operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>=) integer(0)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(pos)operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(int) ident(strRindex)operator(()ident(RubyString) ident(sub)operator(,) type(int) ident(pos)operator(\)) operator({) + type(int) ident(subLength) operator(=) ident(sub)operator(.)ident(value)operator(.)ident(realSize)operator(;) + + comment(/* substring longer than string */) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(<) ident(subLength)operator(\)) keyword(return) operator(-)integer(1)operator(;) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(-) ident(pos) operator(<) ident(subLength)operator(\)) ident(pos) operator(=) ident(value)operator(.)ident(realSize) operator(-) ident(subLength)operator(;) + + keyword(return) ident(value)operator(.)ident(lastIndexOf)operator(()ident(sub)operator(.)ident(value)operator(,) ident(pos)operator(\))operator(;) + operator(}) + + comment(/* rb_str_substr */) + directive(public) ident(IRubyObject) ident(substr)operator(()type(int) ident(beg)operator(,) type(int) ident(len)operator(\)) operator({) + keyword(return) ident(substr)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(beg)operator(,) ident(len)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(substr)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(beg)operator(,) type(int) ident(len)operator(\)) operator({) + type(int) ident(length) operator(=) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) + keyword(if) operator(()ident(len) operator(<) integer(0) operator(||) ident(beg) operator(>) ident(length)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) operator({) + ident(beg) operator(+=) ident(length)operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + type(int) ident(end) operator(=) type(Math)operator(.)ident(min)operator(()ident(length)operator(,) ident(beg) operator(+) ident(len)operator(\))operator(;) + keyword(return) ident(makeShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(beg)operator(,) ident(end) operator(-) ident(beg)operator(\))operator(;) + operator(}) + + + + comment(/* rb_str_replace */) + directive(public) ident(IRubyObject) ident(replace)operator(()type(int) ident(beg)operator(,) type(int) ident(len)operator(,) ident(RubyString) ident(replaceWith)operator(\)) operator({) + keyword(if) operator(()ident(beg) operator(+) ident(len) operator(>=) ident(value)operator(.)ident(length)operator(()operator(\))operator(\)) ident(len) operator(=) ident(value)operator(.)ident(length)operator(()operator(\)) operator(-) ident(beg)operator(;) + + ident(modify)operator(()operator(\))operator(;) + ident(value)operator(.)ident(unsafeReplace)operator(()ident(beg)operator(,)ident(len)operator(,)ident(replaceWith)operator(.)ident(value)operator(\))operator(;) + + keyword(return) ident(infectBy)operator(()ident(replaceWith)operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two args + */) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(op_aref)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(op_aref)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_aref, rb_str_aref_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content([])delimiter(")>operator(,) string<delimiter(")content(slice)delimiter(")>operator(})operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + keyword(if) operator(()ident(arg1) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + keyword(if)operator(()operator(()operator(()ident(RubyRegexp)operator(\))ident(arg1)operator(\))operator(.)ident(search)operator(()ident(context)operator(,) local_variable(this)operator(,) integer(0)operator(,) keyword(false)operator(\)) operator(>=) integer(0)operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(nth_match)operator(()ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg2)operator(\))operator(,) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(substr)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg1)operator(\))operator(,) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg2)operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_str_aref, rb_str_aref_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content([])delimiter(")>operator(,) string<delimiter(")content(slice)delimiter(")>operator(})operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + keyword(if)operator(()operator(()operator(()ident(RubyRegexp)operator(\))ident(arg)operator(\))operator(.)ident(search)operator(()ident(context)operator(,) local_variable(this)operator(,) integer(0)operator(,) keyword(false)operator(\)) operator(>=) integer(0)operator(\)) operator({) + keyword(return) ident(RubyRegexp)operator(.)ident(nth_match)operator(()integer(0)operator(,) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(indexOf)operator(()ident(stringValue)operator(()ident(arg)operator(\))operator(.)ident(value)operator(\)) operator(!=) operator(-)integer(1) operator(?) + ident(arg) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyRange)operator(\)) operator({) + type(long)type([]) ident(begLen) operator(=) operator(()operator(()ident(RubyRange)operator(\)) ident(arg)operator(\))operator(.)ident(begLen)operator(()ident(value)operator(.)ident(length)operator(()operator(\))operator(,) integer(0)operator(\))operator(;) + keyword(return) ident(begLen) operator(==) keyword(null) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) + ident(substr)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(()type(int)operator(\)) ident(begLen)operator([)integer(0)operator(])operator(,) operator(()type(int)operator(\)) ident(begLen)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + type(int) ident(idx) operator(=) operator(()type(int)operator(\)) ident(arg)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(idx) operator(<) integer(0)operator(\)) ident(idx) operator(+=) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) + keyword(if) operator(()ident(idx) operator(<) integer(0) operator(||) ident(idx) operator(>=) ident(value)operator(.)ident(length)operator(()operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(.)ident(get)operator(()ident(idx)operator(\)) operator(&) hex(0xFF)operator(\))operator(;) + operator(}) + + comment(/** + * rb_str_subpat_set + * + */) + directive(private) type(void) ident(subpatSet)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyRegexp) ident(regexp)operator(,) type(int) ident(nth)operator(,) ident(IRubyObject) ident(repl)operator(\)) operator({) + ident(RubyMatchData) ident(match)operator(;) + type(int) ident(start)operator(,) ident(end)operator(,) ident(len)operator(;) + keyword(if) operator(()ident(regexp)operator(.)ident(search)operator(()ident(context)operator(,) local_variable(this)operator(,) integer(0)operator(,) keyword(false)operator(\)) operator(<) integer(0)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(regexp not matched)delimiter(")>operator(\))operator(;) + + ident(match) operator(=) operator(()ident(RubyMatchData)operator(\))ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(getBackRef)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(match)operator(.)ident(regs) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()ident(nth) operator(>=) integer(1)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(nth) operator(+) string<delimiter(")content( out of regexp)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(nth) operator(<) integer(0)operator(\)) operator({) + keyword(if)operator(()operator(-)ident(nth) operator(>=) integer(1)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(nth) operator(+) string<delimiter(")content( out of regexp)delimiter(")>operator(\))operator(;) + ident(nth) operator(+=) integer(1)operator(;) + operator(}) + ident(start) operator(=) ident(match)operator(.)ident(begin)operator(;) + keyword(if)operator(()ident(start) operator(==) operator(-)integer(1)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(regexp group )delimiter(")> operator(+) ident(nth) operator(+) string<delimiter(")content( not matched)delimiter(")>operator(\))operator(;) + ident(end) operator(=) ident(match)operator(.)ident(end)operator(;) + operator(}) keyword(else) operator({) + keyword(if)operator(()ident(nth) operator(>=) ident(match)operator(.)ident(regs)operator(.)ident(numRegs)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(nth) operator(+) string<delimiter(")content( out of regexp)delimiter(")>operator(\))operator(;) + keyword(if)operator(()ident(nth) operator(<) integer(0)operator(\)) operator({) + keyword(if)operator(()operator(-)ident(nth) operator(>=) ident(match)operator(.)ident(regs)operator(.)ident(numRegs)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(index )delimiter(")> operator(+) ident(nth) operator(+) string<delimiter(")content( out of regexp)delimiter(")>operator(\))operator(;) + ident(nth) operator(+=) ident(match)operator(.)ident(regs)operator(.)ident(numRegs)operator(;) + operator(}) + ident(start) operator(=) ident(match)operator(.)ident(regs)operator(.)ident(beg)operator([)ident(nth)operator(])operator(;) + keyword(if)operator(()ident(start) operator(==) operator(-)integer(1)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(regexp group )delimiter(")> operator(+) ident(nth) operator(+) string<delimiter(")content( not matched)delimiter(")>operator(\))operator(;) + ident(end) operator(=) ident(match)operator(.)ident(regs)operator(.)ident(end)operator([)ident(nth)operator(])operator(;) + operator(}) + + ident(len) operator(=) ident(end) operator(-) ident(start)operator(;) + ident(replace)operator(()ident(start)operator(,) ident(len)operator(,) ident(stringValue)operator(()ident(repl)operator(\))operator(\))operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with two or three args. + */) + directive(public) ident(IRubyObject) ident(op_aset)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(2)operator(:) + keyword(return) ident(op_aset)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(case) integer(3)operator(:) + keyword(return) ident(op_aset)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(args)operator([)integer(2)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(2)operator(,) integer(3)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_aset, rb_str_aset_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([]=)delimiter(")>operator(,) ident(reads) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(op_aset)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyFixnum) operator(||) ident(arg0)operator(.)ident(respondsTo)operator(()string<delimiter(")content(to_int)delimiter(")>operator(\))operator(\)) operator({) comment(// FIXME: RubyNumeric or RubyInteger instead?) + type(int) ident(idx) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg0)operator(\))operator(;) + + keyword(if) operator(()ident(idx) operator(<) integer(0)operator(\)) ident(idx) operator(+=) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(idx) operator(<) integer(0) operator(||) ident(idx) operator(>=) ident(value)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(string index out of bounds)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(arg1) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + ident(value)operator(.)ident(set)operator(()ident(idx)operator(,) operator(()type(byte)operator(\)) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg1)operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(replace)operator(()ident(idx)operator(,) integer(1)operator(,) ident(stringValue)operator(()ident(arg1)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(arg1)operator(;) + operator(}) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + ident(RubyString) ident(repl) operator(=) ident(stringValue)operator(()ident(arg1)operator(\))operator(;) + ident(subpatSet)operator(()ident(context)operator(,) operator(()ident(RubyRegexp)operator(\)) ident(arg0)operator(,) integer(0)operator(,) ident(repl)operator(\))operator(;) + keyword(return) ident(repl)operator(;) + operator(}) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(RubyString) ident(orig) operator(=) operator(()ident(RubyString)operator(\))ident(arg0)operator(;) + type(int) ident(beg) operator(=) ident(value)operator(.)ident(indexOf)operator(()ident(orig)operator(.)ident(value)operator(\))operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(string not matched)delimiter(")>operator(\))operator(;) + ident(replace)operator(()ident(beg)operator(,) ident(orig)operator(.)ident(value)operator(.)ident(length)operator(()operator(\))operator(,) ident(stringValue)operator(()ident(arg1)operator(\))operator(\))operator(;) + keyword(return) ident(arg1)operator(;) + operator(}) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyRange)operator(\)) operator({) + type(long)type([]) ident(begLen) operator(=) operator(()operator(()ident(RubyRange)operator(\)) ident(arg0)operator(\))operator(.)ident(begLen)operator(()ident(value)operator(.)ident(realSize)operator(,) integer(2)operator(\))operator(;) + ident(replace)operator(()operator(()type(int)operator(\)) ident(begLen)operator([)integer(0)operator(])operator(,) operator(()type(int)operator(\)) ident(begLen)operator([)integer(1)operator(])operator(,) ident(stringValue)operator(()ident(arg1)operator(\))operator(\))operator(;) + keyword(return) ident(arg1)operator(;) + operator(}) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** rb_str_aset, rb_str_aset_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([]=)delimiter(")>operator(,) ident(reads) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(op_aset)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + keyword(if) operator(()ident(arg0) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + ident(RubyString) ident(repl) operator(=) ident(stringValue)operator(()ident(arg2)operator(\))operator(;) + type(int) ident(nth) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg1)operator(\))operator(;) + ident(subpatSet)operator(()ident(context)operator(,) operator(()ident(RubyRegexp)operator(\)) ident(arg0)operator(,) ident(nth)operator(,) ident(repl)operator(\))operator(;) + keyword(return) ident(repl)operator(;) + operator(}) + ident(RubyString) ident(repl) operator(=) ident(stringValue)operator(()ident(arg2)operator(\))operator(;) + type(int) ident(beg) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg0)operator(\))operator(;) + type(int) ident(len) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg1)operator(\))operator(;) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(negative length)delimiter(")>operator(\))operator(;) + type(int) ident(strLen) operator(=) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) + keyword(if) operator(()ident(beg) operator(<) integer(0)operator(\)) ident(beg) operator(+=) ident(strLen)operator(;) + + keyword(if) operator(()ident(beg) operator(<) integer(0) operator(||) operator(()ident(beg) operator(>) integer(0) operator(&&) ident(beg) operator(>) ident(strLen)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(string index out of bounds)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(beg) operator(+) ident(len) operator(>) ident(strLen)operator(\)) ident(len) operator(=) ident(strLen) operator(-) ident(beg)operator(;) + + ident(replace)operator(()ident(beg)operator(,) ident(len)operator(,) ident(repl)operator(\))operator(;) + keyword(return) ident(repl)operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound as a Ruby method. + * @deprecated Use the versions with one or two args. + */) + directive(public) ident(IRubyObject) ident(slice_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(slice_bang)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(slice_bang)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_slice_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(slice!)delimiter(")>operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(slice_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(op_aref)operator(()ident(context)operator(,) ident(arg0)operator(\))operator(;) + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(result)operator(;) + + ident(op_aset)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** rb_str_slice_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(slice!)delimiter(")>operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(slice_bang)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(op_aref)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(\))operator(;) + keyword(if) operator(()ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(result)operator(;) + + ident(op_aset)operator(()ident(context)operator(,) ident(arg0)operator(,) ident(arg1)operator(,) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(succ)delimiter(")>operator(,) string<delimiter(")content(next)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(succ)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(succ_bang)operator(()operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(succ!)delimiter(")>operator(,) string<delimiter(")content(next!)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(succ_bang)operator(()operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + type(boolean) ident(alnumSeen) operator(=) keyword(false)operator(;) + type(int) ident(pos) operator(=) operator(-)integer(1)operator(;) + type(int) ident(c) operator(=) integer(0)operator(;) + type(int) ident(n) operator(=) integer(0)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(value)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(;) ident(i) operator(>=) integer(0)operator(;) ident(i)operator(--)operator(\)) operator({) + ident(c) operator(=) ident(value)operator(.)ident(get)operator(()ident(i)operator(\)) operator(&) hex(0xFF)operator(;) + keyword(if) operator(()ident(isAlnum)operator(()ident(c)operator(\))operator(\)) operator({) + ident(alnumSeen) operator(=) keyword(true)operator(;) + keyword(if) operator(()operator(()ident(isDigit)operator(()ident(c)operator(\)) operator(&&) ident(c) operator(<) string<delimiter(')content(9)delimiter(')>operator(\)) operator(||) operator(()ident(isLower)operator(()ident(c)operator(\)) operator(&&) ident(c) operator(<) string<delimiter(')content(z)delimiter(')>operator(\)) operator(||) operator(()ident(isUpper)operator(()ident(c)operator(\)) operator(&&) ident(c) operator(<) string<delimiter(')content(Z)delimiter(')>operator(\))operator(\)) operator({) + ident(value)operator(.)ident(set)operator(()ident(i)operator(,) operator(()type(byte)operator(\))operator(()ident(c) operator(+) integer(1)operator(\))operator(\))operator(;) + ident(pos) operator(=) operator(-)integer(1)operator(;) + keyword(break)operator(;) + operator(}) + ident(pos) operator(=) ident(i)operator(;) + ident(n) operator(=) ident(isDigit)operator(()ident(c)operator(\)) operator(?) string<delimiter(')content(1)delimiter(')> operator(:) operator(()ident(isLower)operator(()ident(c)operator(\)) operator(?) string<delimiter(')content(a)delimiter(')> operator(:) string<delimiter(')content(A)delimiter(')>operator(\))operator(;) + ident(value)operator(.)ident(set)operator(()ident(i)operator(,) operator(()type(byte)operator(\))operator(()ident(isDigit)operator(()ident(c)operator(\)) operator(?) string<delimiter(')content(0)delimiter(')> operator(:) operator(()ident(isLower)operator(()ident(c)operator(\)) operator(?) string<delimiter(')content(a)delimiter(')> operator(:) string<delimiter(')content(A)delimiter(')>operator(\))operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()operator(!)ident(alnumSeen)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) ident(value)operator(.)ident(length)operator(()operator(\)) operator(-) integer(1)operator(;) ident(i) operator(>=) integer(0)operator(;) ident(i)operator(--)operator(\)) operator({) + ident(c) operator(=) ident(value)operator(.)ident(get)operator(()ident(i)operator(\)) operator(&) hex(0xFF)operator(;) + keyword(if) operator(()ident(c) operator(<) hex(0xff)operator(\)) operator({) + ident(value)operator(.)ident(set)operator(()ident(i)operator(,) operator(()type(byte)operator(\))operator(()ident(c) operator(+) integer(1)operator(\))operator(\))operator(;) + ident(pos) operator(=) operator(-)integer(1)operator(;) + keyword(break)operator(;) + operator(}) + ident(pos) operator(=) ident(i)operator(;) + ident(n) operator(=) string<delimiter(')content(\\u0001)delimiter(')>operator(;) + ident(value)operator(.)ident(set)operator(()ident(i)operator(,) integer(0)operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(pos) operator(>) operator(-)integer(1)operator(\)) operator({) + comment(// This represents left most digit in a set of incremented) + comment(// values? Therefore leftmost numeric must be '1' and not '0') + comment(// 999 -> 1000, not 999 -> 0000. whereas chars should be) + comment(// zzz -> aaaa and non-alnum byte values should be "\\377" -> "\\001\\000") + ident(value)operator(.)ident(insert)operator(()ident(pos)operator(,) operator(()type(byte)operator(\)) ident(n)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_str_upto_m + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(upto)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(upto)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(str)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(upto)operator(()ident(context)operator(,) ident(str)operator(,) keyword(false)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/* rb_str_upto */) + directive(public) ident(IRubyObject) ident(upto)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(str)operator(,) type(boolean) ident(excl)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyString) ident(end) operator(=) ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(;) + + type(int) ident(n) operator(=) ident(value)operator(.)ident(cmp)operator(()ident(end)operator(.)ident(value)operator(\))operator(;) + keyword(if) operator(()ident(n) operator(>) integer(0) operator(||) operator(()ident(excl) operator(&&) ident(n) operator(==) integer(0)operator(\))operator(\)) keyword(return) local_variable(this)operator(;) + + ident(IRubyObject) ident(afterEnd) operator(=) ident(end)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(succ)delimiter(")>operator(\))operator(;) + ident(RubyString) ident(current) operator(=) local_variable(this)operator(;) + + keyword(while) operator(()operator(!)ident(current)operator(.)ident(op_equal)operator(()ident(context)operator(,) ident(afterEnd)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(current)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(excl) operator(&&) ident(current)operator(.)ident(op_equal)operator(()ident(context)operator(,) ident(end)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) keyword(break)operator(;) + ident(current) operator(=) ident(current)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(succ)delimiter(")>operator(\))operator(.)ident(convertToString)operator(()operator(\))operator(;) + keyword(if) operator(()ident(excl) operator(&&) ident(current)operator(.)ident(op_equal)operator(()ident(context)operator(,) ident(end)operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) keyword(break)operator(;) + keyword(if) operator(()ident(current)operator(.)ident(value)operator(.)ident(realSize) operator(>) ident(end)operator(.)ident(value)operator(.)ident(realSize) operator(||) ident(current)operator(.)ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(break)operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_str_include + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(include?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(include_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(if) operator(()ident(obj) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + type(int) ident(c) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(obj)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(get)operator(()ident(i)operator(\)) operator(==) operator(()type(byte)operator(\))ident(c)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + ident(ByteList) ident(str) operator(=) ident(stringValue)operator(()ident(obj)operator(\))operator(.)ident(value)operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(value)operator(.)ident(indexOf)operator(()ident(str)operator(\)) operator(!=) operator(-)integer(1)operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound as a Ruby method. + * @deprecated Use the versions with zero or one args. + */) + directive(public) ident(IRubyObject) ident(to_i)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(return) ident(to_i)operator(()operator(\))operator(;) + keyword(case) integer(1)operator(:) + keyword(return) ident(to_i)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_to_i + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_i)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_i)operator(()operator(\)) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(str2inum)operator(()ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(,) integer(10)operator(\))operator(;) + operator(}) + + comment(/** rb_str_to_i + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_i)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_i)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + type(long) ident(base) operator(=) ident(arg0)operator(.)ident(convertToInteger)operator(()operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(return) ident(RubyNumeric)operator(.)ident(str2inum)operator(()ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(,) operator(()type(int)operator(\)) ident(base)operator(\))operator(;) + operator(}) + + comment(/** rb_str_oct + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(oct)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(oct)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(isEmpty)operator(()operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + + type(int) ident(base) operator(=) integer(8)operator(;) + + type(int) ident(ix) operator(=) ident(value)operator(.)ident(begin)operator(;) + + keyword(while)operator(()ident(ix) operator(<) ident(value)operator(.)ident(begin)operator(+)ident(value)operator(.)ident(realSize) operator(&&) ident(ASCII)operator(.)ident(isSpace)operator(()ident(value)operator(.)ident(bytes)operator([)ident(ix)operator(]) operator(&) hex(0xff)operator(\))operator(\)) operator({) + ident(ix)operator(++)operator(;) + operator(}) + + type(int) ident(pos) operator(=) operator(()ident(value)operator(.)ident(bytes)operator([)ident(ix)operator(]) operator(==) string<delimiter(')content(-)delimiter(')> operator(||) ident(value)operator(.)ident(bytes)operator([)ident(ix)operator(]) operator(==) string<delimiter(')content(+)delimiter(')>operator(\)) operator(?) ident(ix)operator(+)integer(1) operator(:) ident(ix)operator(;) + keyword(if)operator(()operator(()ident(pos)operator(+)integer(1)operator(\)) operator(<) ident(value)operator(.)ident(begin)operator(+)ident(value)operator(.)ident(realSize) operator(&&) ident(value)operator(.)ident(bytes)operator([)ident(pos)operator(]) operator(==) string<delimiter(')content(0)delimiter(')>operator(\)) operator({) + keyword(if)operator(()ident(value)operator(.)ident(bytes)operator([)ident(pos)operator(+)integer(1)operator(]) operator(==) string<delimiter(')content(x)delimiter(')> operator(||) ident(value)operator(.)ident(bytes)operator([)ident(pos)operator(+)integer(1)operator(]) operator(==) string<delimiter(')content(X)delimiter(')>operator(\)) operator({) + ident(base) operator(=) integer(16)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(value)operator(.)ident(bytes)operator([)ident(pos)operator(+)integer(1)operator(]) operator(==) string<delimiter(')content(b)delimiter(')> operator(||) ident(value)operator(.)ident(bytes)operator([)ident(pos)operator(+)integer(1)operator(]) operator(==) string<delimiter(')content(B)delimiter(')>operator(\)) operator({) + ident(base) operator(=) integer(2)operator(;) + operator(}) keyword(else) keyword(if)operator(()ident(value)operator(.)ident(bytes)operator([)ident(pos)operator(+)integer(1)operator(]) operator(==) string<delimiter(')content(d)delimiter(')> operator(||) ident(value)operator(.)ident(bytes)operator([)ident(pos)operator(+)integer(1)operator(]) operator(==) string<delimiter(')content(D)delimiter(')>operator(\)) operator({) + ident(base) operator(=) integer(10)operator(;) + operator(}) + operator(}) + keyword(return) ident(RubyNumeric)operator(.)ident(str2inum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(,) ident(base)operator(\))operator(;) + operator(}) + + comment(/** rb_str_hex + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hex)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(hex)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(str2inum)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(,) integer(16)operator(\))operator(;) + operator(}) + + comment(/** rb_str_to_f + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_f)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_f)operator(()operator(\)) operator({) + keyword(return) ident(RubyNumeric)operator(.)ident(str2fnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(\))operator(;) + operator(}) + + comment(/** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */) + directive(public) ident(RubyArray) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(return) ident(split)operator(()ident(context)operator(\))operator(;) + keyword(case) integer(1)operator(:) + keyword(return) ident(split)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(split)operator(()ident(context)operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_split_m + * + */) + annotation(@JRubyMethod)operator(()ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(RubyArray) ident(split)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) ident(split)operator(()ident(context)operator(,) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + + comment(/** rb_str_split_m + * + */) + annotation(@JRubyMethod)operator(()ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(RubyArray) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(splitCommon)operator(()ident(arg0)operator(,) keyword(false)operator(,) integer(0)operator(,) integer(0)operator(,) ident(context)operator(\))operator(;) + operator(}) + + comment(/** rb_str_split_m + * + */) + annotation(@JRubyMethod)operator(()ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(RubyArray) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + directive(final) type(int) ident(lim) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg1)operator(\))operator(;) + keyword(if) operator(()ident(lim) operator(<=) integer(0)operator(\)) operator({) + keyword(return) ident(splitCommon)operator(()ident(arg0)operator(,) keyword(false)operator(,) ident(lim)operator(,) integer(1)operator(,) ident(context)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(lim) operator(==) integer(1)operator(\)) keyword(return) ident(value)operator(.)ident(realSize) operator(==) integer(0) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(splitCommon)operator(()ident(arg0)operator(,) keyword(true)operator(,) ident(lim)operator(,) integer(1)operator(,) ident(context)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(RubyArray) ident(splitCommon)operator(()ident(IRubyObject) ident(spat)operator(,) directive(final) type(boolean) ident(limit)operator(,) directive(final) type(int) ident(lim)operator(,) directive(final) type(int) ident(i)operator(,) ident(ThreadContext) ident(context)operator(\)) operator({) + directive(final) ident(RubyArray) ident(result)operator(;) + keyword(if) operator(()ident(spat)operator(.)ident(isNil)operator(()operator(\)) operator(&&) operator(()ident(spat) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($;)delimiter(")>operator(\))operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(result) operator(=) ident(awkSplit)operator(()ident(limit)operator(,) ident(lim)operator(,) ident(i)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(spat) keyword(instanceof) ident(RubyString) operator(&&) operator(()operator(()ident(RubyString)operator(\)) ident(spat)operator(\))operator(.)ident(value)operator(.)ident(realSize) operator(==) integer(1)operator(\)) operator({) + ident(RubyString) ident(strSpat) operator(=) operator(()ident(RubyString)operator(\)) ident(spat)operator(;) + keyword(if) operator(()ident(strSpat)operator(.)ident(value)operator(.)ident(bytes)operator([)ident(strSpat)operator(.)ident(value)operator(.)ident(begin)operator(]) operator(==) operator(()type(byte)operator(\)) string<delimiter(')content( )delimiter(')>operator(\)) operator({) + ident(result) operator(=) ident(awkSplit)operator(()ident(limit)operator(,) ident(lim)operator(,) ident(i)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result) operator(=) ident(split)operator(()ident(context)operator(,) ident(spat)operator(,) ident(limit)operator(,) ident(lim)operator(,) ident(i)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(result) operator(=) ident(split)operator(()ident(context)operator(,) ident(spat)operator(,) ident(limit)operator(,) ident(lim)operator(,) ident(i)operator(\))operator(;) + operator(}) + operator(}) + + keyword(if) operator(()operator(!)ident(limit) operator(&&) ident(lim) operator(==) integer(0)operator(\)) operator({) + keyword(while) operator(()ident(result)operator(.)ident(size)operator(()operator(\)) operator(>) integer(0) operator(&&) operator(()operator(()ident(RubyString)operator(\)) ident(result)operator(.)ident(eltInternal)operator(()ident(result)operator(.)ident(size)operator(()operator(\)) operator(-) integer(1)operator(\))operator(\))operator(.)ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(result)operator(.)ident(pop)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) ident(RubyArray) ident(split)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(pat)operator(,) type(boolean) ident(limit)operator(,) type(int) ident(lim)operator(,) type(int) ident(i)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + directive(final) ident(Regex) ident(regex) operator(=) ident(getPattern)operator(()ident(pat)operator(,) keyword(true)operator(\))operator(.)ident(getPattern)operator(()operator(\))operator(;) + type(int) ident(beg)operator(,) ident(end)operator(,) ident(start)operator(;) + + type(int) ident(begin) operator(=) ident(value)operator(.)ident(begin)operator(;) + ident(start) operator(=) ident(begin)operator(;) + ident(beg) operator(=) integer(0)operator(;) + + type(int) ident(range) operator(=) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(;) + directive(final) type(Matcher) ident(matcher) operator(=) ident(regex)operator(.)ident(matcher)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin)operator(,) ident(range)operator(\))operator(;) + + type(boolean) ident(lastNull) operator(=) keyword(false)operator(;) + ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + keyword(if) operator(()ident(regex)operator(.)ident(numberOfCaptures)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) comment(// shorter path, no captures defined, no region will be returned ) + keyword(while) operator(()operator(()ident(end) operator(=) ident(matcher)operator(.)ident(search)operator(()ident(start)operator(,) ident(range)operator(,) type(Option)operator(.)ident(NONE)operator(\))operator(\)) operator(>=) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(start) operator(==) ident(end) operator(+) ident(begin) operator(&&) ident(matcher)operator(.)ident(getBegin)operator(()operator(\)) operator(==) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(newEmptyString)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(break)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(lastNull)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(substr)operator(()ident(runtime)operator(,) ident(beg)operator(,) ident(regex)operator(.)ident(getEncoding)operator(()operator(\))operator(.)ident(length)operator(()ident(value)operator(.)ident(bytes)operator([)ident(begin) operator(+) ident(beg)operator(])operator(\))operator(\))operator(\))operator(;) + ident(beg) operator(=) ident(start) operator(-) ident(begin)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(start) operator(==) ident(range)operator(\)) operator({) + ident(start)operator(++)operator(;) + operator(}) keyword(else) operator({) + ident(start) operator(+=) ident(regex)operator(.)ident(getEncoding)operator(()operator(\))operator(.)ident(length)operator(()ident(value)operator(.)ident(bytes)operator([)ident(start)operator(])operator(\))operator(;) + operator(}) + ident(lastNull) operator(=) keyword(true)operator(;) + keyword(continue)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(result)operator(.)ident(append)operator(()ident(substr)operator(()ident(beg)operator(,) ident(end) operator(-) ident(beg)operator(\))operator(\))operator(;) + ident(beg) operator(=) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(;) + ident(start) operator(=) ident(begin) operator(+) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(;) + operator(}) + ident(lastNull) operator(=) keyword(false)operator(;) + keyword(if) operator(()ident(limit) operator(&&) ident(lim) operator(<=) operator(++)ident(i)operator(\)) keyword(break)operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(while) operator(()operator(()ident(end) operator(=) ident(matcher)operator(.)ident(search)operator(()ident(start)operator(,) ident(range)operator(,) type(Option)operator(.)ident(NONE)operator(\))operator(\)) operator(>=) integer(0)operator(\)) operator({) + directive(final) type(Region) ident(region) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) + keyword(if) operator(()ident(start) operator(==) ident(end) operator(+) ident(begin) operator(&&) ident(region)operator(.)ident(beg)operator([)integer(0)operator(]) operator(==) ident(region)operator(.)ident(end)operator([)integer(0)operator(])operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(newEmptyString)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(break)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(lastNull)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(substr)operator(()ident(beg)operator(,) ident(regex)operator(.)ident(getEncoding)operator(()operator(\))operator(.)ident(length)operator(()ident(value)operator(.)ident(bytes)operator([)ident(begin) operator(+) ident(beg)operator(])operator(\))operator(\))operator(\))operator(;) + ident(beg) operator(=) ident(start) operator(-) ident(begin)operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(start) operator(==) ident(range)operator(\)) operator({) + ident(start)operator(++)operator(;) + operator(}) keyword(else) operator({) + ident(start) operator(+=) ident(regex)operator(.)ident(getEncoding)operator(()operator(\))operator(.)ident(length)operator(()ident(value)operator(.)ident(bytes)operator([)ident(start)operator(])operator(\))operator(;) + operator(}) + ident(lastNull) operator(=) keyword(true)operator(;) + keyword(continue)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(result)operator(.)ident(append)operator(()ident(substr)operator(()ident(beg)operator(,) ident(end) operator(-) ident(beg)operator(\))operator(\))operator(;) + ident(beg) operator(=) ident(start) operator(=) ident(region)operator(.)ident(end)operator([)integer(0)operator(])operator(;) + ident(start) operator(+=) ident(begin)operator(;) + operator(}) + ident(lastNull) operator(=) keyword(false)operator(;) + + keyword(for) operator(()type(int) ident(idx)operator(=)integer(1)operator(;) ident(idx)operator(<)ident(region)operator(.)ident(numRegs)operator(;) ident(idx)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(region)operator(.)ident(beg)operator([)ident(idx)operator(]) operator(==) operator(-)integer(1)operator(\)) keyword(continue)operator(;) + keyword(if) operator(()ident(region)operator(.)ident(beg)operator([)ident(idx)operator(]) operator(==) ident(region)operator(.)ident(end)operator([)ident(idx)operator(])operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(newEmptyString)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result)operator(.)ident(append)operator(()ident(substr)operator(()ident(region)operator(.)ident(beg)operator([)ident(idx)operator(])operator(,) ident(region)operator(.)ident(end)operator([)ident(idx)operator(]) operator(-) ident(region)operator(.)ident(beg)operator([)ident(idx)operator(])operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(limit) operator(&&) ident(lim) operator(<=) operator(++)ident(i)operator(\)) keyword(break)operator(;) + operator(}) + operator(}) + + comment(// only this case affects backrefs ) + ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(setBackRef)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(>) integer(0) operator(&&) operator(()ident(limit) operator(||) ident(value)operator(.)ident(realSize) operator(>) ident(beg) operator(||) ident(lim) operator(<) integer(0)operator(\))operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) ident(beg)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(newEmptyString)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result)operator(.)ident(append)operator(()ident(substr)operator(()ident(beg)operator(,) ident(value)operator(.)ident(realSize) operator(-) ident(beg)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) ident(RubyArray) ident(awkSplit)operator(()type(boolean) ident(limit)operator(,) type(int) ident(lim)operator(,) type(int) ident(i)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyArray) ident(result) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + type(byte)type([])ident(bytes) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(p) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(endp) operator(=) ident(p) operator(+) ident(value)operator(.)ident(realSize)operator(;) + + type(boolean) ident(skip) operator(=) keyword(true)operator(;) + + type(int) ident(end)operator(,) ident(beg) operator(=) integer(0)operator(;) + keyword(for) operator(()ident(end) operator(=) ident(beg) operator(=) integer(0)operator(;) ident(p) operator(<) ident(endp)operator(;) ident(p)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(skip)operator(\)) operator({) + keyword(if) operator(()ident(ASCII)operator(.)ident(isSpace)operator(()ident(bytes)operator([)ident(p)operator(]) operator(&) hex(0xff)operator(\))operator(\)) operator({) + ident(beg)operator(++)operator(;) + operator(}) keyword(else) operator({) + ident(end) operator(=) ident(beg) operator(+) integer(1)operator(;) + ident(skip) operator(=) keyword(false)operator(;) + keyword(if) operator(()ident(limit) operator(&&) ident(lim) operator(<=) ident(i)operator(\)) keyword(break)operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(ASCII)operator(.)ident(isSpace)operator(()ident(bytes)operator([)ident(p)operator(]) operator(&) hex(0xff)operator(\))operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(makeShared)operator(()ident(runtime)operator(,) ident(beg)operator(,) ident(end) operator(-) ident(beg)operator(\))operator(\))operator(;) + ident(skip) operator(=) keyword(true)operator(;) + ident(beg) operator(=) ident(end) operator(+) integer(1)operator(;) + keyword(if) operator(()ident(limit)operator(\)) ident(i)operator(++)operator(;) + operator(}) keyword(else) operator({) + ident(end)operator(++)operator(;) + operator(}) + operator(}) + operator(}) + + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(>) integer(0) operator(&&) operator(()ident(limit) operator(||) ident(value)operator(.)ident(realSize) operator(>) ident(beg) operator(||) ident(lim) operator(<) integer(0)operator(\))operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) ident(beg)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(newEmptyString)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result)operator(.)ident(append)operator(()ident(makeShared)operator(()ident(runtime)operator(,) ident(beg)operator(,) ident(value)operator(.)ident(realSize) operator(-) ident(beg)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** get_pat + * + */) + directive(private) directive(final) ident(RubyRegexp) ident(getPattern)operator(()ident(IRubyObject) ident(obj)operator(,) type(boolean) ident(quote)operator(\)) operator({) + keyword(if) operator(()ident(obj) keyword(instanceof) ident(RubyRegexp)operator(\)) operator({) + keyword(return) operator(()ident(RubyRegexp)operator(\))ident(obj)operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(!)operator(()ident(obj) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + ident(IRubyObject) ident(val) operator(=) ident(obj)operator(.)ident(checkStringType)operator(()operator(\))operator(;) + keyword(if) operator(()ident(val)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type )delimiter(")> operator(+) ident(obj)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( (expected Regexp\))delimiter(")>operator(\))operator(;) + ident(obj) operator(=) ident(val)operator(;) + operator(}) + + keyword(return) ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(()operator(()ident(RubyString)operator(\))ident(obj)operator(\))operator(.)ident(value)operator(,) integer(0)operator(,) ident(quote)operator(\))operator(;) + operator(}) + + comment(/** rb_str_scan + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(scan)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(\)) + directive(public) ident(IRubyObject) ident(scan)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getPreviousFrame)operator(()operator(\))operator(;) + + directive(final) ident(RubyRegexp) ident(rubyRegex) operator(=) ident(getPattern)operator(()ident(arg)operator(,) keyword(true)operator(\))operator(;) + directive(final) ident(Regex) ident(regex) operator(=) ident(rubyRegex)operator(.)ident(getPattern)operator(()operator(\))operator(;) + + type(int) ident(range) operator(=) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(;) + directive(final) type(Matcher) ident(matcher) operator(=) ident(regex)operator(.)ident(matcher)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin)operator(,) ident(range)operator(\))operator(;) + ident(matcher)operator(.)ident(value) operator(=) integer(0)operator(;) comment(// implicit start argument to scanOnce(NG\)) + + ident(IRubyObject) ident(result)operator(;) + keyword(if) operator(()operator(!)ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + ident(RubyArray) ident(ary) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(regex)operator(.)ident(numberOfCaptures)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(while) operator(()operator(()ident(result) operator(=) ident(scanOnceNG)operator(()ident(rubyRegex)operator(,) ident(matcher)operator(,) ident(range)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) ident(ary)operator(.)ident(append)operator(()ident(result)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(while) operator(()operator(()ident(result) operator(=) ident(scanOnce)operator(()ident(rubyRegex)operator(,) ident(matcher)operator(,) ident(range)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) ident(ary)operator(.)ident(append)operator(()ident(result)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(ary)operator(.)ident(size)operator(()operator(\)) operator(>) integer(0)operator(\)) operator({) + ident(rubyRegex)operator(.)ident(updateBackRef)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(frame)operator(,) ident(matcher)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(frame)operator(.)ident(setBackRef)operator(()ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(ary)operator(;) + operator(}) keyword(else) operator({) + type(byte)type([])ident(bytes) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(size) operator(=) ident(value)operator(.)ident(realSize)operator(;) + ident(RubyMatchData) ident(match) operator(=) keyword(null)operator(;) + + keyword(if) operator(()ident(regex)operator(.)ident(numberOfCaptures)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(while) operator(()operator(()ident(result) operator(=) ident(scanOnceNG)operator(()ident(rubyRegex)operator(,) ident(matcher)operator(,) ident(range)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(match) operator(=) ident(rubyRegex)operator(.)ident(updateBackRef)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(frame)operator(,) ident(matcher)operator(\))operator(;) + ident(match)operator(.)ident(use)operator(()operator(\))operator(;) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(result)operator(\))operator(;) + ident(modifyCheck)operator(()ident(bytes)operator(,) ident(size)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(while) operator(()operator(()ident(result) operator(=) ident(scanOnce)operator(()ident(rubyRegex)operator(,) ident(matcher)operator(,) ident(range)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + ident(match) operator(=) ident(rubyRegex)operator(.)ident(updateBackRef)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(frame)operator(,) ident(matcher)operator(\))operator(;) + ident(match)operator(.)ident(use)operator(()operator(\))operator(;) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(result)operator(\))operator(;) + ident(modifyCheck)operator(()ident(bytes)operator(,) ident(size)operator(\))operator(;) + operator(}) + operator(}) + ident(frame)operator(.)ident(setBackRef)operator(()ident(match) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(match)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) + + comment(/** + * rb_enc_check + */) + annotation(@SuppressWarnings)operator(()string<delimiter(")content(unused)delimiter(")>operator(\)) + directive(private) ident(Encoding) ident(encodingCheck)operator(()ident(RubyRegexp) ident(pattern)operator(\)) operator({) + comment(// For 1.9 compatibility, should check encoding compat between string and pattern) + keyword(return) ident(pattern)operator(.)ident(getKCode)operator(()operator(\))operator(.)ident(getEncoding)operator(()operator(\))operator(;) + operator(}) + + comment(// no group version) + directive(private) ident(IRubyObject) ident(scanOnceNG)operator(()ident(RubyRegexp) ident(regex)operator(,) type(Matcher) ident(matcher)operator(,) type(int) ident(range)operator(\)) operator({) + keyword(if) operator(()ident(matcher)operator(.)ident(search)operator(()ident(matcher)operator(.)ident(value) operator(+) ident(value)operator(.)ident(begin)operator(,) ident(range)operator(,) type(Option)operator(.)ident(NONE)operator(\)) operator(>=) integer(0)operator(\)) operator({) + type(int) ident(end) operator(=) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(;) + keyword(if) operator(()ident(matcher)operator(.)ident(getBegin)operator(()operator(\)) operator(==) ident(end)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(>) ident(end)operator(\)) operator({) + ident(matcher)operator(.)ident(value) operator(=) ident(end) operator(+) ident(regex)operator(.)ident(getPattern)operator(()operator(\))operator(.)ident(getEncoding)operator(()operator(\))operator(.)ident(length)operator(()ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin) operator(+) ident(end)operator(])operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(matcher)operator(.)ident(value) operator(=) ident(end) operator(+) integer(1)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(matcher)operator(.)ident(value) operator(=) ident(end)operator(;) + operator(}) + keyword(return) ident(substr)operator(()ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(,) ident(end) operator(-) ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(\))operator(.)ident(infectBy)operator(()ident(regex)operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + comment(// group version) + directive(private) ident(IRubyObject) ident(scanOnce)operator(()ident(RubyRegexp) ident(regex)operator(,) type(Matcher) ident(matcher)operator(,) type(int) ident(range)operator(\)) operator({) + keyword(if) operator(()ident(matcher)operator(.)ident(search)operator(()ident(matcher)operator(.)ident(value) operator(+) ident(value)operator(.)ident(begin)operator(,) ident(range)operator(,) type(Option)operator(.)ident(NONE)operator(\)) operator(>=) integer(0)operator(\)) operator({) + type(Region) ident(region) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) + type(int) ident(end) operator(=) ident(region)operator(.)ident(end)operator([)integer(0)operator(])operator(;) + keyword(if) operator(()ident(region)operator(.)ident(beg)operator([)integer(0)operator(]) operator(==) ident(end)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(>) ident(end)operator(\)) operator({) + ident(matcher)operator(.)ident(value) operator(=) ident(end) operator(+) ident(regex)operator(.)ident(getPattern)operator(()operator(\))operator(.)ident(getEncoding)operator(()operator(\))operator(.)ident(length)operator(()ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin) operator(+) ident(end)operator(])operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(matcher)operator(.)ident(value) operator(=) ident(end) operator(+) integer(1)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(matcher)operator(.)ident(value) operator(=) ident(end)operator(;) + operator(}) + + ident(RubyArray) ident(result) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(region)operator(.)ident(numRegs)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(1)operator(;) ident(i)operator(<)ident(region)operator(.)ident(numRegs)operator(;) ident(i)operator(++)operator(\)) operator({) + type(int) ident(beg) operator(=) ident(region)operator(.)ident(beg)operator([)ident(i)operator(])operator(;) + keyword(if) operator(()ident(beg) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(result)operator(.)ident(append)operator(()ident(substr)operator(()ident(beg)operator(,) ident(region)operator(.)ident(end)operator([)ident(i)operator(]) operator(-) ident(beg)operator(\))operator(.)ident(infectBy)operator(()ident(regex)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(private) directive(static) directive(final) ident(ByteList) ident(SPACE_BYTELIST) operator(=) keyword(new) ident(ByteList)operator(()ident(ByteList)operator(.)ident(plain)operator(()string<delimiter(")content( )delimiter(")>operator(\))operator(\))operator(;) + + directive(private) directive(final) ident(IRubyObject) ident(justify)operator(()ident(IRubyObject) ident(arg0)operator(,) type(char) ident(jflag)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + type(int) ident(width) operator(=) ident(RubyFixnum)operator(.)ident(num2int)operator(()ident(arg0)operator(\))operator(;) + + type(int) ident(f)operator(,) ident(flen) operator(=) integer(0)operator(;) + type(byte)type([])ident(fbuf)operator(;) + + ident(IRubyObject) ident(pad)operator(;) + + ident(f) operator(=) ident(SPACE_BYTELIST)operator(.)ident(begin)operator(;) + ident(flen) operator(=) ident(SPACE_BYTELIST)operator(.)ident(realSize)operator(;) + ident(fbuf) operator(=) ident(SPACE_BYTELIST)operator(.)ident(bytes)operator(;) + ident(pad) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(return) ident(justifyCommon)operator(()ident(width)operator(,) ident(jflag)operator(,) ident(flen)operator(,) ident(fbuf)operator(,) ident(f)operator(,) ident(runtime)operator(,) ident(pad)operator(\))operator(;) + operator(}) + + directive(private) directive(final) ident(IRubyObject) ident(justify)operator(()ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(,) type(char) ident(jflag)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + type(int) ident(width) operator(=) ident(RubyFixnum)operator(.)ident(num2int)operator(()ident(arg0)operator(\))operator(;) + + type(int) ident(f)operator(,) ident(flen) operator(=) integer(0)operator(;) + type(byte)type([])ident(fbuf)operator(;) + + ident(IRubyObject) ident(pad)operator(;) + + ident(pad) operator(=) ident(arg1)operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(ByteList) ident(fList) operator(=) operator(()operator(()ident(RubyString)operator(\))ident(pad)operator(\))operator(.)ident(value)operator(;) + ident(f) operator(=) ident(fList)operator(.)ident(begin)operator(;) + ident(flen) operator(=) ident(fList)operator(.)ident(realSize)operator(;) + + keyword(if) operator(()ident(flen) operator(==) integer(0)operator(\)) keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(zero width padding)delimiter(")>operator(\))operator(;) + + ident(fbuf) operator(=) ident(fList)operator(.)ident(bytes)operator(;) + + keyword(return) ident(justifyCommon)operator(()ident(width)operator(,) ident(jflag)operator(,) ident(flen)operator(,) ident(fbuf)operator(,) ident(f)operator(,) ident(runtime)operator(,) ident(pad)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(justifyCommon)operator(()type(int) ident(width)operator(,) type(char) ident(jflag)operator(,) type(int) ident(flen)operator(,) type(byte)type([]) ident(fbuf)operator(,) type(int) ident(f)operator(,) ident(Ruby) ident(runtime)operator(,) ident(IRubyObject) ident(pad)operator(\)) operator({) + keyword(if) operator(()ident(width) operator(<) integer(0) operator(||) ident(value)operator(.)ident(realSize) operator(>=) ident(width)operator(\)) keyword(return) ident(strDup)operator(()ident(runtime)operator(\))operator(;) + + ident(ByteList) ident(res) operator(=) keyword(new) ident(ByteList)operator(()ident(width)operator(\))operator(;) + ident(res)operator(.)ident(realSize) operator(=) ident(width)operator(;) + + type(int) ident(p) operator(=) ident(res)operator(.)ident(begin)operator(;) + type(int) ident(pend)operator(;) + type(byte)type([]) ident(pbuf) operator(=) ident(res)operator(.)ident(bytes)operator(;) + + keyword(if) operator(()ident(jflag) operator(!=) string<delimiter(')content(l)delimiter(')>operator(\)) operator({) + type(int) ident(n) operator(=) ident(width) operator(-) ident(value)operator(.)ident(realSize)operator(;) + ident(pend) operator(=) ident(p) operator(+) operator(()operator(()ident(jflag) operator(==) string<delimiter(')content(r)delimiter(')>operator(\)) operator(?) ident(n) operator(:) ident(n) operator(/) integer(2)operator(\))operator(;) + keyword(if) operator(()ident(flen) operator(<=) integer(1)operator(\)) operator({) + keyword(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(pbuf)operator([)ident(p)operator(++)operator(]) operator(=) ident(fbuf)operator([)ident(f)operator(])operator(;) + operator(}) + operator(}) keyword(else) operator({) + type(int) ident(q) operator(=) ident(f)operator(;) + keyword(while) operator(()ident(p) operator(+) ident(flen) operator(<=) ident(pend)operator(\)) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(fbuf)operator(,) ident(f)operator(,) ident(pbuf)operator(,) ident(p)operator(,) ident(flen)operator(\))operator(;) + ident(p) operator(+=) ident(flen)operator(;) + operator(}) + keyword(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(pbuf)operator([)ident(p)operator(++)operator(]) operator(=) ident(fbuf)operator([)ident(q)operator(++)operator(])operator(;) + operator(}) + operator(}) + operator(}) + + type(System)operator(.)ident(arraycopy)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin)operator(,) ident(pbuf)operator(,) ident(p)operator(,) ident(value)operator(.)ident(realSize)operator(\))operator(;) + + keyword(if) operator(()ident(jflag) operator(!=) string<delimiter(')content(r)delimiter(')>operator(\)) operator({) + ident(p) operator(+=) ident(value)operator(.)ident(realSize)operator(;) + ident(pend) operator(=) ident(res)operator(.)ident(begin) operator(+) ident(width)operator(;) + keyword(if) operator(()ident(flen) operator(<=) integer(1)operator(\)) operator({) + keyword(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(pbuf)operator([)ident(p)operator(++)operator(]) operator(=) ident(fbuf)operator([)ident(f)operator(])operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(while) operator(()ident(p) operator(+) ident(flen) operator(<=) ident(pend)operator(\)) operator({) + type(System)operator(.)ident(arraycopy)operator(()ident(fbuf)operator(,) ident(f)operator(,) ident(pbuf)operator(,) ident(p)operator(,) ident(flen)operator(\))operator(;) + ident(p) operator(+=) ident(flen)operator(;) + operator(}) + keyword(while) operator(()ident(p) operator(<) ident(pend)operator(\)) operator({) + ident(pbuf)operator([)ident(p)operator(++)operator(]) operator(=) ident(fbuf)operator([)ident(f)operator(++)operator(])operator(;) + operator(}) + operator(}) + operator(}) + + ident(RubyString) ident(resStr) operator(=) keyword(new) ident(RubyString)operator(()ident(runtime)operator(,) ident(getMetaClass)operator(()operator(\))operator(,) ident(res)operator(\))operator(;) + ident(resStr)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + keyword(if) operator(()ident(flen) operator(>) integer(0)operator(\)) operator({) + ident(resStr)operator(.)ident(infectBy)operator(()ident(pad)operator(\))operator(;) + operator(}) + keyword(return) ident(resStr)operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated use the one or two argument versions. + */) + directive(public) ident(IRubyObject) ident(ljust)operator(()ident(IRubyObject) type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(ljust)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(ljust)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_ljust + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(ljust)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(justify)operator(()ident(arg0)operator(,) string<delimiter(')content(l)delimiter(')>operator(\))operator(;) + operator(}) + + comment(/** rb_str_ljust + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(ljust)operator(()ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(return) ident(justify)operator(()ident(arg0)operator(,) ident(arg1)operator(,) string<delimiter(')content(l)delimiter(')>operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated use the one or two argument versions. + */) + directive(public) ident(IRubyObject) ident(rjust)operator(()ident(IRubyObject) type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(rjust)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(rjust)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_rjust + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(rjust)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(justify)operator(()ident(arg0)operator(,) string<delimiter(')content(r)delimiter(')>operator(\))operator(;) + operator(}) + + comment(/** rb_str_rjust + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(rjust)operator(()ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(return) ident(justify)operator(()ident(arg0)operator(,) ident(arg1)operator(,) string<delimiter(')content(r)delimiter(')>operator(\))operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated use the one or two argument versions. + */) + directive(public) ident(IRubyObject) ident(center)operator(()ident(IRubyObject) type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(1)operator(:) + keyword(return) ident(center)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(case) integer(2)operator(:) + keyword(return) ident(center)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_center + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(center)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(justify)operator(()ident(arg0)operator(,) string<delimiter(')content(c)delimiter(')>operator(\))operator(;) + operator(}) + + comment(/** rb_str_center + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(center)operator(()ident(IRubyObject) ident(arg0)operator(,) ident(IRubyObject) ident(arg1)operator(\)) operator({) + keyword(return) ident(justify)operator(()ident(arg0)operator(,) ident(arg1)operator(,) string<delimiter(')content(c)delimiter(')>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chop)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(chop)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(chop_bang)operator(()operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_chop_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chop!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(chop_bang)operator(()operator(\)) operator({) + type(int) ident(end) operator(=) ident(value)operator(.)ident(realSize) operator(-) integer(1)operator(;) + keyword(if) operator(()ident(end) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(()ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin) operator(+) ident(end)operator(])operator(\)) operator(==) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + keyword(if) operator(()ident(end) operator(>) integer(0) operator(&&) operator(()ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin) operator(+) ident(end) operator(-) integer(1)operator(])operator(\)) operator(==) string<delimiter(')content(\\r)delimiter(')>operator(\)) ident(end)operator(--)operator(;) + operator(}) + + ident(view)operator(()integer(0)operator(,) ident(end)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby + * + * @param args + * @return + * @deprecated Use the zero or one argument versions. + */) + directive(public) ident(RubyString) ident(chomp)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(return) ident(chomp)operator(()operator(\))operator(;) + keyword(case) integer(1)operator(:) + keyword(return) ident(chomp)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** rb_str_chop + * + */) + annotation(@JRubyMethod) + directive(public) ident(RubyString) ident(chomp)operator(()operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(chomp_bang)operator(()operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_chop + * + */) + annotation(@JRubyMethod) + directive(public) ident(RubyString) ident(chomp)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(chomp_bang)operator(()ident(arg0)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the zero or one argument versions. + */) + directive(public) ident(IRubyObject) ident(chomp_bang)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + keyword(return) ident(chomp_bang)operator(()operator(\))operator(;) + keyword(case) integer(1)operator(:) + keyword(return) ident(chomp_bang)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(default)operator(:) + ident(Arity)operator(.)ident(raiseArgumentError)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(.)ident(length)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(return) keyword(null)operator(;) comment(// not reached) + operator(}) + operator(}) + + comment(/** + * rb_str_chomp_bang + * + * In the common case, removes CR and LF characters in various ways depending on the value of + * the optional args[0]. + * If args.length==0 removes one instance of CR, CRLF or LF from the end of the string. + * If args.length>0 and args[0] is "\\n" then same behaviour as args.length==0 . + * If args.length>0 and args[0] is "" then removes trailing multiple LF or CRLF (but no CRs at + * all(!\)\). + * @param args See method description. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chomp!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(chomp_bang)operator(()operator(\)) operator({) + ident(IRubyObject) ident(rsObj)operator(;) + + type(int) ident(len) operator(=) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + type(byte)type([])ident(buff) operator(=) ident(value)operator(.)ident(bytes)operator(;) + + ident(rsObj) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($/)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()ident(rsObj) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(getDefaultSeparator)operator(()operator(\))operator(\)) operator({) + type(int) ident(realSize) operator(=) ident(value)operator(.)ident(realSize)operator(;) + type(int) ident(begin) operator(=) ident(value)operator(.)ident(begin)operator(;) + keyword(if) operator(()ident(buff)operator([)ident(begin) operator(+) ident(len) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\))string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + ident(realSize)operator(--)operator(;) + keyword(if) operator(()ident(realSize) operator(>) integer(0) operator(&&) ident(buff)operator([)ident(begin) operator(+) ident(realSize) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\))string<delimiter(')content(\\r)delimiter(')>operator(\)) ident(realSize)operator(--)operator(;) + ident(view)operator(()integer(0)operator(,) ident(realSize)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(buff)operator([)ident(begin) operator(+) ident(len) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\))string<delimiter(')content(\\r)delimiter(')>operator(\)) operator({) + ident(realSize)operator(--)operator(;) + ident(view)operator(()integer(0)operator(,) ident(realSize)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + keyword(return) ident(chompBangCommon)operator(()ident(rsObj)operator(\))operator(;) + operator(}) + + comment(/** + * rb_str_chomp_bang + * + * In the common case, removes CR and LF characters in various ways depending on the value of + * the optional args[0]. + * If args.length==0 removes one instance of CR, CRLF or LF from the end of the string. + * If args.length>0 and args[0] is "\\n" then same behaviour as args.length==0 . + * If args.length>0 and args[0] is "" then removes trailing multiple LF or CRLF (but no CRs at + * all(!\)\). + * @param args See method description. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(chomp!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(chomp_bang)operator(()ident(IRubyObject) ident(arg0)operator(\)) operator({) + keyword(return) ident(chompBangCommon)operator(()ident(arg0)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(chompBangCommon)operator(()ident(IRubyObject) ident(rsObj)operator(\)) operator({) + + keyword(if) operator(()ident(rsObj)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + ident(RubyString) ident(rs) operator(=) ident(rsObj)operator(.)ident(convertToString)operator(()operator(\))operator(;) + type(int) ident(len) operator(=) ident(value)operator(.)ident(realSize)operator(;) + type(int) ident(begin) operator(=) ident(value)operator(.)ident(begin)operator(;) + keyword(if) operator(()ident(len) operator(==) integer(0)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + type(byte)type([]) ident(buff) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(rslen) operator(=) ident(rs)operator(.)ident(value)operator(.)ident(realSize)operator(;) + + keyword(if) operator(()ident(rslen) operator(==) integer(0)operator(\)) operator({) + keyword(while) operator(()ident(len) operator(>) integer(0) operator(&&) ident(buff)operator([)ident(begin) operator(+) ident(len) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\)) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + ident(len)operator(--)operator(;) + keyword(if) operator(()ident(len) operator(>) integer(0) operator(&&) ident(buff)operator([)ident(begin) operator(+) ident(len) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\)) string<delimiter(')content(\\r)delimiter(')>operator(\)) operator({) + ident(len)operator(--)operator(;) + operator(}) + operator(}) + keyword(if) operator(()ident(len) operator(<) ident(value)operator(.)ident(realSize)operator(\)) operator({) + ident(view)operator(()integer(0)operator(,) ident(len)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(rslen) operator(>) ident(len)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + type(byte) ident(newline) operator(=) ident(rs)operator(.)ident(value)operator(.)ident(bytes)operator([)ident(rslen) operator(-) integer(1)operator(])operator(;) + + keyword(if) operator(()ident(rslen) operator(==) integer(1) operator(&&) ident(newline) operator(==) operator(()type(byte)operator(\)) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + ident(buff) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(realSize) operator(=) ident(value)operator(.)ident(realSize)operator(;) + keyword(if) operator(()ident(buff)operator([)ident(begin) operator(+) ident(len) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\)) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + ident(realSize)operator(--)operator(;) + keyword(if) operator(()ident(realSize) operator(>) integer(0) operator(&&) ident(buff)operator([)ident(begin) operator(+) ident(realSize) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\)) string<delimiter(')content(\\r)delimiter(')>operator(\)) operator({) + ident(realSize)operator(--)operator(;) + operator(}) + ident(view)operator(()integer(0)operator(,) ident(realSize)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(buff)operator([)ident(begin) operator(+) ident(len) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\)) string<delimiter(')content(\\r)delimiter(')>operator(\)) operator({) + ident(realSize)operator(--)operator(;) + ident(view)operator(()integer(0)operator(,) ident(realSize)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + keyword(if) operator(()ident(buff)operator([)ident(begin) operator(+) ident(len) operator(-) integer(1)operator(]) operator(==) ident(newline) operator(&&) ident(rslen) operator(<=) integer(1) operator(||) ident(value)operator(.)ident(endsWith)operator(()ident(rs)operator(.)ident(value)operator(\))operator(\)) operator({) + ident(view)operator(()integer(0)operator(,) ident(value)operator(.)ident(realSize) operator(-) ident(rslen)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_lstrip + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(lstrip)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(lstrip_bang)operator(()operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_lstrip_bang + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lstrip!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(lstrip_bang)operator(()operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + type(int) ident(i)operator(=)integer(0)operator(;) + keyword(while) operator(()ident(i) operator(<) ident(value)operator(.)ident(realSize) operator(&&) ident(ASCII)operator(.)ident(isSpace)operator(()ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin) operator(+) ident(i)operator(]) operator(&) hex(0xff)operator(\))operator(\)) ident(i)operator(++)operator(;) + + keyword(if) operator(()ident(i) operator(>) integer(0)operator(\)) operator({) + ident(view)operator(()ident(i)operator(,) ident(value)operator(.)ident(realSize) operator(-) ident(i)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_rstrip + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(rstrip)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(rstrip_bang)operator(()operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_rstrip_bang + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rstrip!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rstrip_bang)operator(()operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + type(int) ident(i)operator(=)ident(value)operator(.)ident(realSize) operator(-) integer(1)operator(;) + + keyword(while) operator(()ident(i) operator(>=) integer(0) operator(&&) ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin)operator(+)ident(i)operator(]) operator(==) integer(0)operator(\)) ident(i)operator(--)operator(;) + keyword(while) operator(()ident(i) operator(>=) integer(0) operator(&&) ident(ASCII)operator(.)ident(isSpace)operator(()ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin) operator(+) ident(i)operator(]) operator(&) hex(0xff)operator(\))operator(\)) ident(i)operator(--)operator(;) + + keyword(if) operator(()ident(i) operator(<) ident(value)operator(.)ident(realSize) operator(-) integer(1)operator(\)) operator({) + ident(view)operator(()integer(0)operator(,) ident(i) operator(+) integer(1)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_strip + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(strip)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(strip_bang)operator(()operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_strip_bang + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(strip!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(strip_bang)operator(()operator(\)) operator({) + ident(IRubyObject) ident(l) operator(=) ident(lstrip_bang)operator(()operator(\))operator(;) + ident(IRubyObject) ident(r) operator(=) ident(rstrip_bang)operator(()operator(\))operator(;) + + keyword(if)operator(()ident(l)operator(.)ident(isNil)operator(()operator(\)) operator(&&) ident(r)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(l)operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_str_count + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(count)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(count)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(<) integer(1)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(;) + + type(boolean)type([])ident(table) operator(=) keyword(new) type(boolean)operator([)ident(TRANS_SIZE)operator(])operator(;) + type(boolean) ident(init) operator(=) keyword(true)operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyString) ident(s) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(s)operator(.)ident(setup_table)operator(()ident(table)operator(,) ident(init)operator(\))operator(;) + ident(init) operator(=) keyword(false)operator(;) + operator(}) + + type(int) ident(s) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(send) operator(=) ident(s) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(byte)type([])ident(buf) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(i) operator(=) integer(0)operator(;) + + keyword(while) operator(()ident(s) operator(<) ident(send)operator(\)) keyword(if) operator(()ident(table)operator([)ident(buf)operator([)ident(s)operator(++)operator(]) operator(&) hex(0xff)operator(])operator(\)) ident(i)operator(++)operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(i)operator(\))operator(;) + operator(}) + + comment(/** rb_str_delete + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(delete)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(delete)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(delete_bang)operator(()ident(args)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_delete_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(delete!)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(delete_bang)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(<) integer(1)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments)delimiter(")>operator(\))operator(;) + + type(boolean)type([])ident(squeeze) operator(=) keyword(new) type(boolean)operator([)ident(TRANS_SIZE)operator(])operator(;) + + type(boolean) ident(init) operator(=) keyword(true)operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyString) ident(s) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(s)operator(.)ident(setup_table)operator(()ident(squeeze)operator(,) ident(init)operator(\))operator(;) + ident(init) operator(=) keyword(false)operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + type(int) ident(s) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(t) operator(=) ident(s)operator(;) + type(int) ident(send) operator(=) ident(s) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(byte)type([])ident(buf) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(boolean) ident(modify) operator(=) keyword(false)operator(;) + + keyword(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + keyword(if) operator(()ident(squeeze)operator([)ident(buf)operator([)ident(s)operator(]) operator(&) hex(0xff)operator(])operator(\)) operator({) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) keyword(else) operator({) + ident(buf)operator([)ident(t)operator(++)operator(]) operator(=) ident(buf)operator([)ident(s)operator(])operator(;) + operator(}) + ident(s)operator(++)operator(;) + operator(}) + ident(value)operator(.)ident(realSize) operator(=) ident(t) operator(-) ident(value)operator(.)ident(begin)operator(;) + + keyword(if) operator(()ident(modify)operator(\)) keyword(return) local_variable(this)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_squeeze + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(squeeze)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(squeeze)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(squeeze_bang)operator(()ident(args)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_squeeze_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(squeeze!)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(squeeze_bang)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(modifyCheck)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(final) type(boolean) ident(squeeze)type([]) operator(=) keyword(new) type(boolean)operator([)ident(TRANS_SIZE)operator(])operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(TRANS_SIZE)operator(;) ident(i)operator(++)operator(\)) ident(squeeze)operator([)ident(i)operator(]) operator(=) keyword(true)operator(;) + operator(}) keyword(else) operator({) + type(boolean) ident(init) operator(=) keyword(true)operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubyString) ident(s) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(s)operator(.)ident(setup_table)operator(()ident(squeeze)operator(,) ident(init)operator(\))operator(;) + ident(init) operator(=) keyword(false)operator(;) + operator(}) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + type(int) ident(s) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(t) operator(=) ident(s)operator(;) + type(int) ident(send) operator(=) ident(s) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(byte)type([])ident(buf) operator(=) ident(value)operator(.)ident(bytes)operator(;) + type(int) ident(save) operator(=) operator(-)integer(1)operator(;) + + keyword(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + type(int) ident(c) operator(=) ident(buf)operator([)ident(s)operator(++)operator(]) operator(&) hex(0xff)operator(;) + keyword(if) operator(()ident(c) operator(!=) ident(save) operator(||) operator(!)ident(squeeze)operator([)ident(c)operator(])operator(\)) ident(buf)operator([)ident(t)operator(++)operator(]) operator(=) operator(()type(byte)operator(\))operator(()ident(save) operator(=) ident(c)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(t) operator(-) ident(value)operator(.)ident(begin) operator(!=) ident(value)operator(.)ident(realSize)operator(\)) operator({) comment(// modified) + ident(value)operator(.)ident(realSize) operator(=) ident(t) operator(-) ident(value)operator(.)ident(begin)operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** rb_str_tr + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(tr)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(src)operator(,) ident(IRubyObject) ident(repl)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(tr_trans)operator(()ident(src)operator(,) ident(repl)operator(,) keyword(false)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_tr_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(tr!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(tr_bang)operator(()ident(IRubyObject) ident(src)operator(,) ident(IRubyObject) ident(repl)operator(\)) operator({) + keyword(return) ident(tr_trans)operator(()ident(src)operator(,) ident(repl)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(class) class(TR) operator({) + type(int) ident(gen)operator(,) ident(now)operator(,) ident(max)operator(;) + type(int) ident(p)operator(,) ident(pend)operator(;) + type(byte)type([])ident(buf)operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(int) ident(TRANS_SIZE) operator(=) integer(256)operator(;) + + comment(/** tr_setup_table + * + */) + directive(private) directive(final) type(void) ident(setup_table)operator(()type(boolean)type([])ident(table)operator(,) type(boolean) ident(init)operator(\)) operator({) + directive(final) type(boolean)type([])ident(buf) operator(=) keyword(new) type(boolean)operator([)ident(TRANS_SIZE)operator(])operator(;) + directive(final) ident(TR) ident(tr) operator(=) keyword(new) ident(TR)operator(()operator(\))operator(;) + type(int) ident(c)operator(;) + + type(boolean) ident(cflag) operator(=) keyword(false)operator(;) + + ident(tr)operator(.)ident(p) operator(=) ident(value)operator(.)ident(begin)operator(;) + ident(tr)operator(.)ident(pend) operator(=) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(;) + ident(tr)operator(.)ident(buf) operator(=) ident(value)operator(.)ident(bytes)operator(;) + ident(tr)operator(.)ident(gen) operator(=) ident(tr)operator(.)ident(now) operator(=) ident(tr)operator(.)ident(max) operator(=) integer(0)operator(;) + + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(>) integer(1) operator(&&) ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin)operator(]) operator(==) string<delimiter(')content(^)delimiter(')>operator(\)) operator({) + ident(cflag) operator(=) keyword(true)operator(;) + ident(tr)operator(.)ident(p)operator(++)operator(;) + operator(}) + + keyword(if) operator(()ident(init)operator(\)) keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(TRANS_SIZE)operator(;) ident(i)operator(++)operator(\)) ident(table)operator([)ident(i)operator(]) operator(=) keyword(true)operator(;) + + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(TRANS_SIZE)operator(;) ident(i)operator(++)operator(\)) ident(buf)operator([)ident(i)operator(]) operator(=) ident(cflag)operator(;) + keyword(while) operator(()operator(()ident(c) operator(=) ident(trnext)operator(()ident(tr)operator(\))operator(\)) operator(>=) integer(0)operator(\)) ident(buf)operator([)ident(c) operator(&) hex(0xff)operator(]) operator(=) operator(!)ident(cflag)operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(TRANS_SIZE)operator(;) ident(i)operator(++)operator(\)) ident(table)operator([)ident(i)operator(]) operator(=) ident(table)operator([)ident(i)operator(]) operator(&&) ident(buf)operator([)ident(i)operator(])operator(;) + operator(}) + + comment(/** tr_trans + * + */) + directive(private) directive(final) ident(IRubyObject) ident(tr_trans)operator(()ident(IRubyObject) ident(src)operator(,) ident(IRubyObject) ident(repl)operator(,) type(boolean) ident(sflag)operator(\)) operator({) + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(ByteList) ident(replList) operator(=) ident(repl)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(value)operator(;) + + keyword(if) operator(()ident(replList)operator(.)ident(realSize) operator(==) integer(0)operator(\)) keyword(return) ident(delete_bang)operator(()keyword(new) ident(IRubyObject)type([])operator({)ident(src)operator(})operator(\))operator(;) + + ident(ByteList) ident(srcList) operator(=) ident(src)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(value)operator(;) + + directive(final) ident(TR) ident(trsrc) operator(=) keyword(new) ident(TR)operator(()operator(\))operator(;) + directive(final) ident(TR) ident(trrepl) operator(=) keyword(new) ident(TR)operator(()operator(\))operator(;) + + type(boolean) ident(cflag) operator(=) keyword(false)operator(;) + type(boolean) ident(modify) operator(=) keyword(false)operator(;) + + ident(trsrc)operator(.)ident(p) operator(=) ident(srcList)operator(.)ident(begin)operator(;) + ident(trsrc)operator(.)ident(pend) operator(=) ident(srcList)operator(.)ident(begin) operator(+) ident(srcList)operator(.)ident(realSize)operator(;) + ident(trsrc)operator(.)ident(buf) operator(=) ident(srcList)operator(.)ident(bytes)operator(;) + keyword(if) operator(()ident(srcList)operator(.)ident(realSize) operator(>=) integer(2) operator(&&) ident(srcList)operator(.)ident(bytes)operator([)ident(srcList)operator(.)ident(begin)operator(]) operator(==) string<delimiter(')content(^)delimiter(')>operator(\)) operator({) + ident(cflag) operator(=) keyword(true)operator(;) + ident(trsrc)operator(.)ident(p)operator(++)operator(;) + operator(}) + + ident(trrepl)operator(.)ident(p) operator(=) ident(replList)operator(.)ident(begin)operator(;) + ident(trrepl)operator(.)ident(pend) operator(=) ident(replList)operator(.)ident(begin) operator(+) ident(replList)operator(.)ident(realSize)operator(;) + ident(trrepl)operator(.)ident(buf) operator(=) ident(replList)operator(.)ident(bytes)operator(;) + + ident(trsrc)operator(.)ident(gen) operator(=) ident(trrepl)operator(.)ident(gen) operator(=) integer(0)operator(;) + ident(trsrc)operator(.)ident(now) operator(=) ident(trrepl)operator(.)ident(now) operator(=) integer(0)operator(;) + ident(trsrc)operator(.)ident(max) operator(=) ident(trrepl)operator(.)ident(max) operator(=) integer(0)operator(;) + + type(int) ident(c)operator(;) + directive(final) type(int)type([])ident(trans) operator(=) keyword(new) type(int)operator([)ident(TRANS_SIZE)operator(])operator(;) + keyword(if) operator(()ident(cflag)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(TRANS_SIZE)operator(;) ident(i)operator(++)operator(\)) ident(trans)operator([)ident(i)operator(]) operator(=) integer(1)operator(;) + keyword(while) operator(()operator(()ident(c) operator(=) ident(trnext)operator(()ident(trsrc)operator(\))operator(\)) operator(>=) integer(0)operator(\)) ident(trans)operator([)ident(c) operator(&) hex(0xff)operator(]) operator(=) operator(-)integer(1)operator(;) + keyword(while) operator(()operator(()ident(c) operator(=) ident(trnext)operator(()ident(trrepl)operator(\))operator(\)) operator(>=) integer(0)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(TRANS_SIZE)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(trans)operator([)ident(i)operator(]) operator(>=) integer(0)operator(\)) ident(trans)operator([)ident(i)operator(]) operator(=) ident(trrepl)operator(.)ident(now)operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(;) ident(i)operator(<)ident(TRANS_SIZE)operator(;) ident(i)operator(++)operator(\)) ident(trans)operator([)ident(i)operator(]) operator(=) operator(-)integer(1)operator(;) + keyword(while) operator(()operator(()ident(c) operator(=) ident(trnext)operator(()ident(trsrc)operator(\))operator(\)) operator(>=) integer(0)operator(\)) operator({) + type(int) ident(r) operator(=) ident(trnext)operator(()ident(trrepl)operator(\))operator(;) + keyword(if) operator(()ident(r) operator(==) operator(-)integer(1)operator(\)) ident(r) operator(=) ident(trrepl)operator(.)ident(now)operator(;) + ident(trans)operator([)ident(c) operator(&) hex(0xff)operator(]) operator(=) ident(r)operator(;) + operator(}) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + + type(int) ident(s) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(send) operator(=) ident(s) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(byte) ident(sbuf)type([]) operator(=) ident(value)operator(.)ident(bytes)operator(;) + + keyword(if) operator(()ident(sflag)operator(\)) operator({) + type(int) ident(t) operator(=) ident(s)operator(;) + type(int) ident(c0)operator(,) ident(last) operator(=) operator(-)integer(1)operator(;) + keyword(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + ident(c0) operator(=) ident(sbuf)operator([)ident(s)operator(++)operator(])operator(;) + keyword(if) operator(()operator(()ident(c) operator(=) ident(trans)operator([)ident(c0) operator(&) hex(0xff)operator(])operator(\)) operator(>=) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(last) operator(==) ident(c)operator(\)) keyword(continue)operator(;) + ident(last) operator(=) ident(c)operator(;) + ident(sbuf)operator([)ident(t)operator(++)operator(]) operator(=) operator(()type(byte)operator(\))operator(()ident(c) operator(&) hex(0xff)operator(\))operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) keyword(else) operator({) + ident(last) operator(=) operator(-)integer(1)operator(;) + ident(sbuf)operator([)ident(t)operator(++)operator(]) operator(=) operator(()type(byte)operator(\))ident(c0)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(value)operator(.)ident(realSize) operator(>) operator(()ident(t) operator(-) ident(value)operator(.)ident(begin)operator(\))operator(\)) operator({) + ident(value)operator(.)ident(realSize) operator(=) ident(t) operator(-) ident(value)operator(.)ident(begin)operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(while) operator(()ident(s) operator(<) ident(send)operator(\)) operator({) + keyword(if) operator(()operator(()ident(c) operator(=) ident(trans)operator([)ident(sbuf)operator([)ident(s)operator(]) operator(&) hex(0xff)operator(])operator(\)) operator(>=) integer(0)operator(\)) operator({) + ident(sbuf)operator([)ident(s)operator(]) operator(=) operator(()type(byte)operator(\))operator(()ident(c) operator(&) hex(0xff)operator(\))operator(;) + ident(modify) operator(=) keyword(true)operator(;) + operator(}) + ident(s)operator(++)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(modify)operator(\)) keyword(return) local_variable(this)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** trnext + * + */) + directive(private) directive(final) type(int) ident(trnext)operator(()ident(TR) ident(t)operator(\)) operator({) + type(byte) type([]) ident(buf) operator(=) ident(t)operator(.)ident(buf)operator(;) + + keyword(for) operator(()operator(;)operator(;)operator(\)) operator({) + keyword(if) operator(()ident(t)operator(.)ident(gen) operator(==) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(t)operator(.)ident(p) operator(==) ident(t)operator(.)ident(pend)operator(\)) keyword(return) operator(-)integer(1)operator(;) + keyword(if) operator(()ident(t)operator(.)ident(p) operator(<) ident(t)operator(.)ident(pend) operator(-)integer(1) operator(&&) ident(buf)operator([)ident(t)operator(.)ident(p)operator(]) operator(==) string<delimiter(')char(\\\\)delimiter(')>operator(\)) ident(t)operator(.)ident(p)operator(++)operator(;) + ident(t)operator(.)ident(now) operator(=) ident(buf)operator([)ident(t)operator(.)ident(p)operator(++)operator(])operator(;) + keyword(if) operator(()ident(t)operator(.)ident(p) operator(<) ident(t)operator(.)ident(pend) operator(-) integer(1) operator(&&) ident(buf)operator([)ident(t)operator(.)ident(p)operator(]) operator(==) string<delimiter(')content(-)delimiter(')>operator(\)) operator({) + ident(t)operator(.)ident(p)operator(++)operator(;) + keyword(if) operator(()ident(t)operator(.)ident(p) operator(<) ident(t)operator(.)ident(pend)operator(\)) operator({) + keyword(if) operator(()ident(t)operator(.)ident(now) operator(>) operator(()operator(()type(int)operator(\))ident(buf)operator([)ident(t)operator(.)ident(p)operator(]) operator(&) hex(0xFF)operator(\))operator(\)) operator({) + ident(t)operator(.)ident(p)operator(++)operator(;) + keyword(continue)operator(;) + operator(}) + ident(t)operator(.)ident(gen) operator(=) integer(1)operator(;) + ident(t)operator(.)ident(max) operator(=) operator(()type(int)operator(\))ident(buf)operator([)ident(t)operator(.)ident(p)operator(++)operator(]) operator(&) hex(0xFF)operator(;) + operator(}) + operator(}) + keyword(return) ident(t)operator(.)ident(now) operator(&) hex(0xff)operator(;) + operator(}) keyword(else) keyword(if) operator(()operator(++)ident(t)operator(.)ident(now) operator(<) ident(t)operator(.)ident(max)operator(\)) operator({) + keyword(return) ident(t)operator(.)ident(now) operator(&) hex(0xff)operator(;) + operator(}) keyword(else) operator({) + ident(t)operator(.)ident(gen) operator(=) integer(0)operator(;) + keyword(return) ident(t)operator(.)ident(max) operator(&) hex(0xff)operator(;) + operator(}) + operator(}) + operator(}) + + comment(/** rb_str_tr_s + * + */) + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(tr_s)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(src)operator(,) ident(IRubyObject) ident(repl)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(str)operator(.)ident(tr_trans)operator(()ident(src)operator(,) ident(repl)operator(,) keyword(true)operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + comment(/** rb_str_tr_s_bang + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(tr_s!)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(tr_s_bang)operator(()ident(IRubyObject) ident(src)operator(,) ident(IRubyObject) ident(repl)operator(\)) operator({) + keyword(return) ident(tr_trans)operator(()ident(src)operator(,) ident(repl)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + comment(/** rb_str_each_line + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(each_line)delimiter(")>operator(,) string<delimiter(")content(each)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(0)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each_line)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(byte) ident(newline)operator(;) + type(int) ident(p) operator(=) ident(value)operator(.)ident(begin)operator(;) + type(int) ident(pend) operator(=) ident(p) operator(+) ident(value)operator(.)ident(realSize)operator(;) + type(int) ident(s)operator(;) + type(int) ident(ptr) operator(=) ident(p)operator(;) + type(int) ident(len) operator(=) ident(value)operator(.)ident(realSize)operator(;) + type(int) ident(rslen)operator(;) + ident(IRubyObject) ident(line)operator(;) + + + ident(IRubyObject) ident(_rsep)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(_rsep) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($/)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(_rsep) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + operator(}) + + keyword(if)operator(()ident(_rsep)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) local_variable(this)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + ident(RubyString) ident(rsep) operator(=) ident(stringValue)operator(()ident(_rsep)operator(\))operator(;) + ident(ByteList) ident(rsepValue) operator(=) ident(rsep)operator(.)ident(value)operator(;) + type(byte)type([]) ident(strBytes) operator(=) ident(value)operator(.)ident(bytes)operator(;) + + ident(rslen) operator(=) ident(rsepValue)operator(.)ident(realSize)operator(;) + + keyword(if)operator(()ident(rslen) operator(==) integer(0)operator(\)) operator({) + ident(newline) operator(=) string<delimiter(')content(\\n)delimiter(')>operator(;) + operator(}) keyword(else) operator({) + ident(newline) operator(=) ident(rsepValue)operator(.)ident(bytes)operator([)ident(rsepValue)operator(.)ident(begin) operator(+) ident(rslen)operator(-)integer(1)operator(])operator(;) + operator(}) + + ident(s) operator(=) ident(p)operator(;) + ident(p)operator(+=)ident(rslen)operator(;) + + keyword(for)operator(()operator(;) ident(p) operator(<) ident(pend)operator(;) ident(p)operator(++)operator(\)) operator({) + keyword(if)operator(()ident(rslen) operator(==) integer(0) operator(&&) ident(strBytes)operator([)ident(p)operator(]) operator(==) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + keyword(if)operator(()ident(strBytes)operator([)operator(++)ident(p)operator(]) operator(!=) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + keyword(continue)operator(;) + operator(}) + keyword(while)operator(()ident(p) operator(<) ident(pend) operator(&&) ident(strBytes)operator([)ident(p)operator(]) operator(==) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + ident(p)operator(++)operator(;) + operator(}) + operator(}) + keyword(if)operator(()ident(ptr)operator(<)ident(p) operator(&&) ident(strBytes)operator([)ident(p)operator(-)integer(1)operator(]) operator(==) ident(newline) operator(&&) + operator(()ident(rslen) operator(<=) integer(1) operator(||) + ident(ByteList)operator(.)ident(memcmp)operator(()ident(rsepValue)operator(.)ident(bytes)operator(,) ident(rsepValue)operator(.)ident(begin)operator(,) ident(rslen)operator(,) ident(strBytes)operator(,) ident(p)operator(-)ident(rslen)operator(,) ident(rslen)operator(\)) operator(==) integer(0)operator(\))operator(\)) operator({) + ident(line) operator(=) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) local_variable(this)operator(.)ident(value)operator(.)ident(makeShared)operator(()ident(s)operator(-)ident(ptr)operator(,) ident(p)operator(-)ident(s)operator(\))operator(\))operator(;) + ident(line)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(line)operator(\))operator(;) + ident(modifyCheck)operator(()ident(strBytes)operator(,)ident(len)operator(\))operator(;) + ident(s) operator(=) ident(p)operator(;) + operator(}) + operator(}) + + keyword(if)operator(()ident(s) operator(!=) ident(pend)operator(\)) operator({) + keyword(if)operator(()ident(p) operator(>) ident(pend)operator(\)) operator({) + ident(p) operator(=) ident(pend)operator(;) + operator(}) + ident(line) operator(=) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(,) local_variable(this)operator(.)ident(value)operator(.)ident(makeShared)operator(()ident(s)operator(-)ident(ptr)operator(,) ident(p)operator(-)ident(s)operator(\))operator(\))operator(;) + ident(line)operator(.)ident(infectBy)operator(()local_variable(this)operator(\))operator(;) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(line)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** + * rb_str_each_byte + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_byte)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyString) ident(each_byte)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + comment(// Check the length every iteration, since) + comment(// the block can modify this string.) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(value)operator(.)ident(get)operator(()ident(i)operator(\)) operator(&) hex(0xFF)operator(\))operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/** rb_str_intern + * + */) + directive(public) ident(RubySymbol) ident(intern)operator(()operator(\)) operator({) + type(String) ident(s) operator(=) ident(toString)operator(()operator(\))operator(;) + keyword(if) operator(()ident(s)operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(interning empty string)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(s)operator(.)ident(indexOf)operator(()string<delimiter(')content(\\0)delimiter(')>operator(\)) operator(>=) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(symbol string may not contain ')char(\\\\)content(0')delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newSymbol)operator(()ident(s)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_sym)delimiter(")>operator(,) string<delimiter(")content(intern)delimiter(")>operator(})operator(\)) + directive(public) ident(RubySymbol) ident(to_sym)operator(()operator(\)) operator({) + keyword(return) ident(intern)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sum)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(RubyInteger) ident(sum)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(wrong number of arguments ()delimiter(")> operator(+) ident(args)operator(.)ident(length) operator(+) string<delimiter(")content( for 1\))delimiter(")>operator(\))operator(;) + operator(}) + + type(long) ident(bitSize) operator(=) integer(16)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + type(long) ident(bitSizeArg) operator(=) operator(()operator(()ident(RubyInteger)operator(\)) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToInteger)operator(()operator(\))operator(\))operator(.)ident(getLongValue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(bitSizeArg) operator(>) integer(0)operator(\)) operator({) + ident(bitSize) operator(=) ident(bitSizeArg)operator(;) + operator(}) + operator(}) + + type(long) ident(result) operator(=) integer(0)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(value)operator(.)ident(length)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result) operator(+=) ident(value)operator(.)ident(get)operator(()ident(i)operator(\)) operator(&) hex(0xFF)operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(bitSize) operator(==) integer(0) operator(?) ident(result) operator(:) ident(result) operator(%) operator(()type(long)operator(\)) type(Math)operator(.)ident(pow)operator(()integer(2)operator(,) ident(bitSize)operator(\))operator(\))operator(;) + operator(}) + + comment(/** string_to_c + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_c)delimiter(")>operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(to_c)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + ident(IRubyObject) ident(backref) operator(=) ident(frame)operator(.)ident(getBackRef)operator(()operator(\))operator(;) + keyword(if) operator(()ident(backref) operator(!=) keyword(null) operator(&&) ident(backref) keyword(instanceof) ident(RubyMatchData)operator(\)) operator(()operator(()ident(RubyMatchData)operator(\))ident(backref)operator(\))operator(.)ident(use)operator(()operator(\))operator(;) + + ident(IRubyObject) ident(s) operator(=) ident(RuntimeHelpers)operator(.)ident(invoke)operator(() + ident(context)operator(,) local_variable(this)operator(,) string<delimiter(")content(gsub)delimiter(")>operator(,) + ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(Numeric)operator(.)ident(ComplexPatterns)operator(.)ident(underscores_pat)operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()keyword(new) ident(ByteList)operator(()keyword(new) type(byte)type([])operator({)string<delimiter(')content(_)delimiter(')>operator(})operator(\))operator(\))operator(\))operator(;) + + ident(RubyArray) ident(a) operator(=) ident(RubyComplex)operator(.)ident(str_to_c_internal)operator(()ident(context)operator(,) ident(s)operator(\))operator(;) + + ident(frame)operator(.)ident(setBackRef)operator(()ident(backref)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(RubyComplex)operator(.)ident(newComplexCanonicalize)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + comment(/** string_to_r + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_r)delimiter(")>operator(,) ident(reads) operator(=) ident(BACKREF)operator(,) ident(writes) operator(=) ident(BACKREF)operator(,) ident(compat) operator(=) ident(CompatVersion)operator(.)ident(RUBY1_9)operator(\)) + directive(public) ident(IRubyObject) ident(to_r)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + ident(IRubyObject) ident(backref) operator(=) ident(frame)operator(.)ident(getBackRef)operator(()operator(\))operator(;) + keyword(if) operator(()ident(backref) operator(!=) keyword(null) operator(&&) ident(backref) keyword(instanceof) ident(RubyMatchData)operator(\)) operator(()operator(()ident(RubyMatchData)operator(\))ident(backref)operator(\))operator(.)ident(use)operator(()operator(\))operator(;) + + ident(IRubyObject) ident(s) operator(=) ident(RuntimeHelpers)operator(.)ident(invoke)operator(() + ident(context)operator(,) local_variable(this)operator(,) string<delimiter(")content(gsub)delimiter(")>operator(,) + ident(RubyRegexp)operator(.)ident(newRegexp)operator(()ident(runtime)operator(,) ident(Numeric)operator(.)ident(ComplexPatterns)operator(.)ident(underscores_pat)operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()keyword(new) ident(ByteList)operator(()keyword(new) type(byte)type([])operator({)string<delimiter(')content(_)delimiter(')>operator(})operator(\))operator(\))operator(\))operator(;) + + ident(RubyArray) ident(a) operator(=) ident(RubyRational)operator(.)ident(str_to_r_internal)operator(()ident(context)operator(,) ident(s)operator(\))operator(;) + + ident(frame)operator(.)ident(setBackRef)operator(()ident(backref)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(a)operator(.)ident(eltInternal)operator(()integer(0)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(RubyRational)operator(.)ident(newRationalCanonicalize)operator(()ident(context)operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(runtime)operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(RubyString) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(RubyString) ident(result) operator(=) ident(newString)operator(()ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(input)operator(.)ident(unmarshalString)operator(()operator(\))operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + comment(/** + * @see org.jruby.util.Pack#unpack + */) + annotation(@JRubyMethod) + directive(public) ident(RubyArray) ident(unpack)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + keyword(return) ident(Pack)operator(.)ident(unpack)operator(()ident(getRuntime)operator(()operator(\))operator(,) local_variable(this)operator(.)ident(value)operator(,) ident(stringValue)operator(()ident(obj)operator(\))operator(.)ident(value)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(empty)operator(()operator(\)) operator({) + ident(value) operator(=) ident(ByteList)operator(.)ident(EMPTY_BYTELIST)operator(;) + ident(shareLevel) operator(=) ident(SHARE_LEVEL_BYTELIST)operator(;) + operator(}) + + comment(/** + * Mutator for internal string representation. + * + * @param value The new java.lang.String this RubyString should encapsulate + * @deprecated + */) + directive(public) type(void) ident(setValue)operator(()type(CharSequence) ident(value)operator(\)) operator({) + ident(view)operator(()ident(ByteList)operator(.)ident(plain)operator(()ident(value)operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(setValue)operator(()ident(ByteList) ident(value)operator(\)) operator({) + ident(view)operator(()ident(value)operator(\))operator(;) + operator(}) + + directive(public) type(CharSequence) ident(getValue)operator(()operator(\)) operator({) + keyword(return) ident(toString)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(byte)type([]) ident(getBytes)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(.)ident(bytes)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(ByteList) ident(getByteList)operator(()operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + + comment(/** used by ar-jdbc + * + */) + directive(public) type(String) ident(getUnicodeValue)operator(()operator(\)) operator({) + keyword(try) operator({) + keyword(return) keyword(new) type(String)operator(()ident(value)operator(.)ident(bytes)operator(,)ident(value)operator(.)ident(begin)operator(,)ident(value)operator(.)ident(realSize)operator(,) string<delimiter(")content(UTF8)delimiter(")>operator(\))operator(;) + operator(}) keyword(catch) operator(()type(Exception) ident(e)operator(\)) operator({) + keyword(throw) keyword(new) type(RuntimeException)operator(()string<delimiter(")content(Something's seriously broken with encodings)delimiter(")>operator(,) ident(e)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_java)operator(()operator(\)) operator({) + keyword(return) ident(MiniJava)operator(.)ident(javaToRuby)operator(()ident(getRuntime)operator(()operator(\))operator(,) keyword(new) type(String)operator(()ident(getBytes)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006 Ola Bini <ola@ologix.com> + * Copyright (C\) 2006 Ryan Bell <ryan.l.bell@gmail.com> + * Copyright (C\) 2007 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2008 Vladimir Sizikov <vsizikov@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.util.ArrayList)operator(;) +keyword(import) include(java.util.List)operator(;) + +keyword(import) include(org.jruby.anno.FrameField)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.TypeConverter)operator(;) +keyword(import) include(org.jruby.util.io.InvalidValueException)operator(;) +keyword(import) include(org.jruby.util.io.ModeFlags)operator(;) +keyword(import) include(org.jruby.util.io.Stream)operator(;) + +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(StringIO)delimiter(")>operator(\)) +directive(public) type(class) class(RubyStringIO) directive(extends) ident(RubyObject) operator({) + directive(private) directive(static) ident(ObjectAllocator) ident(STRINGIO_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyStringIO)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createStringIOClass)operator(()directive(final) ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(stringIOClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(() + string<delimiter(")content(StringIO)delimiter(")>operator(,) ident(runtime)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Data)delimiter(")>operator(\))operator(,) ident(STRINGIO_ALLOCATOR)operator(\))operator(;) + + ident(stringIOClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyStringIO)operator(.)ident(class)operator(\))operator(;) + ident(stringIOClass)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(stringIOClass)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(open)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(open)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyStringIO) ident(strio) operator(=) operator(()ident(RubyStringIO)operator(\))operator(()operator(()ident(RubyClass)operator(\))ident(recv)operator(\))operator(.)ident(newInstance)operator(()ident(context)operator(,) ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + ident(IRubyObject) ident(val) operator(=) ident(strio)operator(;) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(val) operator(=) ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(strio)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(strio)operator(.)ident(doFinalize)operator(()operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(val)operator(;) + operator(}) + + directive(protected) ident(RubyStringIO)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + + directive(private) type(long) ident(pos) operator(=) integer(0L)operator(;) + directive(private) type(int) ident(lineno) operator(=) integer(0)operator(;) + directive(private) type(boolean) ident(eof) operator(=) keyword(false)operator(;) + + comment(/** + * ATTN: the value of internal might be reset to null + * (during StringIO.open with block\), so watch out for that. + */) + directive(private) ident(RubyString) ident(internal)operator(;) + + comment(// Has read/write been closed or is it still open for business) + directive(private) type(boolean) ident(closedRead) operator(=) keyword(false)operator(;) + directive(private) type(boolean) ident(closedWrite) operator(=) keyword(false)operator(;) + + comment(// Support IO modes that this object was opened with) + ident(ModeFlags) ident(modes)operator(;) + + directive(private) type(void) ident(initializeModes)operator(()type(Object) ident(modeArgument)operator(\)) operator({) + keyword(try) operator({) + keyword(if) operator(()ident(modeArgument) operator(==) keyword(null)operator(\)) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(RubyIO)operator(.)ident(getIOModesIntFromString)operator(()ident(getRuntime)operator(()operator(\))operator(,) string<delimiter(")content(r+)delimiter(")>operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(modeArgument) keyword(instanceof) type(Long)operator(\)) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()operator(()operator(()type(Long)operator(\))ident(modeArgument)operator(\))operator(.)ident(longValue)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modes) operator(=) keyword(new) ident(ModeFlags)operator(()ident(RubyIO)operator(.)ident(getIOModesIntFromString)operator(()ident(getRuntime)operator(()operator(\))operator(,) operator(()type(String)operator(\)) ident(modeArgument)operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(catch) operator(()ident(InvalidValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + operator(}) + ident(setupModes)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + type(Object) ident(modeArgument) operator(=) keyword(null)operator(;) + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) + ident(internal) operator(=) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + ident(modeArgument) operator(=) string<delimiter(")content(r+)delimiter(")>operator(;) + keyword(break)operator(;) + keyword(case) integer(1)operator(:) + ident(internal) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + ident(modeArgument) operator(=) ident(internal)operator(.)ident(isFrozen)operator(()operator(\)) operator(?) string<delimiter(")content(r)delimiter(")> operator(:) string<delimiter(")content(r+)delimiter(")>operator(;) + keyword(break)operator(;) + keyword(case) integer(2)operator(:) + ident(internal) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + keyword(if) operator(()ident(args)operator([)integer(1)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(modeArgument) operator(=) ident(RubyFixnum)operator(.)ident(fix2long)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(modeArgument) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + keyword(break)operator(;) + operator(}) + + ident(initializeModes)operator(()ident(modeArgument)operator(\))operator(;) + + keyword(if) operator(()ident(modes)operator(.)ident(isWritable)operator(()operator(\)) operator(&&) ident(internal)operator(.)ident(isFrozen)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEACCESError)operator(()string<delimiter(")content(Permission denied)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(modes)operator(.)ident(isTruncate)operator(()operator(\))operator(\)) operator({) + ident(internal)operator(.)ident(modifyCheck)operator(()operator(\))operator(;) + ident(internal)operator(.)ident(empty)operator(()operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + + ident(RubyStringIO) ident(otherIO) operator(=) operator(()ident(RubyStringIO)operator(\)) ident(TypeConverter)operator(.)ident(convertToType)operator(() + ident(other)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(StringIO)delimiter(")>operator(\))operator(,) + ident(MethodIndex)operator(.)ident(getIndex)operator(()string<delimiter(")content(to_strio)delimiter(")>operator(\))operator(,) string<delimiter(")content(to_strio)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()local_variable(this) operator(==) ident(otherIO)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + ident(pos) operator(=) ident(otherIO)operator(.)ident(pos)operator(;) + ident(lineno) operator(=) ident(otherIO)operator(.)ident(lineno)operator(;) + ident(eof) operator(=) ident(otherIO)operator(.)ident(eof)operator(;) + ident(closedRead) operator(=) ident(otherIO)operator(.)ident(closedRead)operator(;) + ident(closedWrite) operator(=) ident(otherIO)operator(.)ident(closedWrite)operator(;) + ident(internal) operator(=) ident(otherIO)operator(.)ident(internal)operator(;) + ident(modes) operator(=) ident(otherIO)operator(.)ident(modes)operator(;) + keyword(if) operator(()ident(otherIO)operator(.)ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(setTaint)operator(()keyword(true)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(append)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(writeInternal)operator(()ident(context)operator(,) ident(arg)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(binmode)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(binmode)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(,) ident(frame)operator(=)keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) operator({) + ident(checkInitialized)operator(()operator(\))operator(;) + ident(checkOpen)operator(()operator(\))operator(;) + + ident(closedRead) operator(=) keyword(true)operator(;) + ident(closedWrite) operator(=) keyword(true)operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(doFinalize)operator(()operator(\)) operator({) + ident(closedRead) operator(=) keyword(true)operator(;) + ident(closedWrite) operator(=) keyword(true)operator(;) + ident(internal) operator(=) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(closed?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(closed_p)operator(()operator(\)) operator({) + ident(checkInitialized)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(closedRead) operator(&&) ident(closedWrite)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close_read)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close_read)operator(()operator(\)) operator({) + ident(checkReadable)operator(()operator(\))operator(;) + ident(closedRead) operator(=) keyword(true)operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(closed_read?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(closed_read_p)operator(()operator(\)) operator({) + ident(checkInitialized)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(closedRead)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close_write)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close_write)operator(()operator(\)) operator({) + ident(checkWritable)operator(()operator(\))operator(;) + ident(closedWrite) operator(=) keyword(true)operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(closed_write?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(closed_write_p)operator(()operator(\)) operator({) + ident(checkInitialized)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(closedWrite)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) ident(IRubyObject) ident(each)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(IRubyObject) ident(line) operator(=) ident(gets)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + + keyword(while) operator(()operator(!)ident(line)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(line)operator(\))operator(;) + ident(line) operator(=) ident(gets)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_byte)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each_byte)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(checkReadable)operator(()operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(ByteList) ident(bytes) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(;) + + comment(// Check the length every iteration, since) + comment(// the block can modify this string.) + keyword(while) operator(()ident(pos) operator(<) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newFixnum)operator(()ident(bytes)operator(.)ident(get)operator(()operator(()type(int)operator(\)) ident(pos)operator(++)operator(\)) operator(&) hex(0xFF)operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_line)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each_line)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(each)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(eof)delimiter(")>operator(,) string<delimiter(")content(eof?)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(eof)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isEOF)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) type(boolean) ident(isEOF)operator(()operator(\)) operator({) + keyword(return) operator(()ident(pos) operator(>=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(\)) operator(||) ident(eof)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fcntl)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(fcntl)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(fcntl not implemented)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fileno)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(fileno)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(flush)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(flush)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(fsync)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(fsync)operator(()operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getc)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(getc)operator(()operator(\)) operator({) + ident(checkReadable)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(get)operator(()operator(()type(int)operator(\))ident(pos)operator(++)operator(\)) operator(&) hex(0xFF)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(internalGets)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(<) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(&&) operator(!)ident(eof)operator(\)) operator({) + type(boolean) ident(isParagraph) operator(=) keyword(false)operator(;) + + ident(ByteList) ident(sep)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(ByteList) ident(buf) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(makeShared)operator(() + operator(()type(int)operator(\))ident(pos)operator(,) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(-) operator(()type(int)operator(\))ident(pos)operator(\))operator(;) + ident(pos) operator(+=) ident(buf)operator(.)ident(realSize)operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,) ident(buf)operator(\))operator(;) + operator(}) + ident(sep) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(sep)operator(.)ident(realSize) operator(==) integer(0)operator(\)) operator({) + ident(isParagraph) operator(=) keyword(true)operator(;) + ident(sep) operator(=) ident(Stream)operator(.)ident(PARAGRAPH_SEPARATOR)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(sep) operator(=) operator(()operator(()ident(RubyString)operator(\))ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($/)delimiter(")>operator(\))operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + operator(}) + + ident(ByteList) ident(ss) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(isParagraph)operator(\)) operator({) + ident(swallowLF)operator(()ident(ss)operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(==) ident(ss)operator(.)ident(realSize)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + type(int) ident(ix) operator(=) ident(ss)operator(.)ident(indexOf)operator(()ident(sep)operator(,) operator(()type(int)operator(\))ident(pos)operator(\))operator(;) + + ident(ByteList) ident(add)operator(;) + keyword(if) operator(()operator(-)integer(1) operator(==) ident(ix)operator(\)) operator({) + ident(ix) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(;) + ident(add) operator(=) keyword(new) ident(ByteList)operator(()keyword(new) type(byte)operator([)integer(0)operator(])operator(,) keyword(false)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(add) operator(=) ident(isParagraph)operator(?) ident(NEWLINE) operator(:) ident(sep)operator(;) + operator(}) + + ident(ByteList) ident(line) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(makeShared)operator(()operator(()type(int)operator(\))ident(pos)operator(,) ident(ix) operator(-) operator(()type(int)operator(\))ident(pos)operator(\))operator(;) + ident(line)operator(.)ident(unshare)operator(()operator(\))operator(;) + ident(line)operator(.)ident(append)operator(()ident(add)operator(\))operator(;) + ident(line)operator(.)ident(invalidate)operator(()operator(\))operator(;) + ident(pos) operator(=) ident(ix) operator(+) ident(add)operator(.)ident(realSize)operator(;) + ident(lineno)operator(++)operator(;) + + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(runtime)operator(,)ident(line)operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(swallowLF)operator(()ident(ByteList) ident(list)operator(\)) operator({) + keyword(while) operator(()ident(pos) operator(<) ident(list)operator(.)ident(realSize)operator(\)) operator({) + keyword(if) operator(()ident(list)operator(.)ident(get)operator(()operator(()type(int)operator(\))ident(pos)operator(\)) operator(==) string<delimiter(')content(\\n)delimiter(')>operator(\)) operator({) + ident(pos)operator(++)operator(;) + operator(}) keyword(else) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gets)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) ident(IRubyObject) ident(gets)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(checkReadable)operator(()operator(\))operator(;) + + ident(IRubyObject) ident(result) operator(=) ident(internalGets)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(result)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(tty?)delimiter(")>operator(,) string<delimiter(")content(isatty)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(isatty)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(length)delimiter(")>operator(,) string<delimiter(")content(size)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(length)operator(()operator(\)) operator({) + ident(checkFinalized)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lineno)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(lineno)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(lineno)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lineno=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_lineno)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(lineno) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg)operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(path)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(path)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pid)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(pid)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(pos)delimiter(")>operator(,) string<delimiter(")content(tell)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(pos)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(pos)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pos=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_pos)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(pos) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()string<delimiter(")content(Invalid argument)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(print)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(print)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(0)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i)operator(=)integer(0)operator(,)ident(j)operator(=)ident(args)operator(.)ident(length)operator(;)ident(i)operator(<)ident(j)operator(;)ident(i)operator(++)operator(\)) operator({) + ident(append)operator(()ident(context)operator(,) ident(args)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(arg) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($_)delimiter(")>operator(\))operator(;) + ident(append)operator(()ident(context)operator(,) ident(arg)operator(.)ident(isNil)operator(()operator(\)) operator(?) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(nil)delimiter(")>operator(\)) operator(:) ident(arg)operator(\))operator(;) + operator(}) + ident(IRubyObject) ident(sep) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($)char(\\\\)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(!)ident(sep)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(append)operator(()ident(context)operator(,) ident(sep)operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(printf)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(printf)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(append)operator(()ident(context)operator(,) ident(RubyKernel)operator(.)ident(sprintf)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(args)operator(\))operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(putc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(putc)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(checkWritable)operator(()operator(\))operator(;) + type(byte) ident(c) operator(=) ident(RubyNumeric)operator(.)ident(num2chr)operator(()ident(obj)operator(\))operator(;) + ident(checkFrozen)operator(()operator(\))operator(;) + + ident(internal)operator(.)ident(modify)operator(()operator(\))operator(;) + ident(ByteList) ident(bytes) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(modes)operator(.)ident(isAppendable)operator(()operator(\))operator(\)) operator({) + ident(pos) operator(=) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(;) + ident(bytes)operator(.)ident(append)operator(()ident(c)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(pos) operator(>=) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + ident(bytes)operator(.)ident(length)operator(()operator(()type(int)operator(\))ident(pos) operator(+) integer(1)operator(\))operator(;) + operator(}) + + ident(bytes)operator(.)ident(set)operator(()operator(()type(int)operator(\)) ident(pos)operator(,) ident(c)operator(\))operator(;) + ident(pos)operator(++)operator(;) + operator(}) + + keyword(return) ident(obj)operator(;) + operator(}) + + directive(public) directive(static) directive(final) ident(ByteList) ident(NEWLINE) operator(=) ident(ByteList)operator(.)ident(create)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(puts)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(puts)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(checkWritable)operator(()operator(\))operator(;) + + comment(// FIXME: the code below is a copy of RubyIO.puts,) + comment(// and we should avoid copy-paste.) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(NEWLINE)operator(\))operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + type(String) ident(line)operator(;) + + keyword(if) operator(()ident(args)operator([)ident(i)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(line) operator(=) string<delimiter(")content(nil)delimiter(")>operator(;) + operator(}) keyword(else) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(checkArrayType)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(RubyArray) ident(arr) operator(=) operator(()ident(RubyArray)operator(\)) ident(tmp)operator(;) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(isInspecting)operator(()ident(arr)operator(\))operator(\)) operator({) + ident(line) operator(=) string<delimiter(")content([...])delimiter(")>operator(;) + operator(}) keyword(else) operator({) + ident(inspectPuts)operator(()ident(context)operator(,) ident(arr)operator(\))operator(;) + keyword(continue)operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(line) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + operator(}) + + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(line)operator(\))operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(line)operator(.)ident(endsWith)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))operator(\)) operator({) + ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(write)delimiter(")>operator(,) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(NEWLINE)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(inspectPuts)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyArray) ident(array)operator(\)) operator({) + keyword(try) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(registerInspecting)operator(()ident(array)operator(\))operator(;) + keyword(return) ident(puts)operator(()ident(context)operator(,) ident(array)operator(.)ident(toJavaArray)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(unregisterInspecting)operator(()ident(array)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@SuppressWarnings)operator(()string<delimiter(")content(fallthrough)delimiter(")>operator(\)) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(read)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(checkReadable)operator(()operator(\))operator(;) + + ident(ByteList) ident(buf) operator(=) keyword(null)operator(;) + type(int) ident(length) operator(=) integer(0)operator(;) + type(int) ident(oldLength) operator(=) integer(0)operator(;) + ident(RubyString) ident(originalString) operator(=) keyword(null)operator(;) + + keyword(switch) operator(()ident(args)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(2)operator(:) + ident(originalString) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + comment(// must let original string know we're modifying, so shared buffers aren't damaged) + ident(originalString)operator(.)ident(modify)operator(()operator(\))operator(;) + ident(buf) operator(=) ident(originalString)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(case) integer(1)operator(:) + keyword(if) operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(length) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + ident(oldLength) operator(=) ident(length)operator(;) + + keyword(if) operator(()ident(length) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative length )delimiter(")> operator(+) ident(length) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + operator(}) + keyword(if) operator(()ident(length) operator(>) integer(0) operator(&&) ident(pos) operator(>=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(\)) operator({) + ident(eof) operator(=) keyword(true)operator(;) + keyword(if) operator(()ident(buf) operator(!=) keyword(null)operator(\)) ident(buf)operator(.)ident(realSize) operator(=) integer(0)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(eof)operator(\)) operator({) + keyword(if) operator(()ident(buf) operator(!=) keyword(null)operator(\)) ident(buf)operator(.)ident(realSize) operator(=) integer(0)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(break)operator(;) + operator(}) + keyword(case) integer(0)operator(:) + ident(oldLength) operator(=) operator(-)integer(1)operator(;) + ident(length) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(length) operator(<=) ident(pos)operator(\)) operator({) + ident(eof) operator(=) keyword(true)operator(;) + keyword(if) operator(()ident(buf) operator(==) keyword(null)operator(\)) operator({) + ident(buf) operator(=) keyword(new) ident(ByteList)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(buf)operator(.)ident(realSize) operator(=) integer(0)operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buf)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(length) operator(-=) ident(pos)operator(;) + operator(}) + keyword(break)operator(;) + keyword(default)operator(:) + ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,) integer(0)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(buf) operator(==) keyword(null)operator(\)) operator({) + type(int) ident(internalLength) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(internalLength) operator(>) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(internalLength) operator(>=) ident(pos) operator(+) ident(length)operator(\)) operator({) + ident(buf) operator(=) keyword(new) ident(ByteList)operator(()ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(,) operator(()type(int)operator(\)) ident(pos)operator(,) ident(length)operator(\))operator(;) + operator(}) keyword(else) operator({) + type(int) ident(rest) operator(=) operator(()type(int)operator(\)) operator(()ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(-) ident(pos)operator(\))operator(;) + + keyword(if) operator(()ident(length) operator(>) ident(rest)operator(\)) ident(length) operator(=) ident(rest)operator(;) + ident(buf) operator(=) keyword(new) ident(ByteList)operator(()ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(,) operator(()type(int)operator(\)) ident(pos)operator(,) ident(length)operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + type(int) ident(rest) operator(=) operator(()type(int)operator(\)) operator(()ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(-) ident(pos)operator(\))operator(;) + + keyword(if) operator(()ident(length) operator(>) ident(rest)operator(\)) ident(length) operator(=) ident(rest)operator(;) + + comment(// Yow...this is ugly) + ident(buf)operator(.)ident(realSize) operator(=) ident(length)operator(;) + ident(buf)operator(.)ident(replace)operator(()integer(0)operator(,) ident(length)operator(,) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(bytes)operator(,) operator(()type(int)operator(\)) ident(pos)operator(,) ident(length)operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(buf) operator(==) keyword(null)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(eof)operator(\)) ident(buf) operator(=) keyword(new) ident(ByteList)operator(()operator(\))operator(;) + ident(length) operator(=) integer(0)operator(;) + operator(}) keyword(else) operator({) + ident(length) operator(=) ident(buf)operator(.)ident(length)operator(()operator(\))operator(;) + ident(pos) operator(+=) ident(length)operator(;) + operator(}) + + keyword(if) operator(()ident(oldLength) operator(<) integer(0) operator(||) ident(oldLength) operator(>) ident(length)operator(\)) ident(eof) operator(=) keyword(true)operator(;) + + keyword(return) ident(originalString) operator(!=) keyword(null) operator(?) ident(originalString) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buf)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readchar)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(readchar)operator(()operator(\)) operator({) + ident(IRubyObject) ident(c) operator(=) ident(getc)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(c)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + + keyword(return) ident(c)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readline)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) ident(IRubyObject) ident(readline)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(line) operator(=) ident(gets)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + + keyword(if) operator(()ident(line)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + + keyword(return) ident(line)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(readlines)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(arg)operator(\)) operator({) + ident(checkReadable)operator(()operator(\))operator(;) + + type(List)operator(<)ident(IRubyObject)operator(>) ident(lns) operator(=) keyword(new) type(ArrayList)operator(<)ident(IRubyObject)operator(>)operator(()operator(\))operator(;) + keyword(while) operator(()operator(!)operator(()ident(isEOF)operator(()operator(\))operator(\))operator(\)) operator({) + ident(IRubyObject) ident(line) operator(=) ident(internalGets)operator(()ident(context)operator(,) ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(line)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(lns)operator(.)ident(add)operator(()ident(line)operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(lns)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reopen)delimiter(")>operator(,) ident(required) operator(=) integer(0)operator(,) ident(optional) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(reopen)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1) operator(&&) operator(!)operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + keyword(return) ident(initialize_copy)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + + comment(// reset the state) + ident(doRewind)operator(()operator(\))operator(;) + ident(closedRead) operator(=) keyword(false)operator(;) + ident(closedWrite) operator(=) keyword(false)operator(;) + keyword(return) ident(initialize)operator(()ident(args)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rewind)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rewind)operator(()operator(\)) operator({) + ident(doRewind)operator(()operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(doRewind)operator(()operator(\)) operator({) + local_variable(this)operator(.)ident(pos) operator(=) integer(0L)operator(;) + local_variable(this)operator(.)ident(eof) operator(=) keyword(false)operator(;) + local_variable(this)operator(.)ident(lineno) operator(=) integer(0)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(seek)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame)operator(=)keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(seek)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + comment(// MRI 1.8.7 behavior:) + comment(// checkOpen(\);) + ident(checkFinalized)operator(()operator(\))operator(;) + type(long) ident(amount) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + type(int) ident(whence) operator(=) ident(Stream)operator(.)ident(SEEK_SET)operator(;) + type(long) ident(newPosition) operator(=) ident(pos)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1) operator(&&) operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(whence) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + + keyword(if) operator(()ident(whence) operator(==) ident(Stream)operator(.)ident(SEEK_CUR)operator(\)) operator({) + ident(newPosition) operator(+=) ident(amount)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(whence) operator(==) ident(Stream)operator(.)ident(SEEK_END)operator(\)) operator({) + ident(newPosition) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(+) ident(amount)operator(;) + operator(}) keyword(else) operator({) + ident(newPosition) operator(=) ident(amount)operator(;) + operator(}) + + keyword(if) operator(()ident(newPosition) operator(<) integer(0)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()operator(\))operator(;) + + ident(pos) operator(=) ident(newPosition)operator(;) + ident(eof) operator(=) keyword(false)operator(;) + + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(string=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_string)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(reopen)operator(()keyword(new) ident(IRubyObject)type([]) operator({) ident(arg)operator(.)ident(convertToString)operator(()operator(\)) operator(})operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sync=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_sync)operator(()ident(IRubyObject) ident(args)operator(\)) operator({) + keyword(return) ident(args)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(string)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(string)operator(()operator(\)) operator({) + keyword(if) operator(()ident(internal) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(internal)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sync)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(sync)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sysread)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(sysread)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(obj) operator(=) ident(read)operator(()ident(args)operator(\))operator(;) + + keyword(if) operator(()ident(isEOF)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(obj)operator(.)ident(isNil)operator(()operator(\)) operator(||) operator(()operator(()ident(RubyString)operator(\)) ident(obj)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\)) operator(==) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(obj)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(truncate)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(truncate)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(checkWritable)operator(()operator(\))operator(;) + + type(int) ident(len) operator(=) ident(RubyFixnum)operator(.)ident(fix2int)operator(()ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newErrnoEINVALError)operator(()string<delimiter(")content(negative legnth)delimiter(")>operator(\))operator(;) + operator(}) + + ident(internal)operator(.)ident(modify)operator(()operator(\))operator(;) + ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()ident(len)operator(\))operator(;) + keyword(return) ident(arg)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ungetc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(ungetc)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(checkReadable)operator(()operator(\))operator(;) + + type(int) ident(c) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(arg)operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(internal)operator(.)ident(modify)operator(()operator(\))operator(;) + ident(pos)operator(--)operator(;) + + ident(ByteList) ident(bytes) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(bytes)operator(.)ident(length)operator(()operator(\)) operator(<=) ident(pos)operator(\)) operator({) + ident(bytes)operator(.)ident(length)operator(()operator(()type(int)operator(\))ident(pos) operator(+) integer(1)operator(\))operator(;) + operator(}) + + ident(bytes)operator(.)ident(set)operator(()operator(()type(int)operator(\)) ident(pos)operator(,) ident(c)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(write)delimiter(")>operator(,) string<delimiter(")content(syswrite)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(write)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(writeInternal)operator(()ident(context)operator(,) ident(arg)operator(\))operator(\))operator(;) + operator(}) + + directive(private) type(int) ident(writeInternal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(checkWritable)operator(()operator(\))operator(;) + ident(checkFrozen)operator(()operator(\))operator(;) + + ident(RubyString) ident(val) operator(=) ident(arg)operator(.)ident(asString)operator(()operator(\))operator(;) + ident(internal)operator(.)ident(modify)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(modes)operator(.)ident(isAppendable)operator(()operator(\))operator(\)) operator({) + ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(append)operator(()ident(val)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(pos) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + type(int) ident(left) operator(=) ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(-)operator(()type(int)operator(\))ident(pos)operator(;) + ident(internal)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(replace)operator(()operator(()type(int)operator(\))ident(pos)operator(,)type(Math)operator(.)ident(min)operator(()ident(val)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(,)ident(left)operator(\))operator(,)ident(val)operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(pos) operator(+=) ident(val)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(val)operator(.)ident(isTaint)operator(()operator(\))operator(\)) operator({) + ident(internal)operator(.)ident(setTaint)operator(()keyword(true)operator(\))operator(;) + operator(}) + + keyword(return) ident(val)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(length)operator(()operator(\))operator(;) + operator(}) + + comment(/* rb: check_modifiable */) + annotation(@Override) + directive(protected) type(void) ident(checkFrozen)operator(()operator(\)) operator({) + ident(checkInitialized)operator(()operator(\))operator(;) + keyword(if) operator(()ident(internal)operator(.)ident(isFrozen)operator(()operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(not modifiable string)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/* rb: readable */) + directive(private) type(void) ident(checkReadable)operator(()operator(\)) operator({) + ident(checkInitialized)operator(()operator(\))operator(;) + keyword(if) operator(()ident(closedRead) operator(||) operator(!)ident(modes)operator(.)ident(isReadable)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(not opened for reading)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + comment(/* rb: writable */) + directive(private) type(void) ident(checkWritable)operator(()operator(\)) operator({) + ident(checkInitialized)operator(()operator(\))operator(;) + keyword(if) operator(()ident(closedWrite) operator(||) operator(!)ident(modes)operator(.)ident(isWritable)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(not opened for writing)delimiter(")>operator(\))operator(;) + operator(}) + + comment(// Tainting here if we ever want it. (secure 4\)) + operator(}) + + directive(private) type(void) ident(checkInitialized)operator(()operator(\)) operator({) + keyword(if) operator(()ident(modes) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(uninitialized stream)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(checkFinalized)operator(()operator(\)) operator({) + keyword(if) operator(()ident(internal) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(not opened)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(checkOpen)operator(()operator(\)) operator({) + keyword(if) operator(()ident(closedRead) operator(&&) ident(closedWrite)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIOError)operator(()string<delimiter(")content(closed stream)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(private) type(void) ident(setupModes)operator(()operator(\)) operator({) + ident(closedWrite) operator(=) keyword(false)operator(;) + ident(closedRead) operator(=) keyword(false)operator(;) + + keyword(if) operator(()ident(modes)operator(.)ident(isReadOnly)operator(()operator(\))operator(\)) ident(closedWrite) operator(=) keyword(true)operator(;) + keyword(if) operator(()operator(!)ident(modes)operator(.)ident(isReadable)operator(()operator(\))operator(\)) ident(closedRead) operator(=) keyword(true)operator(;) + operator(}) +operator(}) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.joni.Matcher)operator(;) +keyword(import) include(org.joni.Option)operator(;) +keyword(import) include(org.joni.Regex)operator(;) +keyword(import) include(org.joni.Region)operator(;) +keyword(import) include(org.joni.encoding.Encoding)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) + +comment(/** + * @author kscott + * + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(StringScanner)delimiter(")>operator(\)) +directive(public) type(class) class(RubyStringScanner) directive(extends) ident(RubyObject) operator({) + + directive(private) ident(RubyString) ident(str)operator(;) + directive(private) type(int) ident(pos) operator(=) integer(0)operator(;) + directive(private) type(int) ident(lastPos) operator(=) operator(-)integer(1)operator(;) + + directive(private) type(Region) ident(regs)operator(;) + directive(private) type(int) ident(beg) operator(=) operator(-)integer(1)operator(;) + directive(private) type(int) ident(end) operator(=) operator(-)integer(1)operator(;) + comment(// not to be confused with RubyObject's flags) + directive(private) type(int) ident(scannerFlags)operator(;) + + directive(private) directive(static) directive(final) type(int) ident(MATCHED_STR_SCN_F) operator(=) integer(1) operator(<)operator(<) integer(11)operator(;) + + directive(private) directive(static) ident(ObjectAllocator) ident(STRINGSCANNER_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyStringScanner)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createScannerClass)operator(()directive(final) ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(scannerClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(StringScanner)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(STRINGSCANNER_ALLOCATOR)operator(\))operator(;) + ident(scannerClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyStringScanner)operator(.)ident(class)operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(scannerClass)operator(.)ident(setConstant)operator(()string<delimiter(")content(Version)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(0.7.0)delimiter(")>operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(\))operator(;) + ident(scannerClass)operator(.)ident(setConstant)operator(()string<delimiter(")content(Id)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content($Id: strscan.c 13506 2007-09-24 08:56:24Z nobu $)delimiter(")>operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(\))operator(;) + + ident(RubyClass) ident(standardError) operator(=) ident(runtime)operator(.)ident(getStandardError)operator(()operator(\))operator(;) + ident(RubyClass) ident(error) operator(=) ident(scannerClass)operator(.)ident(defineClassUnder)operator(() + string<delimiter(")content(Error)delimiter(")>operator(,) ident(standardError)operator(,) ident(standardError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + + ident(RubyClass) ident(objClass) operator(=) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(objClass)operator(.)ident(isConstantDefined)operator(()string<delimiter(")content(ScanError)delimiter(")>operator(\))operator(\)) operator({) + ident(objClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(ScanError)delimiter(")>operator(,) ident(error)operator(\))operator(;) + operator(}) + + keyword(return) ident(scannerClass)operator(;) + operator(}) + + directive(private) type(void) ident(clearMatched)operator(()operator(\)) operator({) + ident(scannerFlags) operator(&=) operator(~)ident(MATCHED_STR_SCN_F)operator(;) + operator(}) + + directive(private) type(void) ident(setMatched)operator(()operator(\)) operator({) + ident(scannerFlags) operator(|=) ident(MATCHED_STR_SCN_F)operator(;) + operator(}) + + directive(private) type(boolean) ident(isMatched)operator(()operator(\)) operator({) + keyword(return) operator(()ident(scannerFlags) operator(&) ident(MATCHED_STR_SCN_F)operator(\)) operator(!=) integer(0)operator(;) + operator(}) + + directive(private) type(void) ident(check)operator(()operator(\)) operator({) + keyword(if) operator(()ident(str) operator(==) keyword(null)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(uninitialized StringScanner object)delimiter(")>operator(\))operator(;) + operator(}) + + directive(protected) ident(RubyStringScanner)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + comment(// second argument is allowed, but ignored (MRI\)) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(str) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(frame)operator(=)keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) local_variable(this)operator(;) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyStringScanner)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type )delimiter(")> + operator(+) ident(other)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( (expected StringScanner\))delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyStringScanner) ident(otherScanner) operator(=) operator(()ident(RubyStringScanner)operator(\))ident(other)operator(;) + ident(str) operator(=) ident(otherScanner)operator(.)ident(str)operator(;) + ident(pos) operator(=) ident(otherScanner)operator(.)ident(pos)operator(;) + ident(lastPos) operator(=) ident(otherScanner)operator(.)ident(lastPos)operator(;) + ident(scannerFlags) operator(=) ident(otherScanner)operator(.)ident(scannerFlags)operator(;) + + ident(regs) operator(=) ident(otherScanner)operator(.)ident(regs) operator(!=) keyword(null) operator(?) ident(otherScanner)operator(.)ident(regs)operator(.)ident(clone)operator(()operator(\)) operator(:) keyword(null)operator(;) + ident(beg) operator(=) ident(otherScanner)operator(.)ident(beg)operator(;) + ident(end) operator(=) ident(otherScanner)operator(.)ident(end)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reset)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(reset)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(pos) operator(=) integer(0)operator(;) + ident(clearMatched)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(terminate)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(terminate)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(pos) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(;) + ident(clearMatched)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(clear)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(clear)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warning)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(StringScanner#clear is obsolete; use #terminate instead)delimiter(")>operator(,) string<delimiter(")content(StringScanner#clear)delimiter(")>operator(,) string<delimiter(")content(#terminate)delimiter(")>operator(\))operator(;) + keyword(return) ident(terminate)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(string)delimiter(")>operator(\)) + directive(public) ident(RubyString) ident(string)operator(()operator(\)) operator({) + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(string=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_string)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(str)operator(\)) operator({) + local_variable(this)operator(.)ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(str)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(strDup)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(freeze)operator(()ident(context)operator(\))operator(;) + ident(pos) operator(=) integer(0)operator(;) + ident(clearMatched)operator(()operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(concat)delimiter(")>operator(,) string<delimiter(")content(<<)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(concat)operator(()ident(IRubyObject) ident(obj)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(str)operator(.)ident(append)operator(()ident(obj)operator(\))operator(;) comment(// append will call convertToString(\)) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(pos)delimiter(")>operator(,) string<delimiter(")content(pointer)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyFixnum) ident(pos)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(pos)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(pos=)delimiter(")>operator(,) string<delimiter(")content(pointer=)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(set_pos)operator(()ident(IRubyObject) ident(pos)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + type(int) ident(i) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(pos)operator(\))operator(;) + type(int) ident(size) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(;) + keyword(if) operator(()ident(i) operator(<) integer(0)operator(\)) ident(i) operator(+=) ident(size)operator(;) + keyword(if) operator(()ident(i) operator(<) integer(0) operator(||) ident(i) operator(>) ident(size)operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newRangeError)operator(()string<delimiter(")content(index out of range.)delimiter(")>operator(\))operator(;) + local_variable(this)operator(.)ident(pos) operator(=) ident(i)operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(i)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(extractRange)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(beg)operator(,) type(int) ident(end)operator(\)) operator({) + type(int) ident(size) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(;) + keyword(if) operator(()ident(beg) operator(>) ident(size)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(if) operator(()ident(end) operator(>) ident(size)operator(\)) ident(end) operator(=) ident(size)operator(;) + keyword(return) ident(str)operator(.)ident(makeShared)operator(()ident(runtime)operator(,) ident(beg)operator(,) ident(end) operator(-) ident(beg)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(extractBegLen)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(beg)operator(,) type(int) ident(len)operator(\)) operator({) + ident(assert) ident(len) operator(>=) integer(0)operator(;) + type(int) ident(size) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(;) + keyword(if) operator(()ident(beg) operator(>) ident(size)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(if) operator(()ident(beg) operator(+) ident(len) operator(>) ident(size)operator(\)) ident(len) operator(=) ident(size) operator(-) ident(beg)operator(;) + keyword(return) ident(str)operator(.)ident(makeShared)operator(()ident(runtime)operator(,) ident(beg)operator(,) ident(len)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(scan)operator(()ident(IRubyObject) ident(regex)operator(,) type(boolean) ident(succptr)operator(,) type(boolean) ident(getstr)operator(,) type(boolean) ident(headonly)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(regex) keyword(instanceof) ident(RubyRegexp)operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(wrong argument type )delimiter(")> operator(+) ident(regex)operator(.)ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( (expected Regexp\))delimiter(")>operator(\))operator(;) + ident(check)operator(()operator(\))operator(;) + + ident(Regex) ident(pattern) operator(=) operator(()operator(()ident(RubyRegexp)operator(\))ident(regex)operator(\))operator(.)ident(getPattern)operator(()operator(\))operator(;) + + ident(clearMatched)operator(()operator(\))operator(;) + type(int) ident(rest) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(-) ident(pos)operator(;) + keyword(if) operator(()ident(rest) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + type(Matcher) ident(matcher) operator(=) ident(pattern)operator(.)ident(matcher)operator(()ident(value)operator(.)ident(bytes)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(pos)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(\))operator(;) + + directive(final) type(int) ident(ret)operator(;) + keyword(if) operator(()ident(headonly)operator(\)) operator({) + ident(ret) operator(=) ident(matcher)operator(.)ident(match)operator(()ident(value)operator(.)ident(begin) operator(+) ident(pos)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(,) type(Option)operator(.)ident(NONE)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(ret) operator(=) ident(matcher)operator(.)ident(search)operator(()ident(value)operator(.)ident(begin) operator(+) ident(pos)operator(,) ident(value)operator(.)ident(begin) operator(+) ident(value)operator(.)ident(realSize)operator(,) type(Option)operator(.)ident(NONE)operator(\))operator(;) + operator(}) + + ident(regs) operator(=) ident(matcher)operator(.)ident(getRegion)operator(()operator(\))operator(;) + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + ident(beg) operator(=) ident(matcher)operator(.)ident(getBegin)operator(()operator(\))operator(;) + ident(end) operator(=) ident(matcher)operator(.)ident(getEnd)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(beg) operator(=) ident(regs)operator(.)ident(beg)operator([)integer(0)operator(])operator(;) + ident(end) operator(=) ident(regs)operator(.)ident(end)operator([)integer(0)operator(])operator(;) + operator(}) + + keyword(if) operator(()ident(ret) operator(<) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(setMatched)operator(()operator(\))operator(;) + + ident(lastPos) operator(=) ident(pos)operator(;) + keyword(if) operator(()ident(succptr)operator(\)) ident(pos) operator(+=) ident(end)operator(;) + keyword(return) ident(getstr) operator(?) ident(extractBegLen)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(lastPos)operator(,) ident(end)operator(\)) operator(:) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(end)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(scan)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(scan)operator(()ident(IRubyObject) ident(regex)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) keyword(true)operator(,) keyword(true)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(match?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(match_p)operator(()ident(IRubyObject) ident(regex)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) keyword(false)operator(,) keyword(false)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(skip)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(skip)operator(()ident(IRubyObject) ident(regex)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) keyword(true)operator(,) keyword(false)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(check)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(check)operator(()ident(IRubyObject) ident(regex)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) keyword(false)operator(,) keyword(true)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(scan_full)delimiter(")>operator(,) ident(required) operator(=) integer(3)operator(\)) + directive(public) ident(IRubyObject) ident(scan_full)operator(()ident(IRubyObject) ident(regex)operator(,) ident(IRubyObject) ident(s)operator(,) ident(IRubyObject) ident(f)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) ident(s)operator(.)ident(isTrue)operator(()operator(\))operator(,) ident(f)operator(.)ident(isTrue)operator(()operator(\))operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(scan_until)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(scan_until)operator(()ident(IRubyObject) ident(regex)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) keyword(true)operator(,) keyword(true)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exist?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(exist_p)operator(()ident(IRubyObject) ident(regex)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) keyword(false)operator(,) keyword(false)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(skip_until)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(skip_until)operator(()ident(IRubyObject) ident(regex)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) keyword(true)operator(,) keyword(false)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(check_until)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(check_until)operator(()ident(IRubyObject) ident(regex)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) keyword(false)operator(,) keyword(true)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(search_full)delimiter(")>operator(,) ident(required) operator(=) integer(3)operator(\)) + directive(public) ident(IRubyObject) ident(search_full)operator(()ident(IRubyObject) ident(regex)operator(,) ident(IRubyObject) ident(s)operator(,) ident(IRubyObject) ident(f)operator(\)) operator({) + keyword(return) ident(scan)operator(()ident(regex)operator(,) ident(s)operator(.)ident(isTrue)operator(()operator(\))operator(,) ident(f)operator(.)ident(isTrue)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(adjustRegisters)operator(()operator(\)) operator({) + ident(beg) operator(=) integer(0)operator(;) + ident(end) operator(=) ident(pos) operator(-) ident(lastPos)operator(;) + ident(regs) operator(=) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getch)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(getch)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(clearMatched)operator(()operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(pos) operator(>=) ident(value)operator(.)ident(realSize)operator(\)) keyword(return) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(Encoding) ident(enc) operator(=) ident(runtime)operator(.)ident(getKCode)operator(()operator(\))operator(.)ident(getEncoding)operator(()operator(\))operator(;) + + type(int) ident(len)operator(;) + keyword(if) operator(()ident(enc)operator(.)ident(isSingleByte)operator(()operator(\))operator(\)) operator({) + ident(len) operator(=) integer(1)operator(;) + operator(}) keyword(else) operator({) + ident(len) operator(=) ident(enc)operator(.)ident(length)operator(()ident(value)operator(.)ident(bytes)operator([)ident(value)operator(.)ident(begin) operator(+) ident(pos)operator(])operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(pos) operator(+) ident(len) operator(>) ident(value)operator(.)ident(realSize)operator(\)) ident(len) operator(=) ident(value)operator(.)ident(realSize) operator(-) ident(pos)operator(;) + ident(lastPos) operator(=) ident(pos)operator(;) + ident(pos) operator(+=) ident(len)operator(;) + + ident(setMatched)operator(()operator(\))operator(;) + ident(adjustRegisters)operator(()operator(\))operator(;) + + keyword(return) ident(extractRange)operator(()ident(runtime)operator(,) ident(lastPos) operator(+) ident(beg)operator(,) ident(lastPos) operator(+) ident(end)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(get_byte)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(get_byte)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(clearMatched)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + ident(lastPos) operator(=) ident(pos)operator(;) + ident(pos)operator(++)operator(;) + + ident(setMatched)operator(()operator(\))operator(;) + ident(adjustRegisters)operator(()operator(\))operator(;) + + keyword(return) ident(extractRange)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(lastPos) operator(+) ident(beg)operator(,) ident(lastPos) operator(+) ident(end)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getbyte)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(getbyte)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warning)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) + string<delimiter(")content(StringScanner#getbyte is obsolete; use #get_byte instead)delimiter(")>operator(,) + string<delimiter(")content(StringScanner#getbyte)delimiter(")>operator(,) string<delimiter(")content(#get_byte)delimiter(")>operator(\))operator(;) + keyword(return) ident(get_byte)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(peek)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(peek)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(length)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + + type(int) ident(len) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(length)operator(\))operator(;) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative string size (or size too big\))delimiter(")>operator(\))operator(;) + operator(}) + + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>=) ident(value)operator(.)ident(realSize)operator(\)) keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(infectBy)operator(()ident(str)operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(+) ident(len) operator(>) ident(value)operator(.)ident(realSize)operator(\)) ident(len) operator(=) ident(value)operator(.)ident(realSize) operator(-) ident(pos)operator(;) + + keyword(return) ident(extractBegLen)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(pos)operator(,) ident(len)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(peep)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(peep)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(length)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warning)operator(() + ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(StringScanner#peep is obsolete; use #peek instead)delimiter(")>operator(,) + string<delimiter(")content(StringScanner#peep)delimiter(")>operator(,) string<delimiter(")content(#peek)delimiter(")>operator(\))operator(;) + keyword(return) ident(peek)operator(()ident(context)operator(,) ident(length)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(unscan)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(unscan)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isMatched)operator(()operator(\))operator(\)) operator({) + ident(RubyClass) ident(errorClass) operator(=) ident(runtime)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(StringScanner)delimiter(")>operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Error)delimiter(")>operator(\))operator(;) + keyword(throw) keyword(new) ident(RaiseException)operator(()ident(RubyException)operator(.)ident(newException)operator(() + ident(runtime)operator(,) ident(errorClass)operator(,) string<delimiter(")content(unscan failed: previous match had failed)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + ident(pos) operator(=) ident(lastPos)operator(;) + ident(clearMatched)operator(()operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(beginning_of_line?)delimiter(")>operator(,) ident(alias) operator(=) string<delimiter(")content(bol?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(bol_p)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>) ident(value)operator(.)ident(realSize)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(==) integer(0)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(return) ident(value)operator(.)ident(bytes)operator([)operator(()ident(value)operator(.)ident(begin) operator(+) ident(pos)operator(\)) operator(-) integer(1)operator(]) operator(==) operator(()type(byte)operator(\))string<delimiter(')content(\\n)delimiter(')> operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eos?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(eos_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(return) ident(pos) operator(>=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(empty?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(empty_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warning)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(StringScanner#empty? is obsolete; use #eos? instead)delimiter(")>operator(,) string<delimiter(")content(StringScanner#empty?)delimiter(")>operator(,) string<delimiter(")content(#eos?)delimiter(")>operator(\))operator(;) + keyword(return) ident(eos_p)operator(()ident(context)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rest?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(rest_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(return) ident(pos) operator(>=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(matched?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(matched_p)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(return) ident(isMatched)operator(()operator(\)) operator(?) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(matched)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(matched)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isMatched)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(extractRange)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(lastPos) operator(+) ident(beg)operator(,) ident(lastPos) operator(+) ident(end)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(matched_size)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(matched_size)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isMatched)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(end) operator(-) ident(beg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(matchedsize)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(matchedsize)operator(()operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warning)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(StringScanner#matchedsize is obsolete; use #matched_size instead)delimiter(")>operator(,) + string<delimiter(")content(StringScanner#matchedize)delimiter(")>operator(,) string<delimiter(")content(#matched_size)delimiter(")>operator(\))operator(;) + keyword(return) ident(matched_size)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(idx)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isMatched)operator(()operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + type(int) ident(i) operator(=) ident(RubyNumeric)operator(.)ident(num2int)operator(()ident(idx)operator(\))operator(;) + + type(int) ident(numRegs) operator(=) ident(regs) operator(==) keyword(null) operator(?) integer(1) operator(:) ident(regs)operator(.)ident(numRegs)operator(;) + keyword(if) operator(()ident(i) operator(<) integer(0)operator(\)) ident(i) operator(+=) ident(numRegs)operator(;) + keyword(if) operator(()ident(i) operator(<) integer(0) operator(||) ident(i) operator(>=) ident(numRegs)operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(regs) operator(==) keyword(null)operator(\)) operator({) + ident(assert) ident(i) operator(==) integer(0)operator(;) + keyword(if) operator(()ident(beg) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(extractRange)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(lastPos) operator(+) ident(beg)operator(,) ident(lastPos) operator(+) ident(end)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()ident(regs)operator(.)ident(beg)operator([)ident(i)operator(]) operator(==) operator(-)integer(1)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(extractRange)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(lastPos) operator(+) ident(regs)operator(.)ident(beg)operator([)ident(i)operator(])operator(,) ident(lastPos) operator(+) ident(regs)operator(.)ident(end)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pre_match)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(pre_match)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isMatched)operator(()operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(extractRange)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) integer(0)operator(,) ident(lastPos) operator(+) ident(beg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(post_match)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(post_match)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(isMatched)operator(()operator(\))operator(\)) keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + keyword(return) ident(extractRange)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(lastPos) operator(+) ident(end)operator(,) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rest)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rest)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>=) ident(value)operator(.)ident(realSize)operator(\)) keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(infectBy)operator(()ident(str)operator(\))operator(;) + keyword(return) ident(extractRange)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(pos)operator(,) ident(value)operator(.)ident(realSize)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rest_size)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(rest_size)operator(()operator(\)) operator({) + ident(check)operator(()operator(\))operator(;) + ident(ByteList) ident(value) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>=) ident(value)operator(.)ident(realSize)operator(\)) keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(value)operator(.)ident(realSize) operator(-) ident(pos)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(restsize)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(restsize)operator(()operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warning)operator(()ident(ID)operator(.)ident(DEPRECATED_METHOD)operator(,) string<delimiter(")content(StringScanner#restsize is obsolete; use #rest_size instead)delimiter(")>operator(,) string<delimiter(")content(StringScanner#restsize)delimiter(")>operator(,) string<delimiter(")content(#rest_size)delimiter(")>operator(\))operator(;) + keyword(return) ident(rest_size)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + keyword(if) operator(()ident(str) operator(==) keyword(null)operator(\)) keyword(return) ident(inspect)operator(()string<delimiter(")content((uninitialized\))delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(\)) keyword(return) ident(inspect)operator(()string<delimiter(")content(fin)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(==) integer(0)operator(\)) keyword(return) ident(inspect)operator(()ident(pos) operator(+) string<delimiter(")content(/)delimiter(")> operator(+) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(+) string<delimiter(")content( @ )delimiter(")> operator(+) ident(inspect2)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(inspect)operator(()ident(pos) operator(+) string<delimiter(")content(/)delimiter(")> operator(+) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(+) string<delimiter(")content( )delimiter(")> operator(+) ident(inspect1)operator(()operator(\)) operator(+) string<delimiter(")content( @ )delimiter(")> operator(+) ident(inspect2)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(inspect)operator(()type(String) ident(msg)operator(\)) operator({) + ident(IRubyObject) ident(result) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(#<)delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\)) operator(+) string<delimiter(")content( )delimiter(")> operator(+) ident(msg) operator(+) string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + keyword(if) operator(()ident(str) operator(!=) keyword(null)operator(\)) ident(result)operator(.)ident(infectBy)operator(()ident(str)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(int) ident(INSPECT_LENGTH) operator(=) integer(5)operator(;) + + directive(private) ident(IRubyObject) ident(inspect1)operator(()operator(\)) operator({) + keyword(if) operator(()ident(pos) operator(==) integer(0)operator(\)) keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(pos) operator(>) ident(INSPECT_LENGTH)operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,) string<delimiter(")content(...)delimiter(")>operator(.)ident(getBytes)operator(()operator(\))operator(\))operator(.)ident(append)operator(()ident(str)operator(.)ident(substr)operator(()ident(pos) operator(-) ident(INSPECT_LENGTH)operator(,) ident(INSPECT_LENGTH)operator(\))operator(\))operator(.)ident(inspect)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(str)operator(.)ident(substr)operator(()integer(0)operator(,) ident(pos)operator(\))operator(.)ident(inspect)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(private) ident(IRubyObject) ident(inspect2)operator(()operator(\)) operator({) + keyword(if) operator(()ident(pos) operator(>=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize)operator(\)) keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + type(int) ident(len) operator(=) ident(str)operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(realSize) operator(-) ident(pos)operator(;) + keyword(if) operator(()ident(len) operator(>) ident(INSPECT_LENGTH)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyString)operator(\))ident(str)operator(.)ident(substr)operator(()ident(pos)operator(,) ident(INSPECT_LENGTH)operator(\))operator(\))operator(.)ident(cat)operator(()string<delimiter(")content(...)delimiter(")>operator(.)ident(getBytes)operator(()operator(\))operator(\))operator(.)ident(inspect)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(str)operator(.)ident(substr)operator(()ident(pos)operator(,) ident(len)operator(\))operator(.)ident(inspect)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(must_C_version)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(mustCversion)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2005 Charles O Nutter <headius@headius.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.util.List)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.Frame)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.IdUtil)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.CallConfiguration)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.DynamicMethod)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) + +comment(/** + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Struct)delimiter(")>operator(\)) +directive(public) type(class) class(RubyStruct) directive(extends) ident(RubyObject) operator({) + directive(private) ident(IRubyObject)type([]) ident(values)operator(;) + + comment(/** + * Constructor for RubyStruct. + * @param runtime + * @param rubyClass + */) + directive(public) ident(RubyStruct)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + + type(int) ident(size) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(getInternalVariable)operator(()operator(()ident(RubyClass)operator(\))ident(rubyClass)operator(,) string<delimiter(")content(__size__)delimiter(")>operator(\))operator(\))operator(;) + + ident(values) operator(=) keyword(new) ident(IRubyObject)operator([)ident(size)operator(])operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(size)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(values)operator([)ident(i)operator(]) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(createStructClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + comment(// TODO: NOT_ALLOCATABLE_ALLOCATOR may be ok here, but it's unclear how Structs) + comment(// work with marshalling. Confirm behavior and ensure we're doing this correctly. JRUBY-415) + ident(RubyClass) ident(structClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Struct)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setStructClass)operator(()ident(structClass)operator(\))operator(;) + ident(structClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(STRUCT)operator(;) + ident(structClass)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + ident(structClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyStruct)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(structClass)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(STRUCT)operator(;) + operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(getInternalVariable)operator(()ident(RubyClass) ident(type)operator(,) type(String) ident(internedName)operator(\)) operator({) + ident(RubyClass) ident(structClass) operator(=) ident(type)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getStructClass)operator(()operator(\))operator(;) + ident(IRubyObject) ident(variable)operator(;) + + keyword(while) operator(()ident(type) operator(!=) keyword(null) operator(&&) ident(type) operator(!=) ident(structClass)operator(\)) operator({) + keyword(if) operator(()operator(()ident(variable) operator(=) ident(type)operator(.)ident(fastGetInternalVariable)operator(()ident(internedName)operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(variable)operator(;) + operator(}) + + ident(type) operator(=) ident(type)operator(.)ident(getSuperClass)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(type)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(private) ident(RubyClass) ident(classOf)operator(()operator(\)) operator({) + keyword(return) ident(getMetaClass)operator(()operator(\)) keyword(instanceof) ident(MetaClass) operator(?) ident(getMetaClass)operator(()operator(\))operator(.)ident(getSuperClass)operator(()operator(\)) operator(:) ident(getMetaClass)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(modify)operator(()operator(\)) operator({) + ident(testFrozen)operator(()string<delimiter(")content(Struct is frozen)delimiter(")>operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isTaint)operator(()operator(\)) operator(&&) ident(getRuntime)operator(()operator(\))operator(.)ident(getSafeLevel)operator(()operator(\)) operator(>=) integer(4)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newSecurityError)operator(()string<delimiter(")content(Insecure: can't modify struct)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(RubyFixnum) ident(hash)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(h) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(hashCode)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(values)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(h) operator(=) operator(()ident(h) operator(<)operator(<) integer(1)operator(\)) operator(|) operator(()ident(h) operator(<) integer(0) operator(?) integer(1) operator(:) integer(0)operator(\))operator(;) + ident(h) operator(^=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(values)operator([)ident(i)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(HASH)operator(,) string<delimiter(")content(hash)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(runtime)operator(.)ident(newFixnum)operator(()ident(h)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(setByName)operator(()type(String) ident(name)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(RubyArray) ident(member) operator(=) operator(()ident(RubyArray)operator(\)) ident(getInternalVariable)operator(()ident(classOf)operator(()operator(\))operator(,) string<delimiter(")content(__member__)delimiter(")>operator(\))operator(;) + + ident(assert) operator(!)ident(member)operator(.)ident(isNil)operator(()operator(\)) operator(:) string<delimiter(")content(uninitialized struct)delimiter(")>operator(;) + + ident(modify)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(,)ident(k)operator(=)ident(member)operator(.)ident(getLength)operator(()operator(\))operator(;) ident(i) operator(<) ident(k)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(member)operator(.)ident(eltInternal)operator(()ident(i)operator(\))operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(equals)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(values)operator([)ident(i)operator(]) operator(=) ident(value)operator(;) + operator(}) + operator(}) + + keyword(throw) ident(notStructMemberError)operator(()ident(name)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(getByName)operator(()type(String) ident(name)operator(\)) operator({) + ident(RubyArray) ident(member) operator(=) operator(()ident(RubyArray)operator(\)) ident(getInternalVariable)operator(()ident(classOf)operator(()operator(\))operator(,) string<delimiter(")content(__member__)delimiter(")>operator(\))operator(;) + + ident(assert) operator(!)ident(member)operator(.)ident(isNil)operator(()operator(\)) operator(:) string<delimiter(")content(uninitialized struct)delimiter(")>operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(,)ident(k)operator(=)ident(member)operator(.)ident(getLength)operator(()operator(\))operator(;) ident(i) operator(<) ident(k)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(member)operator(.)ident(eltInternal)operator(()ident(i)operator(\))operator(.)ident(asJavaString)operator(()operator(\))operator(.)ident(equals)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(values)operator([)ident(i)operator(])operator(;) + operator(}) + operator(}) + + keyword(throw) ident(notStructMemberError)operator(()ident(name)operator(\))operator(;) + operator(}) + + comment(// Struct methods) + + comment(/** Create new Struct class. + * + * MRI: rb_struct_s_def / make_struct + * + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyClass) ident(newInstance)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(String) ident(name) operator(=) keyword(null)operator(;) + type(boolean) ident(nilName) operator(=) keyword(false)operator(;) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(firstArgAsString) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(checkStringType)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(firstArgAsString)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(name) operator(=) operator(()operator(()ident(RubyString)operator(\))ident(firstArgAsString)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(nilName) operator(=) keyword(true)operator(;) + operator(}) + operator(}) + + ident(RubyArray) ident(member) operator(=) ident(runtime)operator(.)ident(newArray)operator(()operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) operator(()ident(name) operator(==) keyword(null) operator(&&) operator(!)ident(nilName)operator(\)) operator(?) integer(0) operator(:) integer(1)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(member)operator(.)ident(append)operator(()ident(runtime)operator(.)ident(newSymbol)operator(()ident(args)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + ident(RubyClass) ident(newStruct)operator(;) + ident(RubyClass) ident(superClass) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + + keyword(if) operator(()ident(name) operator(==) keyword(null) operator(||) ident(nilName)operator(\)) operator({) + ident(newStruct) operator(=) ident(RubyClass)operator(.)ident(newClass)operator(()ident(runtime)operator(,) ident(superClass)operator(\))operator(;) + ident(newStruct)operator(.)ident(setAllocator)operator(()ident(STRUCT_INSTANCE_ALLOCATOR)operator(\))operator(;) + ident(newStruct)operator(.)ident(makeMetaClass)operator(()ident(superClass)operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + ident(newStruct)operator(.)ident(inherit)operator(()ident(superClass)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()operator(!)ident(IdUtil)operator(.)ident(isConstant)operator(()ident(name)operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNameError)operator(()string<delimiter(")content(identifier )delimiter(")> operator(+) ident(name) operator(+) string<delimiter(")content( needs to be constant)delimiter(")>operator(,) ident(name)operator(\))operator(;) + operator(}) + + ident(IRubyObject) ident(type) operator(=) ident(superClass)operator(.)ident(getConstantAt)operator(()ident(name)operator(\))operator(;) + keyword(if) operator(()ident(type) operator(!=) keyword(null)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + type(Frame) ident(frame) operator(=) ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(;) + ident(runtime)operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(STRUCT_CONSTANT_REDEFINED)operator(,) ident(frame)operator(.)ident(getFile)operator(()operator(\))operator(,) ident(frame)operator(.)ident(getLine)operator(()operator(\))operator(,) string<delimiter(")content(redefining constant Struct::)delimiter(")> operator(+) ident(name)operator(,) ident(name)operator(\))operator(;) + ident(superClass)operator(.)ident(remove_const)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(newString)operator(()ident(name)operator(\))operator(\))operator(;) + operator(}) + ident(newStruct) operator(=) ident(superClass)operator(.)ident(defineClassUnder)operator(()ident(name)operator(,) ident(superClass)operator(,) ident(STRUCT_INSTANCE_ALLOCATOR)operator(\))operator(;) + operator(}) + + ident(newStruct)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(STRUCT)operator(;) + + ident(newStruct)operator(.)ident(fastSetInternalVariable)operator(()string<delimiter(")content(__size__)delimiter(")>operator(,) ident(member)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + ident(newStruct)operator(.)ident(fastSetInternalVariable)operator(()string<delimiter(")content(__member__)delimiter(")>operator(,) ident(member)operator(\))operator(;) + + ident(newStruct)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineAnnotatedMethods)operator(()ident(StructMethods)operator(.)ident(class)operator(\))operator(;) + + comment(// define access methods.) + keyword(for) operator(()type(int) ident(i) operator(=) operator(()ident(name) operator(==) keyword(null) operator(&&) operator(!)ident(nilName)operator(\)) operator(?) integer(0) operator(:) integer(1)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + directive(final) type(String) ident(memberName) operator(=) ident(args)operator([)ident(i)operator(])operator(.)ident(asJavaString)operator(()operator(\))operator(;) + comment(// if we are storing a name as well, index is one too high for values) + directive(final) type(int) ident(index) operator(=) operator(()ident(name) operator(==) keyword(null) operator(&&) operator(!)ident(nilName)operator(\)) operator(?) ident(i) operator(:) ident(i) operator(-) integer(1)operator(;) + ident(newStruct)operator(.)ident(addMethod)operator(()ident(memberName)operator(,) keyword(new) ident(DynamicMethod)operator(()ident(newStruct)operator(,) type(Visibility)operator(.)ident(PUBLIC)operator(,) ident(CallConfiguration)operator(.)ident(NO_FRAME_NO_SCOPE)operator(\)) operator({) + annotation(@Override) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) integer(0)operator(,) integer(0)operator(\))operator(;) + keyword(return) operator(()operator(()ident(RubyStruct)operator(\))ident(self)operator(\))operator(.)ident(get)operator(()ident(index)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyStruct)operator(\))ident(self)operator(\))operator(.)ident(get)operator(()ident(index)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(DynamicMethod) ident(dup)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(})operator(\))operator(;) + ident(newStruct)operator(.)ident(addMethod)operator(()ident(memberName) operator(+) string<delimiter(")content(=)delimiter(")>operator(,) keyword(new) ident(DynamicMethod)operator(()ident(newStruct)operator(,) type(Visibility)operator(.)ident(PUBLIC)operator(,) ident(CallConfiguration)operator(.)ident(NO_FRAME_NO_SCOPE)operator(\)) operator({) + annotation(@Override) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) integer(1)operator(,) integer(1)operator(\))operator(;) + keyword(return) operator(()operator(()ident(RubyStruct)operator(\))ident(self)operator(\))operator(.)ident(set)operator(()ident(args)operator([)integer(0)operator(])operator(,) ident(index)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(self)operator(,) ident(RubyModule) ident(clazz)operator(,) type(String) ident(name)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyStruct)operator(\))ident(self)operator(\))operator(.)ident(set)operator(()ident(arg)operator(,) ident(index)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(DynamicMethod) ident(dup)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(})operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + comment(// Struct bodies should be public by default, so set block visibility to public. JRUBY-1185.) + ident(block)operator(.)ident(getBinding)operator(()operator(\))operator(.)ident(setVisibility)operator(()type(Visibility)operator(.)ident(PUBLIC)operator(\))operator(;) + ident(block)operator(.)ident(yield)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) keyword(null)operator(,) ident(newStruct)operator(,) ident(newStruct)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + keyword(return) ident(newStruct)operator(;) + operator(}) + + comment(// For binding purposes on the newly created struct types) + directive(public) directive(static) type(class) class(StructMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(new)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newStruct)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(RubyStruct)operator(.)ident(newStruct)operator(()ident(recv)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) directive(static) ident(IRubyObject) ident(members)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(RubyStruct)operator(.)ident(members)operator(()ident(recv)operator(,) ident(block)operator(\))operator(;) + operator(}) + operator(}) + + comment(/** Create new Structure. + * + * MRI: struct_alloc + * + */) + directive(public) directive(static) ident(RubyStruct) ident(newStruct)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyStruct) ident(struct) operator(=) keyword(new) ident(RubyStruct)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(()ident(RubyClass)operator(\)) ident(recv)operator(\))operator(;) + + ident(struct)operator(.)ident(callInit)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + + keyword(return) ident(struct)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(modify)operator(()operator(\))operator(;) + + type(int) ident(size) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(getInternalVariable)operator(()ident(getMetaClass)operator(()operator(\))operator(,) string<delimiter(")content(__size__)delimiter(")>operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) ident(size)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(struct size differs ()delimiter(")> operator(+) ident(args)operator(.)ident(length) operator(+)string<delimiter(")content( for )delimiter(")> operator(+) ident(size) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(values)operator([)ident(i)operator(]) operator(=) ident(args)operator([)ident(i)operator(])operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyArray) ident(members)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyArray) ident(member) operator(=) operator(()ident(RubyArray)operator(\)) ident(getInternalVariable)operator(()operator(()ident(RubyClass)operator(\)) ident(recv)operator(,) string<delimiter(")content(__member__)delimiter(")>operator(\))operator(;) + + ident(assert) operator(!)ident(member)operator(.)ident(isNil)operator(()operator(\)) operator(:) string<delimiter(")content(uninitialized struct)delimiter(")>operator(;) + + ident(RubyArray) ident(result) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(member)operator(.)ident(getLength)operator(()operator(\))operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(,)ident(k)operator(=)ident(member)operator(.)ident(getLength)operator(()operator(\))operator(;) ident(i) operator(<) ident(k)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(member)operator(.)ident(eltInternal)operator(()ident(i)operator(\))operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(RubyArray) ident(members)operator(()operator(\)) operator({) + keyword(return) ident(members)operator(()ident(classOf)operator(()operator(\))operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(RubyArray) ident(select)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyArray) ident(array) operator(=) ident(RubyArray)operator(.)ident(newArray)operator(()ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(values)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()ident(values)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(array)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(set)operator(()ident(IRubyObject) ident(value)operator(,) type(int) ident(index)operator(\)) operator({) + ident(RubyArray) ident(member) operator(=) operator(()ident(RubyArray)operator(\)) ident(getInternalVariable)operator(()ident(classOf)operator(()operator(\))operator(,) string<delimiter(")content(__member__)delimiter(")>operator(\))operator(;) + + ident(assert) operator(!)ident(member)operator(.)ident(isNil)operator(()operator(\)) operator(:) string<delimiter(")content(uninitialized struct)delimiter(")>operator(;) + + ident(modify)operator(()operator(\))operator(;) + + keyword(return) ident(values)operator([)ident(index)operator(]) operator(=) ident(value)operator(;) + operator(}) + + directive(private) ident(RaiseException) ident(notStructMemberError)operator(()type(String) ident(name)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newNameError)operator(()ident(name) operator(+) string<delimiter(")content( is not struct member)delimiter(")>operator(,) ident(name)operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(get)operator(()type(int) ident(index)operator(\)) operator({) + ident(RubyArray) ident(member) operator(=) operator(()ident(RubyArray)operator(\)) ident(getInternalVariable)operator(()ident(classOf)operator(()operator(\))operator(,) string<delimiter(")content(__member__)delimiter(")>operator(\))operator(;) + + ident(assert) operator(!)ident(member)operator(.)ident(isNil)operator(()operator(\)) operator(:) string<delimiter(")content(uninitialized struct)delimiter(")>operator(;) + + keyword(return) ident(values)operator([)ident(index)operator(])operator(;) + operator(}) + + annotation(@Override) + directive(public) type(void) ident(copySpecialInstanceVariables)operator(()ident(IRubyObject) ident(clone)operator(\)) operator({) + ident(RubyStruct) ident(struct) operator(=) operator(()ident(RubyStruct)operator(\))ident(clone)operator(;) + ident(struct)operator(.)ident(values) operator(=) keyword(new) ident(IRubyObject)operator([)ident(values)operator(.)ident(length)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(values)operator(,) integer(0)operator(,) ident(struct)operator(.)ident(values)operator(,) integer(0)operator(,) ident(values)operator(.)ident(length)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(==)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_equal)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyStruct)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(if) operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\)) operator(!=) ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyStruct) ident(otherStruct) operator(=) operator(()ident(RubyStruct)operator(\))ident(other)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(values)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(equalInternal)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(,) ident(otherStruct)operator(.)ident(values)operator([)ident(i)operator(])operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(eql_p)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(other)operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)operator(()ident(other) keyword(instanceof) ident(RubyStruct)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + keyword(if) operator(()ident(getMetaClass)operator(()operator(\)) operator(!=) ident(other)operator(.)ident(getMetaClass)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyStruct) ident(otherStruct) operator(=) operator(()ident(RubyStruct)operator(\))ident(other)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(values)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(eqlInternal)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(,) ident(otherStruct)operator(.)ident(values)operator([)ident(i)operator(])operator(\))operator(\)) keyword(return) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(runtime)operator(.)ident(getTrue)operator(()operator(\))operator(;) + operator(}) + + comment(/** inspect_struct + * + */) + directive(private) ident(IRubyObject) ident(inspectStruct)operator(()directive(final) ident(ThreadContext) ident(context)operator(\)) operator({) + ident(RubyArray) ident(member) operator(=) operator(()ident(RubyArray)operator(\)) ident(getInternalVariable)operator(()ident(classOf)operator(()operator(\))operator(,) string<delimiter(")content(__member__)delimiter(")>operator(\))operator(;) + + ident(assert) operator(!)ident(member)operator(.)ident(isNil)operator(()operator(\)) operator(:) string<delimiter(")content(uninitialized struct)delimiter(")>operator(;) + + ident(ByteList) ident(buffer) operator(=) keyword(new) ident(ByteList)operator(()string<delimiter(")content(#<struct )delimiter(")>operator(.)ident(getBytes)operator(()operator(\))operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(.)ident(getBytes)operator(()operator(\))operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content( )delimiter(')>operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(,)ident(k)operator(=)ident(member)operator(.)ident(getLength)operator(()operator(\))operator(;) ident(i) operator(<) ident(k)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(i) operator(>) integer(0)operator(\)) ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content(,)delimiter(')>operator(\))operator(.)ident(append)operator(()string<delimiter(')content( )delimiter(')>operator(\))operator(;) + comment(// FIXME: MRI has special case for constants here ) + ident(buffer)operator(.)ident(append)operator(()ident(RubyString)operator(.)ident(objAsString)operator(()ident(context)operator(,) ident(member)operator(.)ident(eltInternal)operator(()ident(i)operator(\))operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content(=)delimiter(')>operator(\))operator(;) + ident(buffer)operator(.)ident(append)operator(()ident(inspect)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(buffer)operator(.)ident(append)operator(()string<delimiter(')content(>)delimiter(')>operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(buffer)operator(\))operator(;) comment(// OBJ_INFECT ) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(inspect)delimiter(")>operator(,) string<delimiter(")content(to_s)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(inspect)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(isInspecting)operator(()local_variable(this)operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(#<struct )delimiter(")> operator(+) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content(:...>)delimiter(")>operator(\))operator(;) + + keyword(try) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(registerInspecting)operator(()local_variable(this)operator(\))operator(;) + keyword(return) ident(inspectStruct)operator(()ident(context)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(unregisterInspecting)operator(()local_variable(this)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_a)delimiter(")>operator(,) string<delimiter(")content(values)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyArray) ident(to_a)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(values)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(size)delimiter(")>operator(,) string<delimiter(")content(length)delimiter(")>operator(}) operator(\)) + directive(public) ident(RubyFixnum) ident(size)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(values)operator(.)ident(length)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(backtrace) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(values)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(values)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each_pair)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyArray) ident(member) operator(=) operator(()ident(RubyArray)operator(\)) ident(getInternalVariable)operator(()ident(classOf)operator(()operator(\))operator(,) string<delimiter(")content(__member__)delimiter(")>operator(\))operator(;) + + ident(assert) operator(!)ident(member)operator(.)ident(isNil)operator(()operator(\)) operator(:) string<delimiter(")content(uninitialized struct)delimiter(")>operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(values)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newArrayNoCopy)operator(()keyword(new) ident(IRubyObject)type([])operator({)ident(member)operator(.)ident(eltInternal)operator(()ident(i)operator(\))operator(,) ident(values)operator([)ident(i)operator(])operator(})operator(\))operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(aref)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) + keyword(if) operator(()ident(key) keyword(instanceof) ident(RubyString) operator(||) ident(key) keyword(instanceof) ident(RubySymbol)operator(\)) operator({) + keyword(return) ident(getByName)operator(()ident(key)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) + + type(int) ident(idx) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(key)operator(\))operator(;) + + ident(idx) operator(=) ident(idx) operator(<) integer(0) operator(?) ident(values)operator(.)ident(length) operator(+) ident(idx) operator(:) ident(idx)operator(;) + + keyword(if) operator(()ident(idx) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(offset )delimiter(")> operator(+) ident(idx) operator(+) string<delimiter(")content( too large for struct (size:)delimiter(")> operator(+) ident(values)operator(.)ident(length) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(idx) operator(>=) ident(values)operator(.)ident(length)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(offset )delimiter(")> operator(+) ident(idx) operator(+) string<delimiter(")content( too large for struct (size:)delimiter(")> operator(+) ident(values)operator(.)ident(length) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(values)operator([)ident(idx)operator(])operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([]=)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(aset)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + keyword(if) operator(()ident(key) keyword(instanceof) ident(RubyString) operator(||) ident(key) keyword(instanceof) ident(RubySymbol)operator(\)) operator({) + keyword(return) ident(setByName)operator(()ident(key)operator(.)ident(asJavaString)operator(()operator(\))operator(,) ident(value)operator(\))operator(;) + operator(}) + + type(int) ident(idx) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(key)operator(\))operator(;) + + ident(idx) operator(=) ident(idx) operator(<) integer(0) operator(?) ident(values)operator(.)ident(length) operator(+) ident(idx) operator(:) ident(idx)operator(;) + + keyword(if) operator(()ident(idx) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(offset )delimiter(")> operator(+) ident(idx) operator(+) string<delimiter(")content( too large for struct (size:)delimiter(")> operator(+) ident(values)operator(.)ident(length) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(idx) operator(>=) ident(values)operator(.)ident(length)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newIndexError)operator(()string<delimiter(")content(offset )delimiter(")> operator(+) ident(idx) operator(+) string<delimiter(")content( too large for struct (size:)delimiter(")> operator(+) ident(values)operator(.)ident(length) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + + ident(modify)operator(()operator(\))operator(;) + keyword(return) ident(values)operator([)ident(idx)operator(]) operator(=) ident(value)operator(;) + operator(}) + + comment(// FIXME: This is copied code from RubyArray. Both RE, Struct, and Array should share one impl) + comment(// This is also hacky since I construct ruby objects to access ruby arrays through aref instead) + comment(// of something lower.) + annotation(@JRubyMethod)operator(()ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(values_at)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(long) ident(olen) operator(=) ident(values)operator(.)ident(length)operator(;) + ident(RubyArray) ident(result) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(args)operator(.)ident(length)operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(args)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()ident(args)operator([)ident(i)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(aref)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + keyword(continue)operator(;) + operator(}) + + type(long) ident(beglen)type([])operator(;) + keyword(if) operator(()operator(!)operator(()ident(args)operator([)ident(i)operator(]) keyword(instanceof) ident(RubyRange)operator(\))operator(\)) operator({) + operator(}) keyword(else) keyword(if) operator(()operator(()ident(beglen) operator(=) operator(()operator(()ident(RubyRange)operator(\)) ident(args)operator([)ident(i)operator(])operator(\))operator(.)ident(begLen)operator(()ident(olen)operator(,) integer(0)operator(\))operator(\)) operator(==) keyword(null)operator(\)) operator({) + keyword(continue)operator(;) + operator(}) keyword(else) operator({) + type(int) ident(beg) operator(=) operator(()type(int)operator(\)) ident(beglen)operator([)integer(0)operator(])operator(;) + type(int) ident(len) operator(=) operator(()type(int)operator(\)) ident(beglen)operator([)integer(1)operator(])operator(;) + type(int) ident(end) operator(=) ident(len)operator(;) + keyword(for) operator(()type(int) ident(j) operator(=) integer(0)operator(;) ident(j) operator(<) ident(end)operator(;) ident(j)operator(++)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()ident(aref)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(j) operator(+) ident(beg)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(continue)operator(;) + operator(}) + ident(result)operator(.)ident(append)operator(()ident(aref)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(public) directive(static) type(void) ident(marshalTo)operator(()ident(RubyStruct) ident(struct)operator(,) ident(MarshalStream) ident(output)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(output)operator(.)ident(registerLinkTarget)operator(()ident(struct)operator(\))operator(;) + ident(output)operator(.)ident(dumpDefaultObjectHeader)operator(()string<delimiter(')content(S)delimiter(')>operator(,) ident(struct)operator(.)ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + + type(List) ident(members) operator(=) operator(()operator(()ident(RubyArray)operator(\)) ident(getInternalVariable)operator(()ident(struct)operator(.)ident(classOf)operator(()operator(\))operator(,) string<delimiter(")content(__member__)delimiter(")>operator(\))operator(\))operator(.)ident(getList)operator(()operator(\))operator(;) + ident(output)operator(.)ident(writeInt)operator(()ident(members)operator(.)ident(size)operator(()operator(\))operator(\))operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(members)operator(.)ident(size)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + ident(RubySymbol) ident(name) operator(=) operator(()ident(RubySymbol)operator(\)) ident(members)operator(.)ident(get)operator(()ident(i)operator(\))operator(;) + ident(output)operator(.)ident(dumpObject)operator(()ident(name)operator(\))operator(;) + ident(output)operator(.)ident(dumpObject)operator(()ident(struct)operator(.)ident(values)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(static) ident(RubyStruct) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(Ruby) ident(runtime) operator(=) ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(RubySymbol) ident(className) operator(=) operator(()ident(RubySymbol)operator(\)) ident(input)operator(.)ident(unmarshalObject)operator(()operator(\))operator(;) + ident(RubyClass) ident(rbClass) operator(=) ident(pathToClass)operator(()ident(runtime)operator(,) ident(className)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(rbClass) operator(==) keyword(null)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newNameError)operator(()string<delimiter(")content(uninitialized constant )delimiter(")> operator(+) ident(className)operator(,) ident(className)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) + + ident(RubyArray) ident(mem) operator(=) ident(members)operator(()ident(rbClass)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + + type(int) ident(len) operator(=) ident(input)operator(.)ident(unmarshalInt)operator(()operator(\))operator(;) + ident(IRubyObject)type([]) ident(values) operator(=) keyword(new) ident(IRubyObject)operator([)ident(len)operator(])operator(;) + keyword(for)operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(values)operator([)ident(i)operator(]) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + ident(RubyStruct) ident(result) operator(=) ident(newStruct)operator(()ident(rbClass)operator(,) ident(values)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + keyword(for)operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(len)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(IRubyObject) ident(slot) operator(=) ident(input)operator(.)ident(unmarshalObject)operator(()operator(\))operator(;) + keyword(if)operator(()operator(!)ident(mem)operator(.)ident(eltInternal)operator(()ident(i)operator(\))operator(.)ident(toString)operator(()operator(\))operator(.)ident(equals)operator(()ident(slot)operator(.)ident(toString)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(struct )delimiter(")> operator(+) ident(rbClass)operator(.)ident(getName)operator(()operator(\)) operator(+) string<delimiter(")content( not compatible (:)delimiter(")> operator(+) ident(slot) operator(+) string<delimiter(")content( for :)delimiter(")> operator(+) ident(mem)operator(.)ident(eltInternal)operator(()ident(i)operator(\)) operator(+) string<delimiter(")content(\))delimiter(")>operator(\))operator(;) + operator(}) + ident(result)operator(.)ident(aset)operator(()ident(runtime)operator(.)ident(newFixnum)operator(()ident(i)operator(\))operator(,) ident(input)operator(.)ident(unmarshalObject)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) directive(static) ident(RubyClass) ident(pathToClass)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(path)operator(\)) operator({) + comment(// FIXME: Throw the right ArgumentError's if the class is missing) + comment(// or if it's a module.) + keyword(return) operator(()ident(RubyClass)operator(\)) ident(runtime)operator(.)ident(getClassFromPath)operator(()ident(path)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(STRUCT_INSTANCE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(RubyStruct) ident(instance) operator(=) keyword(new) ident(RubyStruct)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + + ident(instance)operator(.)ident(setMetaClass)operator(()ident(klass)operator(\))operator(;) + + keyword(return) ident(instance)operator(;) + operator(}) + operator(})operator(;) + + annotation(@Override) + annotation(@JRubyMethod)operator(()ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(arg)operator(\)) keyword(return) local_variable(this)operator(;) + ident(RubyStruct) ident(original) operator(=) operator(()ident(RubyStruct)operator(\)) ident(arg)operator(;) + + ident(values) operator(=) keyword(new) ident(IRubyObject)operator([)ident(original)operator(.)ident(values)operator(.)ident(length)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(original)operator(.)ident(values)operator(,) integer(0)operator(,) ident(values)operator(,) integer(0)operator(,) ident(original)operator(.)ident(values)operator(.)ident(length)operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + +operator(}) +comment(/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Joey Gibson <joey@joeygibson.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Derek Berner <derek.berner@state.nm.us> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C\) 2007 William N Dortch <bill.dortch@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.util.concurrent.locks.ReentrantLock)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.BlockCallback)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) + +comment(/** + * Represents a Ruby symbol (e.g. :bar\) + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Symbol)delimiter(")>operator(\)) +directive(public) type(class) class(RubySymbol) directive(extends) ident(RubyObject) operator({) + directive(private) directive(final) type(String) ident(symbol)operator(;) + directive(private) directive(final) type(int) ident(id)operator(;) + directive(private) directive(final) ident(ByteList) ident(symbolBytes)operator(;) + + comment(/** + * + * @param runtime + * @param internedSymbol the String value of the new Symbol. This <em>must</em> + * have been previously interned + */) + directive(private) ident(RubySymbol)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(internedSymbol)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getSymbol)operator(()operator(\))operator(,) keyword(false)operator(\))operator(;) + comment(// symbol string *must* be interned) + + ident(assert) ident(internedSymbol) operator(==) ident(internedSymbol)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedSymbol) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + + local_variable(this)operator(.)ident(symbol) operator(=) ident(internedSymbol)operator(;) + local_variable(this)operator(.)ident(symbolBytes) operator(=) ident(ByteList)operator(.)ident(create)operator(()ident(symbol)operator(\))operator(;) + + local_variable(this)operator(.)ident(id) operator(=) ident(runtime)operator(.)ident(allocSymbolId)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(createSymbolClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(symbolClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Symbol)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setSymbol)operator(()ident(symbolClass)operator(\))operator(;) + ident(RubyClass) ident(symbolMetaClass) operator(=) ident(symbolClass)operator(.)ident(getMetaClass)operator(()operator(\))operator(;) + ident(symbolClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(SYMBOL)operator(;) + ident(symbolClass)operator(.)ident(kindOf) operator(=) keyword(new) ident(RubyModule)operator(.)ident(KindOf)operator(()operator(\)) operator({) + directive(public) type(boolean) ident(isKindOf)operator(()ident(IRubyObject) ident(obj)operator(,) ident(RubyModule) ident(type)operator(\)) operator({) + keyword(return) ident(obj) keyword(instanceof) ident(RubySymbol)operator(;) + operator(}) + operator(})operator(;) + + ident(symbolClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubySymbol)operator(.)ident(class)operator(\))operator(;) + ident(symbolMetaClass)operator(.)ident(undefineMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + + keyword(return) ident(symbolClass)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(getNativeTypeIndex)operator(()operator(\)) operator({) + keyword(return) ident(ClassIndex)operator(.)ident(SYMBOL)operator(;) + operator(}) + + comment(/** rb_to_id + * + * @return a String representation of the symbol + */) + annotation(@Override) + directive(public) type(String) ident(asJavaString)operator(()operator(\)) operator({) + keyword(return) ident(symbol)operator(;) + operator(}) + + comment(/** short circuit for Symbol key comparison + * + */) + annotation(@Override) + directive(public) directive(final) type(boolean) ident(eql)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) ident(other) operator(==) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(isImmediate)operator(()operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyClass) ident(getSingletonClass)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't define singleton)delimiter(")>operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubySymbol) ident(getSymbolLong)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(id)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getSymbolTable)operator(()operator(\))operator(.)ident(lookup)operator(()ident(id)operator(\))operator(;) + operator(}) + + comment(/* Symbol class methods. + * + */) + + directive(public) directive(static) ident(RubySymbol) ident(newSymbol)operator(()ident(Ruby) ident(runtime)operator(,) type(String) ident(name)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getSymbolTable)operator(()operator(\))operator(.)ident(getSymbol)operator(()ident(name)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_i)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(to_i)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(id)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_int)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(to_int)operator(()operator(\)) operator({) + keyword(if) operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getVerbose)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(SYMBOL_AS_INTEGER)operator(,) string<delimiter(")content(treating Symbol as an integer)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(to_i)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(:)delimiter(")> operator(+) + operator(()ident(isSymbolName)operator(()ident(symbol)operator(\)) operator(?) ident(symbol) operator(:) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(runtime)operator(,) ident(symbolBytes)operator(\))operator(.)ident(dump)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_s)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + keyword(return) ident(RubyString)operator(.)ident(newStringShared)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(symbolBytes)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(id2name)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(id2name)operator(()operator(\)) operator({) + keyword(return) ident(to_s)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(===)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_eqq)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) local_variable(super)operator(.)ident(op_equal)operator(()ident(context)operator(,) ident(other)operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(hashCode)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@Override) + directive(public) type(int) ident(hashCode)operator(()operator(\)) operator({) + keyword(return) ident(id)operator(;) + operator(}) + + directive(public) type(int) ident(getId)operator(()operator(\)) operator({) + keyword(return) ident(id)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(boolean) ident(equals)operator(()type(Object) ident(other)operator(\)) operator({) + keyword(return) ident(other) operator(==) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_sym)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_sym)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(freeze)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@Override) + directive(public) ident(IRubyObject) ident(taint)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(private) directive(static) type(class) class(ToProcCallback) directive(implements) ident(BlockCallback) operator({) + directive(private) ident(RubySymbol) ident(symbol)operator(;) + directive(public) ident(ToProcCallback)operator(()ident(RubySymbol) ident(symbol)operator(\)) operator({) + local_variable(this)operator(.)ident(symbol) operator(=) ident(symbol)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(ctx)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(blk)operator(\)) operator({) + ident(IRubyObject)type([]) ident(currentArgs) operator(=) ident(args)operator(;) + keyword(switch)operator(()ident(currentArgs)operator(.)ident(length)operator(\)) operator({) + keyword(case) integer(0)operator(:) keyword(throw) ident(symbol)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(no receiver given)delimiter(")>operator(\))operator(;) + keyword(case) integer(1)operator(:) operator({) + keyword(if)operator(()operator(()ident(currentArgs)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyArray)operator(\)) operator(&&) operator(()operator(()ident(RubyArray)operator(\))ident(currentArgs)operator([)integer(0)operator(])operator(\))operator(.)ident(getLength)operator(()operator(\)) operator(!=) integer(0)operator(\)) operator({) + comment(// This is needed to unpack stuff) + ident(currentArgs) operator(=) operator(()operator(()ident(RubyArray)operator(\))ident(currentArgs)operator([)integer(0)operator(])operator(\))operator(.)ident(toJavaArrayMaybeUnsafe)operator(()operator(\))operator(;) + ident(IRubyObject)type([]) ident(args2) operator(=) keyword(new) ident(IRubyObject)operator([)ident(currentArgs)operator(.)ident(length)operator(-)integer(1)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(currentArgs)operator(,) integer(1)operator(,) ident(args2)operator(,) integer(0)operator(,) ident(args2)operator(.)ident(length)operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(ctx)operator(,) ident(currentArgs)operator([)integer(0)operator(])operator(,) ident(symbol)operator(.)ident(symbol)operator(,) ident(args2)operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(ctx)operator(,) ident(currentArgs)operator([)integer(0)operator(])operator(,) ident(symbol)operator(.)ident(symbol)operator(\))operator(;) + operator(}) + operator(}) + keyword(default)operator(:) operator({) + ident(IRubyObject)type([]) ident(args2) operator(=) keyword(new) ident(IRubyObject)operator([)ident(currentArgs)operator(.)ident(length)operator(-)integer(1)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(currentArgs)operator(,) integer(1)operator(,) ident(args2)operator(,) integer(0)operator(,) ident(args2)operator(.)ident(length)operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(ctx)operator(,) ident(currentArgs)operator([)integer(0)operator(])operator(,) ident(symbol)operator(.)ident(symbol)operator(,) ident(args2)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + comment(/* + @JRubyMethod + public IRubyObject to_proc(\) { + return RubyProc.newProc(getRuntime(\), + CallBlock.newCallClosure(this, getRuntime(\).getSymbol(\), Arity.noArguments(\), new ToProcCallback(this\), getRuntime(\).getCurrentContext(\)\), + Block.Type.PROC\); + } + */) + directive(private) directive(static) type(boolean) ident(isIdentStart)operator(()type(char) ident(c)operator(\)) operator({) + keyword(return) operator(()operator(()ident(c) operator(>=) string<delimiter(')content(a)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(z)delimiter(')>operator(\))operator(||) operator(()ident(c) operator(>=) string<delimiter(')content(A)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(Z)delimiter(')>operator(\)) + operator(||) ident(c) operator(==) string<delimiter(')content(_)delimiter(')>operator(\))operator(;) + operator(}) + directive(private) directive(static) type(boolean) ident(isIdentChar)operator(()type(char) ident(c)operator(\)) operator({) + keyword(return) operator(()operator(()ident(c) operator(>=) string<delimiter(')content(a)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(z)delimiter(')>operator(\)) operator(||) operator(()ident(c) operator(>=) string<delimiter(')content(0)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(9)delimiter(')>operator(\)) operator(||) operator(()ident(c) operator(>=) string<delimiter(')content(A)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(Z)delimiter(')>operator(\)) + operator(||) ident(c) operator(==) string<delimiter(')content(_)delimiter(')>operator(\))operator(;) + operator(}) + + directive(private) directive(static) type(boolean) ident(isIdentifier)operator(()type(String) ident(s)operator(\)) operator({) + keyword(if) operator(()ident(s) operator(==) keyword(null) operator(||) ident(s)operator(.)ident(length)operator(()operator(\)) operator(<=) integer(0)operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(isIdentStart)operator(()ident(s)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(\))operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) integer(1)operator(;) ident(i) operator(<) ident(s)operator(.)ident(length)operator(()operator(\))operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(isIdentChar)operator(()ident(s)operator(.)ident(charAt)operator(()ident(i)operator(\))operator(\))operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + operator(}) + + keyword(return) keyword(true)operator(;) + operator(}) + + comment(/** + * is_special_global_name from parse.c. + * @param s + * @return + */) + directive(private) directive(static) type(boolean) ident(isSpecialGlobalName)operator(()type(String) ident(s)operator(\)) operator({) + keyword(if) operator(()ident(s) operator(==) keyword(null) operator(||) ident(s)operator(.)ident(length)operator(()operator(\)) operator(<=) integer(0)operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + type(int) ident(length) operator(=) ident(s)operator(.)ident(length)operator(()operator(\))operator(;) + + keyword(switch) operator(()ident(s)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(\)) operator({) + keyword(case) string<delimiter(')content(~)delimiter(')>operator(:) keyword(case) string<delimiter(')content(*)delimiter(')>operator(:) keyword(case) string<delimiter(')content($)delimiter(')>operator(:) keyword(case) string<delimiter(')content(?)delimiter(')>operator(:) keyword(case) string<delimiter(')content(!)delimiter(')>operator(:) keyword(case) string<delimiter(')content(@)delimiter(')>operator(:) keyword(case) string<delimiter(')content(/)delimiter(')>operator(:) keyword(case) string<delimiter(')char(\\\\)delimiter(')>operator(:) + keyword(case) string<delimiter(')content(;)delimiter(')>operator(:) keyword(case) string<delimiter(')content(,)delimiter(')>operator(:) keyword(case) string<delimiter(')content(.)delimiter(')>operator(:) keyword(case) string<delimiter(')content(=)delimiter(')>operator(:) keyword(case) string<delimiter(')content(:)delimiter(')>operator(:) keyword(case) string<delimiter(')content(<)delimiter(')>operator(:) keyword(case) string<delimiter(')content(>)delimiter(')>operator(:) keyword(case) string<delimiter(')content(\\")delimiter(')>operator(:) + keyword(case) string<delimiter(')content(&)delimiter(')>operator(:) keyword(case) string<delimiter(')content(`)delimiter(')>operator(:) keyword(case) string<delimiter(')char(\\')delimiter(')>operator(:) keyword(case) string<delimiter(')content(+)delimiter(')>operator(:) keyword(case) string<delimiter(')content(0)delimiter(')>operator(:) + keyword(return) ident(length) operator(==) integer(1)operator(;) + keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) + keyword(return) operator(()ident(length) operator(==) integer(1) operator(||) operator(()ident(length) operator(==) integer(2) operator(&&) ident(isIdentChar)operator(()ident(s)operator(.)ident(charAt)operator(()integer(1)operator(\))operator(\))operator(\))operator(\))operator(;) + + keyword(default)operator(:) + comment(// we already confirmed above that length > 0) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)type(Character)operator(.)ident(isDigit)operator(()ident(s)operator(.)ident(charAt)operator(()ident(i)operator(\))operator(\))operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(true)operator(;) + operator(}) + + directive(private) directive(static) type(boolean) ident(isSymbolName)operator(()type(String) ident(s)operator(\)) operator({) + keyword(if) operator(()ident(s) operator(==) keyword(null) operator(||) ident(s)operator(.)ident(length)operator(()operator(\)) operator(<) integer(1)operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + type(int) ident(length) operator(=) ident(s)operator(.)ident(length)operator(()operator(\))operator(;) + + type(char) ident(c) operator(=) ident(s)operator(.)ident(charAt)operator(()integer(0)operator(\))operator(;) + keyword(switch) operator(()ident(c)operator(\)) operator({) + keyword(case) string<delimiter(')content($)delimiter(')>operator(:) + keyword(if) operator(()ident(length) operator(>) integer(1) operator(&&) ident(isSpecialGlobalName)operator(()ident(s)operator(.)ident(substring)operator(()integer(1)operator(\))operator(\))operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + keyword(return) ident(isIdentifier)operator(()ident(s)operator(.)ident(substring)operator(()integer(1)operator(\))operator(\))operator(;) + keyword(case) string<delimiter(')content(@)delimiter(')>operator(:) + type(int) ident(offset) operator(=) integer(1)operator(;) + keyword(if) operator(()ident(length) operator(>=) integer(2) operator(&&) ident(s)operator(.)ident(charAt)operator(()integer(1)operator(\)) operator(==) string<delimiter(')content(@)delimiter(')>operator(\)) operator({) + ident(offset)operator(++)operator(;) + operator(}) + + keyword(return) ident(isIdentifier)operator(()ident(s)operator(.)ident(substring)operator(()ident(offset)operator(\))operator(\))operator(;) + keyword(case) string<delimiter(')content(<)delimiter(')>operator(:) + keyword(return) operator(()ident(length) operator(==) integer(1) operator(||) operator(()ident(length) operator(==) integer(2) operator(&&) operator(()ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(<<)delimiter(")>operator(\)) operator(||) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(<=)delimiter(")>operator(\))operator(\))operator(\)) operator(||) + operator(()ident(length) operator(==) integer(3) operator(&&) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(<=>)delimiter(")>operator(\))operator(\))operator(\))operator(;) + keyword(case) string<delimiter(')content(>)delimiter(')>operator(:) + keyword(return) operator(()ident(length) operator(==) integer(1)operator(\)) operator(||) operator(()ident(length) operator(==) integer(2) operator(&&) operator(()ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(>>)delimiter(")>operator(\)) operator(||) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(>=)delimiter(")>operator(\))operator(\))operator(\))operator(;) + keyword(case) string<delimiter(')content(=)delimiter(')>operator(:) + keyword(return) operator(()operator(()ident(length) operator(==) integer(2) operator(&&) operator(()ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(==)delimiter(")>operator(\)) operator(||) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(=~)delimiter(")>operator(\))operator(\))operator(\)) operator(||) + operator(()ident(length) operator(==) integer(3) operator(&&) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(===)delimiter(")>operator(\))operator(\))operator(\))operator(;) + keyword(case) string<delimiter(')content(*)delimiter(')>operator(:) + keyword(return) operator(()ident(length) operator(==) integer(1) operator(||) operator(()ident(length) operator(==) integer(2) operator(&&) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(**)delimiter(")>operator(\))operator(\))operator(\))operator(;) + keyword(case) string<delimiter(')content(+)delimiter(')>operator(:) + keyword(return) operator(()ident(length) operator(==) integer(1) operator(||) operator(()ident(length) operator(==) integer(2) operator(&&) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(+@)delimiter(")>operator(\))operator(\))operator(\))operator(;) + keyword(case) string<delimiter(')content(-)delimiter(')>operator(:) + keyword(return) operator(()ident(length) operator(==) integer(1) operator(||) operator(()ident(length) operator(==) integer(2) operator(&&) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content(-@)delimiter(")>operator(\))operator(\))operator(\))operator(;) + keyword(case) string<delimiter(')content(|)delimiter(')>operator(:) keyword(case) string<delimiter(')content(^)delimiter(')>operator(:) keyword(case) string<delimiter(')content(&)delimiter(')>operator(:) keyword(case) string<delimiter(')content(/)delimiter(')>operator(:) keyword(case) string<delimiter(')content(%)delimiter(')>operator(:) keyword(case) string<delimiter(')content(~)delimiter(')>operator(:) keyword(case) string<delimiter(')content(`)delimiter(')>operator(:) + keyword(return) ident(length) operator(==) integer(1)operator(;) + keyword(case) string<delimiter(')content([)delimiter(')>operator(:) + keyword(return) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content([])delimiter(")>operator(\)) operator(||) ident(s)operator(.)ident(equals)operator(()string<delimiter(")content([]=)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(isIdentStart)operator(()ident(c)operator(\))operator(\)) operator({) + keyword(return) keyword(false)operator(;) + operator(}) + + type(boolean) ident(localID) operator(=) operator(()ident(c) operator(>=) string<delimiter(')content(a)delimiter(')> operator(&&) ident(c) operator(<=) string<delimiter(')content(z)delimiter(')>operator(\))operator(;) + type(int) ident(last) operator(=) integer(1)operator(;) + + keyword(for) operator(()operator(;) ident(last) operator(<) ident(length)operator(;) ident(last)operator(++)operator(\)) operator({) + type(char) ident(d) operator(=) ident(s)operator(.)ident(charAt)operator(()ident(last)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isIdentChar)operator(()ident(d)operator(\))operator(\)) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(last) operator(==) ident(length)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(localID) operator(&&) ident(last) operator(==) ident(length) operator(-) integer(1)operator(\)) operator({) + type(char) ident(d) operator(=) ident(s)operator(.)ident(charAt)operator(()ident(last)operator(\))operator(;) + + keyword(return) ident(d) operator(==) string<delimiter(')content(!)delimiter(')> operator(||) ident(d) operator(==) string<delimiter(')content(?)delimiter(')> operator(||) ident(d) operator(==) string<delimiter(')content(=)delimiter(')>operator(;) + operator(}) + + keyword(return) keyword(false)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(all_symbols)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(all_symbols)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getSymbolTable)operator(()operator(\))operator(.)ident(all_symbols)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubySymbol) ident(unmarshalFrom)operator(()ident(UnmarshalStream) ident(input)operator(\)) directive(throws) ident(java)operator(.)ident(io)operator(.)ident(IOException) operator({) + ident(RubySymbol) ident(result) operator(=) ident(newSymbol)operator(()ident(input)operator(.)ident(getRuntime)operator(()operator(\))operator(,) ident(RubyString)operator(.)ident(byteListToString)operator(()ident(input)operator(.)ident(unmarshalString)operator(()operator(\))operator(\))operator(\))operator(;) + ident(input)operator(.)ident(registerLinkTarget)operator(()ident(result)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + directive(public) directive(static) type(class) class(SymbolTable) operator({) + directive(static) directive(final) type(int) ident(DEFAULT_INITIAL_CAPACITY) operator(=) integer(2048)operator(;) comment(// *must* be power of 2!) + directive(static) directive(final) type(int) ident(MAXIMUM_CAPACITY) operator(=) integer(1) operator(<)operator(<) integer(30)operator(;) + directive(static) directive(final) type(float) ident(DEFAULT_LOAD_FACTOR) operator(=) float(0.75f)operator(;) + + directive(private) directive(final) type(ReentrantLock) ident(tableLock) operator(=) keyword(new) type(ReentrantLock)operator(()operator(\))operator(;) + directive(private) directive(volatile) ident(SymbolEntry)type([]) ident(symbolTable)operator(;) + directive(private) type(int) ident(size)operator(;) + directive(private) type(int) ident(threshold)operator(;) + directive(private) directive(final) type(float) ident(loadFactor)operator(;) + directive(private) directive(final) ident(Ruby) ident(runtime)operator(;) + + directive(public) ident(SymbolTable)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(this)operator(.)ident(runtime) operator(=) ident(runtime)operator(;) + local_variable(this)operator(.)ident(loadFactor) operator(=) ident(DEFAULT_LOAD_FACTOR)operator(;) + local_variable(this)operator(.)ident(threshold) operator(=) operator(()type(int)operator(\))operator(()ident(DEFAULT_INITIAL_CAPACITY) operator(*) ident(DEFAULT_LOAD_FACTOR)operator(\))operator(;) + local_variable(this)operator(.)ident(symbolTable) operator(=) keyword(new) ident(SymbolEntry)operator([)ident(DEFAULT_INITIAL_CAPACITY)operator(])operator(;) + operator(}) + + comment(// note all fields are final -- rehash creates new entries when necessary.) + comment(// as documented in java.util.concurrent.ConcurrentHashMap.java, that will) + comment(// statistically affect only a small percentage (< 20%\) of entries for a given rehash.) + directive(static) type(class) class(SymbolEntry) operator({) + directive(final) type(int) ident(hash)operator(;) + directive(final) type(String) ident(name)operator(;) + directive(final) ident(RubySymbol) ident(symbol)operator(;) + directive(final) ident(SymbolEntry) ident(next)operator(;) + + ident(SymbolEntry)operator(()type(int) ident(hash)operator(,) type(String) ident(name)operator(,) ident(RubySymbol) ident(symbol)operator(,) ident(SymbolEntry) ident(next)operator(\)) operator({) + local_variable(this)operator(.)ident(hash) operator(=) ident(hash)operator(;) + local_variable(this)operator(.)ident(name) operator(=) ident(name)operator(;) + local_variable(this)operator(.)ident(symbol) operator(=) ident(symbol)operator(;) + local_variable(this)operator(.)ident(next) operator(=) ident(next)operator(;) + operator(}) + operator(}) + + directive(public) ident(RubySymbol) ident(getSymbol)operator(()type(String) ident(name)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + ident(SymbolEntry)type([]) ident(table)operator(;) + keyword(for) operator(()ident(SymbolEntry) ident(e) operator(=) operator(()ident(table) operator(=) ident(symbolTable)operator(\))operator([)ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(e)operator(.)ident(symbol)operator(;) + operator(}) + operator(}) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(tableLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + type(int) ident(potentialNewSize)operator(;) + keyword(if) operator(()operator(()ident(potentialNewSize) operator(=) ident(size) operator(+) integer(1)operator(\)) operator(>) ident(threshold)operator(\)) operator({) + ident(table) operator(=) ident(rehash)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(table) operator(=) ident(symbolTable)operator(;) + operator(}) + type(int) ident(index)operator(;) + comment(// try lookup again under lock) + keyword(for) operator(()ident(SymbolEntry) ident(e) operator(=) ident(table)operator([)ident(index) operator(=) ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(e)operator(.)ident(symbol)operator(;) + operator(}) + operator(}) + type(String) ident(internedName)operator(;) + ident(RubySymbol) ident(symbol) operator(=) keyword(new) ident(RubySymbol)operator(()ident(runtime)operator(,) ident(internedName) operator(=) ident(name)operator(.)ident(intern)operator(()operator(\))operator(\))operator(;) + ident(table)operator([)ident(index)operator(]) operator(=) keyword(new) ident(SymbolEntry)operator(()ident(hash)operator(,) ident(internedName)operator(,) ident(symbol)operator(,) ident(table)operator([)ident(index)operator(])operator(\))operator(;) + ident(size) operator(=) ident(potentialNewSize)operator(;) + comment(// write-volatile) + ident(symbolTable) operator(=) ident(table)operator(;) + keyword(return) ident(symbol)operator(;) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) ident(RubySymbol) ident(fastGetSymbol)operator(()type(String) ident(internedName)operator(\)) operator({) + ident(assert) ident(internedName) operator(==) ident(internedName)operator(.)ident(intern)operator(()operator(\)) operator(:) ident(internedName) operator(+) string<delimiter(")content( is not interned)delimiter(")>operator(;) + ident(SymbolEntry)type([]) ident(table)operator(;) + keyword(for) operator(()ident(SymbolEntry) ident(e) operator(=) operator(()ident(table) operator(=) ident(symbolTable)operator(\))operator([)ident(internedName)operator(.)ident(hashCode)operator(()operator(\)) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + keyword(return) ident(e)operator(.)ident(symbol)operator(;) + operator(}) + operator(}) + type(ReentrantLock) ident(lock)operator(;) + operator(()ident(lock) operator(=) ident(tableLock)operator(\))operator(.)ident(lock)operator(()operator(\))operator(;) + keyword(try) operator({) + type(int) ident(potentialNewSize)operator(;) + keyword(if) operator(()operator(()ident(potentialNewSize) operator(=) ident(size) operator(+) integer(1)operator(\)) operator(>) ident(threshold)operator(\)) operator({) + ident(table) operator(=) ident(rehash)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(table) operator(=) ident(symbolTable)operator(;) + operator(}) + type(int) ident(index)operator(;) + type(int) ident(hash)operator(;) + comment(// try lookup again under lock) + keyword(for) operator(()ident(SymbolEntry) ident(e) operator(=) ident(table)operator([)ident(index) operator(=) operator(()ident(hash) operator(=) ident(internedName)operator(.)ident(hashCode)operator(()operator(\))operator(\)) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(internedName) operator(==) ident(e)operator(.)ident(name)operator(\)) operator({) + keyword(return) ident(e)operator(.)ident(symbol)operator(;) + operator(}) + operator(}) + ident(RubySymbol) ident(symbol) operator(=) keyword(new) ident(RubySymbol)operator(()ident(runtime)operator(,) ident(internedName)operator(\))operator(;) + ident(table)operator([)ident(index)operator(]) operator(=) keyword(new) ident(SymbolEntry)operator(()ident(hash)operator(,) ident(internedName)operator(,) ident(symbol)operator(,) ident(table)operator([)ident(index)operator(])operator(\))operator(;) + ident(size) operator(=) ident(potentialNewSize)operator(;) + comment(// write-volatile) + ident(symbolTable) operator(=) ident(table)operator(;) + keyword(return) ident(symbol)operator(;) + operator(}) keyword(finally) operator({) + ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + operator(}) + + comment(// backwards-compatibility, but threadsafe now) + directive(public) ident(RubySymbol) ident(lookup)operator(()type(String) ident(name)operator(\)) operator({) + type(int) ident(hash) operator(=) ident(name)operator(.)ident(hashCode)operator(()operator(\))operator(;) + ident(SymbolEntry)type([]) ident(table)operator(;) + keyword(for) operator(()ident(SymbolEntry) ident(e) operator(=) operator(()ident(table) operator(=) ident(symbolTable)operator(\))operator([)ident(hash) operator(&) operator(()ident(table)operator(.)ident(length) operator(-) integer(1)operator(\))operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(hash) operator(==) ident(e)operator(.)ident(hash) operator(&&) ident(name)operator(.)ident(equals)operator(()ident(e)operator(.)ident(name)operator(\))operator(\)) operator({) + keyword(return) ident(e)operator(.)ident(symbol)operator(;) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(public) ident(RubySymbol) ident(lookup)operator(()type(long) ident(id)operator(\)) operator({) + ident(SymbolEntry)type([]) ident(table) operator(=) ident(symbolTable)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(SymbolEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + keyword(if) operator(()ident(id) operator(==) ident(e)operator(.)ident(symbol)operator(.)ident(id)operator(\)) operator({) + keyword(return) ident(e)operator(.)ident(symbol)operator(;) + operator(}) + operator(}) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + + directive(public) ident(RubyArray) ident(all_symbols)operator(()operator(\)) operator({) + ident(SymbolEntry)type([]) ident(table) operator(=) local_variable(this)operator(.)ident(symbolTable)operator(;) + ident(RubyArray) ident(array) operator(=) ident(runtime)operator(.)ident(newArray)operator(()local_variable(this)operator(.)ident(size)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(table)operator(.)ident(length)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + keyword(for) operator(()ident(SymbolEntry) ident(e) operator(=) ident(table)operator([)ident(i)operator(])operator(;) ident(e) operator(!=) keyword(null)operator(;) ident(e) operator(=) ident(e)operator(.)ident(next)operator(\)) operator({) + ident(array)operator(.)ident(append)operator(()ident(e)operator(.)ident(symbol)operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(array)operator(;) + operator(}) + + comment(// not so backwards-compatible here, but no one should have been) + comment(// calling this anyway.) + annotation(@Deprecated) + directive(public) type(void) ident(store)operator(()ident(RubySymbol) ident(symbol)operator(\)) operator({) + keyword(throw) keyword(new) type(UnsupportedOperationException)operator(()operator(\))operator(;) + operator(}) + + directive(private) ident(SymbolEntry)type([]) ident(rehash)operator(()operator(\)) operator({) + ident(SymbolEntry)type([]) ident(oldTable) operator(=) ident(symbolTable)operator(;) + type(int) ident(oldCapacity)operator(;) + keyword(if) operator(()operator(()ident(oldCapacity) operator(=) ident(oldTable)operator(.)ident(length)operator(\)) operator(>=) ident(MAXIMUM_CAPACITY)operator(\)) operator({) + keyword(return) ident(oldTable)operator(;) + operator(}) + + type(int) ident(newCapacity) operator(=) ident(oldCapacity) operator(<)operator(<) integer(1)operator(;) + ident(SymbolEntry)type([]) ident(newTable) operator(=) keyword(new) ident(SymbolEntry)operator([)ident(newCapacity)operator(])operator(;) + ident(threshold) operator(=) operator(()type(int)operator(\))operator(()ident(newCapacity) operator(*) ident(loadFactor)operator(\))operator(;) + type(int) ident(sizeMask) operator(=) ident(newCapacity) operator(-) integer(1)operator(;) + ident(SymbolEntry) ident(e)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(oldCapacity)operator(;) operator(--)ident(i) operator(>=) integer(0)operator(;) operator(\)) operator({) + comment(// We need to guarantee that any existing reads of old Map can) + comment(// proceed. So we cannot yet null out each bin.) + ident(e) operator(=) ident(oldTable)operator([)ident(i)operator(])operator(;) + + keyword(if) operator(()ident(e) operator(!=) keyword(null)operator(\)) operator({) + ident(SymbolEntry) ident(next) operator(=) ident(e)operator(.)ident(next)operator(;) + type(int) ident(idx) operator(=) ident(e)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + + comment(// Single node on list) + keyword(if) operator(()ident(next) operator(==) keyword(null)operator(\)) + ident(newTable)operator([)ident(idx)operator(]) operator(=) ident(e)operator(;) + + keyword(else) operator({) + comment(// Reuse trailing consecutive sequence at same slot) + ident(SymbolEntry) ident(lastRun) operator(=) ident(e)operator(;) + type(int) ident(lastIdx) operator(=) ident(idx)operator(;) + keyword(for) operator(()ident(SymbolEntry) ident(last) operator(=) ident(next)operator(;) + ident(last) operator(!=) keyword(null)operator(;) + ident(last) operator(=) ident(last)operator(.)ident(next)operator(\)) operator({) + type(int) ident(k) operator(=) ident(last)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + keyword(if) operator(()ident(k) operator(!=) ident(lastIdx)operator(\)) operator({) + ident(lastIdx) operator(=) ident(k)operator(;) + ident(lastRun) operator(=) ident(last)operator(;) + operator(}) + operator(}) + ident(newTable)operator([)ident(lastIdx)operator(]) operator(=) ident(lastRun)operator(;) + + comment(// Clone all remaining nodes) + keyword(for) operator(()ident(SymbolEntry) ident(p) operator(=) ident(e)operator(;) ident(p) operator(!=) ident(lastRun)operator(;) ident(p) operator(=) ident(p)operator(.)ident(next)operator(\)) operator({) + type(int) ident(k) operator(=) ident(p)operator(.)ident(hash) operator(&) ident(sizeMask)operator(;) + ident(SymbolEntry) ident(n) operator(=) ident(newTable)operator([)ident(k)operator(])operator(;) + ident(newTable)operator([)ident(k)operator(]) operator(=) keyword(new) ident(SymbolEntry)operator(()ident(p)operator(.)ident(hash)operator(,) ident(p)operator(.)ident(name)operator(,) ident(p)operator(.)ident(symbol)operator(,) ident(n)operator(\))operator(;) + operator(}) + operator(}) + operator(}) + operator(}) + ident(symbolTable) operator(=) ident(newTable)operator(;) + keyword(return) ident(newTable)operator(;) + operator(}) + + operator(}) +operator(}) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(java.util.HashMap)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ObjectMarshal)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.builtin.Variable)operator(;) +keyword(import) include(org.jruby.runtime.component.VariableEntry)operator(;) +keyword(import) include(org.jruby.runtime.marshal.MarshalStream)operator(;) +keyword(import) include(org.jruby.runtime.marshal.UnmarshalStream)operator(;) + +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(SystemCallError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(StandardError)delimiter(")>operator(\)) +directive(public) type(class) class(RubySystemCallError) directive(extends) ident(RubyException) operator({) + directive(private) ident(IRubyObject) ident(errno) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + directive(private) directive(final) directive(static) type(Map)operator(<)type(String)operator(,) type(String)operator(>) ident(defaultMessages) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) type(String)operator(>)operator(()operator(\))operator(;) + directive(static) operator({) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EPERM)delimiter(")>operator(,) string<delimiter(")content(Operation not permitted)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOENT)delimiter(")>operator(,) string<delimiter(")content(No such file or directory)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ESRCH)delimiter(")>operator(,) string<delimiter(")content(No such process)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EINTR)delimiter(")>operator(,) string<delimiter(")content(Interrupted system call)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EIO)delimiter(")>operator(,) string<delimiter(")content(Input/output error)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENXIO)delimiter(")>operator(,) string<delimiter(")content(Device not configured)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::E2BIG)delimiter(")>operator(,) string<delimiter(")content(Argument list too long)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOEXEC)delimiter(")>operator(,) string<delimiter(")content(Exec format error)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EBADF)delimiter(")>operator(,) string<delimiter(")content(Bad file descriptor)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ECHILD)delimiter(")>operator(,) string<delimiter(")content(No child processes)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EDEADLK)delimiter(")>operator(,) string<delimiter(")content(Resource deadlock avoided)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOMEM)delimiter(")>operator(,) string<delimiter(")content(Cannot allocate memory)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EACCES)delimiter(")>operator(,) string<delimiter(")content(Permission denied)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EFAULT)delimiter(")>operator(,) string<delimiter(")content(Bad address)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOTBLK)delimiter(")>operator(,) string<delimiter(")content(Block device required)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EBUSY)delimiter(")>operator(,) string<delimiter(")content(Resource busy)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EEXIST)delimiter(")>operator(,) string<delimiter(")content(File exists)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EXDEV)delimiter(")>operator(,) string<delimiter(")content(Cross-device link)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENODEV)delimiter(")>operator(,) string<delimiter(")content(Operation not supported by device)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOTDIR)delimiter(")>operator(,) string<delimiter(")content(Not a directory)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EISDIR)delimiter(")>operator(,) string<delimiter(")content(Is a directory)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EINVAL)delimiter(")>operator(,) string<delimiter(")content(Invalid argument)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENFILE)delimiter(")>operator(,) string<delimiter(")content(Too many open files in system)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EMFILE)delimiter(")>operator(,) string<delimiter(")content(Too many open files)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOTTY)delimiter(")>operator(,) string<delimiter(")content(Inappropriate ioctl for device)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ETXTBSY)delimiter(")>operator(,) string<delimiter(")content(Text file busy)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EFBIG)delimiter(")>operator(,) string<delimiter(")content(File too large)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOSPC)delimiter(")>operator(,) string<delimiter(")content(No space left on device)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ESPIPE)delimiter(")>operator(,) string<delimiter(")content(Illegal seek)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EROFS)delimiter(")>operator(,) string<delimiter(")content(Read-only file system)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EMLINK)delimiter(")>operator(,) string<delimiter(")content(Too many links)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EPIPE)delimiter(")>operator(,) string<delimiter(")content(Broken pipe)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EDOM)delimiter(")>operator(,) string<delimiter(")content(Numerical argument out of domain)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ERANGE)delimiter(")>operator(,) string<delimiter(")content(Result too large)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EAGAIN)delimiter(")>operator(,) string<delimiter(")content(Resource temporarily unavailable)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EWOULDBLOCK)delimiter(")>operator(,) string<delimiter(")content(Resource temporarily unavailable)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EINPROGRESS)delimiter(")>operator(,) string<delimiter(")content(Operation now in progress)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EALREADY)delimiter(")>operator(,) string<delimiter(")content(Operation already in progress)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOTSOCK)delimiter(")>operator(,) string<delimiter(")content(Socket operation on non-socket)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EDESTADDRREQ)delimiter(")>operator(,) string<delimiter(")content(Destination address required)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EMSGSIZE)delimiter(")>operator(,) string<delimiter(")content(Message too long)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EPROTOTYPE)delimiter(")>operator(,) string<delimiter(")content(Protocol wrong type for socket)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOPROTOOPT)delimiter(")>operator(,) string<delimiter(")content(Protocol not available)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EPROTONOSUPPORT)delimiter(")>operator(,) string<delimiter(")content(Protocol not supported)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ESOCKTNOSUPPORT)delimiter(")>operator(,) string<delimiter(")content(Socket type not supported)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EPFNOSUPPORT)delimiter(")>operator(,) string<delimiter(")content(Protocol family not supported)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EAFNOSUPPORT)delimiter(")>operator(,) string<delimiter(")content(Address family not supported by protocol family)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EADDRINUSE)delimiter(")>operator(,) string<delimiter(")content(Address already in use)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EADDRNOTAVAIL)delimiter(")>operator(,) string<delimiter(")content(Can't assign requested address)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENETDOWN)delimiter(")>operator(,) string<delimiter(")content(Network is down)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENETUNREACH)delimiter(")>operator(,) string<delimiter(")content(Network is unreachable)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENETRESET)delimiter(")>operator(,) string<delimiter(")content(Network dropped connection on reset)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ECONNABORTED)delimiter(")>operator(,) string<delimiter(")content(Software caused connection abort)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ECONNRESET)delimiter(")>operator(,) string<delimiter(")content(Connection reset by peer)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOBUFS)delimiter(")>operator(,) string<delimiter(")content(No buffer space available)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EISCONN)delimiter(")>operator(,) string<delimiter(")content(Socket is already connected)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOTCONN)delimiter(")>operator(,) string<delimiter(")content(Socket is not connected)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ESHUTDOWN)delimiter(")>operator(,) string<delimiter(")content(Can't send after socket shutdown)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ETOOMANYREFS)delimiter(")>operator(,) string<delimiter(")content(Too many references: can't splice)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ETIMEDOUT)delimiter(")>operator(,) string<delimiter(")content(Operation timed out)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ECONNREFUSED)delimiter(")>operator(,) string<delimiter(")content(Connection refused)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ELOOP)delimiter(")>operator(,) string<delimiter(")content(Too many levels of symbolic links)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENAMETOOLONG)delimiter(")>operator(,) string<delimiter(")content(File name too long)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EHOSTDOWN)delimiter(")>operator(,) string<delimiter(")content(Host is down)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EHOSTUNREACH)delimiter(")>operator(,) string<delimiter(")content(No route to host)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOTEMPTY)delimiter(")>operator(,) string<delimiter(")content(Directory not empty)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EUSERS)delimiter(")>operator(,) string<delimiter(")content(Too many users)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EDQUOT)delimiter(")>operator(,) string<delimiter(")content(Disc quota exceeded)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ESTALE)delimiter(")>operator(,) string<delimiter(")content(Stale NFS file handle)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EREMOTE)delimiter(")>operator(,) string<delimiter(")content(Too many levels of remote in path)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOLCK)delimiter(")>operator(,) string<delimiter(")content(No locks available)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOSYS)delimiter(")>operator(,) string<delimiter(")content(Function not implemented)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EOVERFLOW)delimiter(")>operator(,) string<delimiter(")content(Value too large to be stored in data type)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EIDRM)delimiter(")>operator(,) string<delimiter(")content(Identifier removed)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOMSG)delimiter(")>operator(,) string<delimiter(")content(No message of desired type)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EILSEQ)delimiter(")>operator(,) string<delimiter(")content(Illegal byte sequence)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EBADMSG)delimiter(")>operator(,) string<delimiter(")content(Bad message)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EMULTIHOP)delimiter(")>operator(,) string<delimiter(")content(EMULTIHOP (Reserved\))delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENODATA)delimiter(")>operator(,) string<delimiter(")content(No message available on STREAM)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOLINK)delimiter(")>operator(,) string<delimiter(")content(ENOLINK (Reserved\))delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOSR)delimiter(")>operator(,) string<delimiter(")content(No STREAM resources)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ENOSTR)delimiter(")>operator(,) string<delimiter(")content(Not a STREAM)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EPROTO)delimiter(")>operator(,) string<delimiter(")content(Protocol error)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::ETIME)delimiter(")>operator(,) string<delimiter(")content(STREAM ioctl timeout)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EOPNOTSUPP)delimiter(")>operator(,) string<delimiter(")content(Operation not supported)delimiter(")>operator(\))operator(;) + ident(defaultMessages)operator(.)ident(put)operator(()string<delimiter(")content(Errno::EOPNOTSUPP_DARWIN)delimiter(")>operator(,) string<delimiter(")content(Operation not supported)delimiter(")>operator(\))operator(;) + operator(}) + + directive(protected) ident(RubySystemCallError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(,) keyword(null)operator(\))operator(;) + operator(}) + + directive(public) ident(RubySystemCallError)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) type(String) ident(message)operator(,) type(int) ident(errno)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(,) ident(message)operator(\))operator(;) + local_variable(this)operator(.)ident(errno) operator(=) ident(runtime)operator(.)ident(newFixnum)operator(()ident(errno)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(ObjectAllocator) ident(SYSTEM_CALL_ERROR_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + ident(RubyException) ident(instance) operator(=) keyword(new) ident(RubySystemCallError)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + + ident(instance)operator(.)ident(setMetaClass)operator(()ident(klass)operator(\))operator(;) + + keyword(return) ident(instance)operator(;) + operator(}) + operator(})operator(;) + + directive(private) directive(static) directive(final) ident(ObjectMarshal) ident(SYSTEM_CALL_ERROR_MARSHAL) operator(=) keyword(new) ident(ObjectMarshal)operator(()operator(\)) operator({) + directive(public) type(void) ident(marshalTo)operator(()ident(Ruby) ident(runtime)operator(,) type(Object) ident(obj)operator(,) ident(RubyClass) ident(type)operator(,) + ident(MarshalStream) ident(marshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(RubySystemCallError) ident(exc) operator(=) operator(()ident(RubySystemCallError)operator(\)) ident(obj)operator(;) + ident(marshalStream)operator(.)ident(registerLinkTarget)operator(()ident(exc)operator(\))operator(;) + + type(List)operator(<)ident(Variable)operator(<)ident(IRubyObject)operator(>)operator(>) ident(attrs) operator(=) ident(exc)operator(.)ident(getVariableList)operator(()operator(\))operator(;) + ident(attrs)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(() + string<delimiter(")content(mesg)delimiter(")>operator(,) ident(exc)operator(.)ident(message) operator(==) keyword(null) operator(?) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(exc)operator(.)ident(message)operator(\))operator(\))operator(;) + ident(attrs)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()string<delimiter(")content(errno)delimiter(")>operator(,) ident(exc)operator(.)ident(errno)operator(\))operator(\))operator(;) + ident(attrs)operator(.)ident(add)operator(()keyword(new) ident(VariableEntry)operator(<)ident(IRubyObject)operator(>)operator(()string<delimiter(")content(bt)delimiter(")>operator(,) ident(exc)operator(.)ident(getBacktrace)operator(()operator(\))operator(\))operator(\))operator(;) + ident(marshalStream)operator(.)ident(dumpVariables)operator(()ident(attrs)operator(\))operator(;) + operator(}) + + directive(public) type(Object) ident(unmarshalFrom)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(,) + ident(UnmarshalStream) ident(unmarshalStream)operator(\)) directive(throws) type(IOException) operator({) + ident(RubySystemCallError) ident(exc) operator(=) operator(()ident(RubySystemCallError)operator(\)) ident(type)operator(.)ident(allocate)operator(()operator(\))operator(;) + + ident(unmarshalStream)operator(.)ident(registerLinkTarget)operator(()ident(exc)operator(\))operator(;) + ident(unmarshalStream)operator(.)ident(defaultVariablesUnmarshal)operator(()ident(exc)operator(\))operator(;) + + ident(exc)operator(.)ident(message) operator(=) ident(exc)operator(.)ident(removeInternalVariable)operator(()string<delimiter(")content(mesg)delimiter(")>operator(\))operator(;) + ident(exc)operator(.)ident(errno) operator(=) ident(exc)operator(.)ident(removeInternalVariable)operator(()string<delimiter(")content(errno)delimiter(")>operator(\))operator(;) + ident(exc)operator(.)ident(set_backtrace)operator(()ident(exc)operator(.)ident(removeInternalVariable)operator(()string<delimiter(")content(bt)delimiter(")>operator(\))operator(\))operator(;) + + keyword(return) ident(exc)operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createSystemCallErrorClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(standardError)operator(\)) operator({) + ident(RubyClass) ident(exceptionClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(SystemCallError)delimiter(")>operator(,) ident(standardError)operator(,) ident(SYSTEM_CALL_ERROR_ALLOCATOR)operator(\))operator(;) + + ident(exceptionClass)operator(.)ident(setMarshal)operator(()ident(SYSTEM_CALL_ERROR_MARSHAL)operator(\))operator(;) + + ident(runtime)operator(.)ident(callbackFactory)operator(()ident(RubyClass)operator(.)ident(class)operator(\))operator(;) + ident(exceptionClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubySystemCallError)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(exceptionClass)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(optional) operator(=) integer(2)operator(,) ident(required)operator(=)integer(0)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(sCallErorrClass) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getSystemCallError)operator(()operator(\))operator(;) + ident(RubyClass) ident(klass) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(;) + + ident(IRubyObject) ident(msg) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(IRubyObject) ident(err) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + + type(boolean) ident(isErrnoClass) operator(=) operator(!)ident(klass)operator(.)ident(equals)operator(()ident(sCallErorrClass)operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(isErrnoClass)operator(\)) operator({) + comment(// one optional, one required args) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) integer(1)operator(,) integer(2)operator(\))operator(;) + ident(msg) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(2)operator(\)) operator({) + ident(err) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + operator(}) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1) operator(&&) operator(()ident(msg) keyword(instanceof) ident(RubyFixnum)operator(\))operator(\)) operator({) + ident(err) operator(=) ident(msg)operator(;) + ident(msg) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + comment(// one optional and no required args) + ident(Arity)operator(.)ident(checkArgumentCount)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(args)operator(,) integer(0)operator(,) integer(1)operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + ident(msg) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + operator(}) + comment(// try to get errno out of the class ) + ident(err) operator(=) ident(klass)operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(Errno)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(err)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(errno) operator(=) ident(err)operator(.)ident(convertToInteger)operator(()operator(\))operator(;) + operator(}) + + type(String) ident(val) operator(=) ident(defaultMessages)operator(.)ident(get)operator(()ident(klass)operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(val) operator(==) keyword(null)operator(\)) operator({) + ident(val) operator(=) string<delimiter(")content(Unknown error)delimiter(")>operator(;) + operator(}) + + comment(// MRI behavior: we don't print errno for actual Errno errors) + keyword(if) operator(()operator(!)ident(errno)operator(.)ident(isNil)operator(()operator(\)) operator(&&) operator(!)ident(isErrnoClass)operator(\)) operator({) + ident(val) operator(+=) string<delimiter(")content( )delimiter(")> operator(+) ident(errno)operator(.)ident(toString)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(msg)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(val) operator(+=) string<delimiter(")content( - )delimiter(")> operator(+) ident(msg)operator(.)ident(convertToString)operator(()operator(\))operator(;) + operator(}) + + ident(message) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(val)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod) + directive(public) ident(IRubyObject) ident(errno)operator(()operator(\)) operator({) + keyword(return) ident(errno)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) + +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(SystemExit)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Exception)delimiter(")>operator(\)) +directive(public) type(class) class(RubySystemExit) directive(extends) ident(RubyException) operator({) + ident(IRubyObject) ident(status)operator(;) + + directive(private) directive(static) ident(ObjectAllocator) ident(SYSTEMEXIT_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubySystemExit)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createSystemExitClass)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(\)) operator({) + ident(RubyClass) ident(systemExitClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(SystemExit)delimiter(")>operator(,) ident(exceptionClass)operator(,) ident(SYSTEMEXIT_ALLOCATOR)operator(\))operator(;) + + ident(systemExitClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubySystemExit)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(systemExitClass)operator(;) + operator(}) + + directive(public) directive(static) ident(RubySystemExit) ident(newInstance)operator(()ident(Ruby) ident(runtime)operator(,) type(int) ident(status)operator(\)) operator({) + ident(RubyClass) ident(exc) operator(=) ident(runtime)operator(.)ident(getSystemExit)operator(()operator(\))operator(;) + ident(IRubyObject)type([]) ident(exArgs) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) + ident(runtime)operator(.)ident(newFixnum)operator(()ident(status)operator(\))operator(,) + ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(exit)delimiter(")>operator(\)) operator(})operator(;) + keyword(return) operator(()ident(RubySystemExit)operator(\)) ident(exc)operator(.)ident(newInstance)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(exArgs)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + directive(protected) ident(RubySystemExit)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(exceptionClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(exceptionClass)operator(\))operator(;) + ident(status) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([])ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(status) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0) operator(&&) ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(status) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(IRubyObject)type([])ident(tmpArgs) operator(=) keyword(new) ident(IRubyObject)operator([)ident(args)operator(.)ident(length) operator(-) integer(1)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(1)operator(,) ident(tmpArgs)operator(,) integer(0)operator(,) ident(tmpArgs)operator(.)ident(length)operator(\))operator(;) + ident(args) operator(=) ident(tmpArgs)operator(;) + operator(}) + local_variable(super)operator(.)ident(initialize)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(status)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(status)operator(()operator(\)) operator({) + keyword(return) ident(status)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(success?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(success_p)operator(()operator(\)) operator({) + keyword(if) operator(()ident(status)operator(.)ident(isNil)operator(()operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(if) operator(()ident(status)operator(.)ident(equals)operator(()ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(\)) keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002 Jason Voegele <jason@jvoegele.com> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) +keyword(import) include(java.nio.channels.Channel)operator(;) +keyword(import) include(java.nio.channels.SelectableChannel)operator(;) +keyword(import) include(java.nio.channels.SelectionKey)operator(;) +keyword(import) include(java.nio.channels.Selector)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.Map)operator(;) + +keyword(import) include(java.util.Set)operator(;) +keyword(import) include(org.jruby.common.IRubyWarnings.ID)operator(;) +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.exceptions.ThreadKill)operator(;) +keyword(import) include(org.jruby.internal.runtime.FutureThread)operator(;) +keyword(import) include(org.jruby.internal.runtime.NativeThread)operator(;) +keyword(import) include(org.jruby.internal.runtime.RubyRunnable)operator(;) +keyword(import) include(org.jruby.internal.runtime.ThreadLike)operator(;) +keyword(import) include(org.jruby.internal.runtime.ThreadService)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +keyword(import) include(java.util.concurrent.ExecutionException)operator(;) +keyword(import) include(java.util.concurrent.locks.ReentrantLock)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.runtime.ObjectMarshal)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) + +comment(/** + * Implementation of Ruby's <code>Thread</code> class. Each Ruby thread is + * mapped to an underlying Java Virtual Machine thread. + * <p> + * Thread encapsulates the behavior of a thread of execution, including the main + * thread of the Ruby script. In the descriptions that follow, the parameter + * <code>aSymbol</code> refers to a symbol, which is either a quoted string or a + * <code>Symbol</code> (such as <code>:name</code>\). + * + * Note: For CVS history, see ThreadClass.java. + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Thread)delimiter(")>operator(\)) +directive(public) type(class) class(RubyThread) directive(extends) ident(RubyObject) operator({) + directive(private) ident(ThreadLike) ident(threadImpl)operator(;) + directive(private) ident(RubyFixnum) ident(priority)operator(;) + directive(private) directive(transient) type(Map)operator(<)ident(IRubyObject)operator(,) ident(IRubyObject)operator(>) ident(threadLocalVariables)operator(;) + directive(private) type(boolean) ident(abortOnException)operator(;) + directive(private) ident(IRubyObject) ident(finalResult)operator(;) + directive(private) ident(RaiseException) ident(exitingException)operator(;) + directive(private) ident(IRubyObject) ident(receivedException)operator(;) + directive(private) ident(RubyThreadGroup) ident(threadGroup)operator(;) + + directive(private) directive(final) ident(ThreadService) ident(threadService)operator(;) + directive(private) directive(volatile) type(boolean) ident(isStopped) operator(=) keyword(false)operator(;) + directive(private) directive(volatile) type(boolean) ident(isDead) operator(=) keyword(false)operator(;) + directive(public) type(Object) ident(stopLock) operator(=) keyword(new) type(Object)operator(()operator(\))operator(;) + + directive(private) directive(volatile) type(boolean) ident(killed) operator(=) keyword(false)operator(;) + directive(public) type(Object) ident(killLock) operator(=) keyword(new) type(Object)operator(()operator(\))operator(;) + + directive(public) directive(final) type(ReentrantLock) ident(lock) operator(=) keyword(new) type(ReentrantLock)operator(()operator(\))operator(;) + + directive(private) directive(static) directive(final) type(boolean) ident(DEBUG) operator(=) keyword(false)operator(;) + + directive(protected) ident(RubyThread)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + local_variable(this)operator(.)ident(threadService) operator(=) ident(runtime)operator(.)ident(getThreadService)operator(()operator(\))operator(;) + ident(finalResult) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Dispose of the current thread by removing it from its parent ThreadGroup. + */) + directive(public) type(void) ident(dispose)operator(()operator(\)) operator({) + ident(threadGroup)operator(.)ident(remove)operator(()local_variable(this)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(createThreadClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + comment(// FIXME: In order for Thread to play well with the standard 'new' behavior,) + comment(// it must provide an allocator that can create empty object instances which) + comment(// initialize then fills with appropriate data.) + ident(RubyClass) ident(threadClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Thread)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setThread)operator(()ident(threadClass)operator(\))operator(;) + + ident(threadClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyThread)operator(.)ident(class)operator(\))operator(;) + + ident(RubyThread) ident(rubyThread) operator(=) keyword(new) ident(RubyThread)operator(()ident(runtime)operator(,) ident(threadClass)operator(\))operator(;) + comment(// TODO: need to isolate the "current" thread from class creation) + ident(rubyThread)operator(.)ident(threadImpl) operator(=) keyword(new) ident(NativeThread)operator(()ident(rubyThread)operator(,) type(Thread)operator(.)ident(currentThread)operator(()operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(setMainThread)operator(()type(Thread)operator(.)ident(currentThread)operator(()operator(\))operator(,) ident(rubyThread)operator(\))operator(;) + + comment(// set to default thread group) + ident(runtime)operator(.)ident(getDefaultThreadGroup)operator(()operator(\))operator(.)ident(addDirectly)operator(()ident(rubyThread)operator(\))operator(;) + + ident(threadClass)operator(.)ident(setMarshal)operator(()ident(ObjectMarshal)operator(.)ident(NOT_MARSHALABLE_MARSHAL)operator(\))operator(;) + + keyword(return) ident(threadClass)operator(;) + operator(}) + + comment(/** + * <code>Thread.new</code> + * <p> + * Thread.new( <i>[ arg ]*</i> \) {| args | block } -> aThread + * <p> + * Creates a new thread to execute the instructions given in block, and + * begins running it. Any arguments passed to Thread.new are passed into the + * block. + * <pre> + * x = Thread.new { sleep .1; print "x"; print "y"; print "z" } + * a = Thread.new { print "a"; print "b"; sleep .2; print "c" } + * x.join # Let the threads finish before + * a.join # main thread exits... + * </pre> + * <i>produces:</i> abxyzc + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(new)delimiter(")>operator(,) string<delimiter(")content(fork)delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(startThread)operator(()ident(recv)operator(,) ident(args)operator(,) keyword(true)operator(,) ident(block)operator(\))operator(;) + operator(}) + + comment(/** + * Basically the same as Thread.new . However, if class Thread is + * subclassed, then calling start in that subclass will not invoke the + * subclass's initialize method. + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(start)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyThread) ident(start)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(startThread)operator(()ident(recv)operator(,) ident(args)operator(,) keyword(false)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyThread) ident(adopt)operator(()ident(IRubyObject) ident(recv)operator(,) type(Thread) ident(t)operator(\)) operator({) + keyword(return) ident(adoptThread)operator(()ident(recv)operator(,) ident(t)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) + + directive(private) directive(static) ident(RubyThread) ident(adoptThread)operator(()directive(final) ident(IRubyObject) ident(recv)operator(,) type(Thread) ident(t)operator(,) ident(Block) ident(block)operator(\)) operator({) + directive(final) ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyThread) ident(rubyThread) operator(=) keyword(new) ident(RubyThread)operator(()ident(runtime)operator(,) operator(()ident(RubyClass)operator(\)) ident(recv)operator(\))operator(;) + + ident(rubyThread)operator(.)ident(threadImpl) operator(=) keyword(new) ident(NativeThread)operator(()ident(rubyThread)operator(,) ident(t)operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(registerNewThread)operator(()ident(rubyThread)operator(\))operator(;) + + ident(context)operator(.)ident(preAdoptThread)operator(()operator(\))operator(;) + + comment(// set to default thread group) + ident(runtime)operator(.)ident(getDefaultThreadGroup)operator(()operator(\))operator(.)ident(addDirectly)operator(()ident(rubyThread)operator(\))operator(;) + + keyword(return) ident(rubyThread)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) keyword(throw) ident(runtime)operator(.)ident(newThreadError)operator(()string<delimiter(")content(must be called with a block)delimiter(")>operator(\))operator(;) + + ident(RubyRunnable) ident(runnable) operator(=) keyword(new) ident(RubyRunnable)operator(()local_variable(this)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(if) operator(()ident(RubyInstanceConfig)operator(.)ident(POOLING_ENABLED)operator(\)) operator({) + ident(threadImpl) operator(=) keyword(new) ident(FutureThread)operator(()local_variable(this)operator(,) ident(runnable)operator(\))operator(;) + operator(}) keyword(else) operator({) + type(Thread) ident(thread) operator(=) keyword(new) type(Thread)operator(()ident(runnable)operator(\))operator(;) + ident(thread)operator(.)ident(setDaemon)operator(()keyword(true)operator(\))operator(;) + ident(threadImpl) operator(=) keyword(new) ident(NativeThread)operator(()local_variable(this)operator(,) ident(thread)operator(\))operator(;) + operator(}) + + comment(// set to default thread group) + ident(runtime)operator(.)ident(getDefaultThreadGroup)operator(()operator(\))operator(.)ident(addDirectly)operator(()local_variable(this)operator(\))operator(;) + + ident(threadImpl)operator(.)ident(start)operator(()operator(\))operator(;) + + comment(// We yield here to hopefully permit the target thread to schedule) + comment(// MRI immediately schedules it, so this is close but not exact) + type(Thread)operator(.)ident(yield)operator(()operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(private) directive(static) ident(RubyThread) ident(startThread)operator(()directive(final) ident(IRubyObject) ident(recv)operator(,) directive(final) ident(IRubyObject)type([]) ident(args)operator(,) type(boolean) ident(callInit)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyThread) ident(rubyThread) operator(=) keyword(new) ident(RubyThread)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(()ident(RubyClass)operator(\)) ident(recv)operator(\))operator(;) + + keyword(if) operator(()ident(callInit)operator(\)) operator({) + ident(rubyThread)operator(.)ident(callInit)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) keyword(else) operator({) + comment(// for Thread::start, which does not call the subclass's initialize) + ident(rubyThread)operator(.)ident(initialize)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + keyword(return) ident(rubyThread)operator(;) + operator(}) + + directive(private) type(void) ident(ensureNotCurrent)operator(()operator(\)) operator({) + keyword(if) operator(()local_variable(this) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(\)) operator({) + keyword(throw) keyword(new) type(RuntimeException)operator(()string<delimiter(")content(internal thread method called from another thread)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(synchronized) type(void) ident(cleanTerminate)operator(()ident(IRubyObject) ident(result)operator(\)) operator({) + ident(finalResult) operator(=) ident(result)operator(;) + ident(isStopped) operator(=) keyword(true)operator(;) + ident(isDead) operator(=) keyword(true)operator(;) + operator(}) + + directive(public) type(void) ident(pollThreadEvents)operator(()operator(\)) operator({) + ident(pollThreadEvents)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(pollThreadEvents)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + comment(// check for criticalization *before* locking ourselves) + ident(threadService)operator(.)ident(waitForCritical)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(killed)operator(\)) ident(throwThreadKill)operator(()operator(\))operator(;) + keyword(if) operator(()ident(receivedException) operator(!=) keyword(null)operator(\)) ident(receivedAnException)operator(()ident(context)operator(\))operator(;) + operator(}) + + directive(private) type(void) ident(throwThreadKill)operator(()operator(\)) operator({) + keyword(throw) keyword(new) ident(ThreadKill)operator(()operator(\))operator(;) + operator(}) + + comment(/** + * Returns the status of the global ``abort on exception'' condition. The + * default is false. When set to true, will cause all threads to abort (the + * process will exit(0\)\) if an exception is raised in any thread. See also + * Thread.abort_on_exception= . + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abort_on_exception)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyBoolean) ident(abort_on_exception_x)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(isGlobalAbortOnExceptionEnabled)operator(()operator(\)) operator(?) ident(runtime)operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(runtime)operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abort_on_exception=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(abort_on_exception_set_x)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(setGlobalAbortOnExceptionEnabled)operator(()ident(value)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(current)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyThread) ident(current)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(main)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyThread) ident(main)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(getMainThread)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pass)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(pass)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(ThreadService) ident(ts) operator(=) ident(runtime)operator(.)ident(getThreadService)operator(()operator(\))operator(;) + type(boolean) ident(critical) operator(=) ident(ts)operator(.)ident(getCritical)operator(()operator(\))operator(;) + + ident(ts)operator(.)ident(setCritical)operator(()keyword(false)operator(\))operator(;) + + type(Thread)operator(.)ident(yield)operator(()operator(\))operator(;) + + ident(ts)operator(.)ident(setCritical)operator(()ident(critical)operator(\))operator(;) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(list)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyArray) ident(list)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(RubyThread)type([]) ident(activeThreads) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(getActiveRubyThreads)operator(()operator(\))operator(;) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArrayNoCopy)operator(()ident(activeThreads)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(getSymbolKey)operator(()ident(IRubyObject) ident(originalKey)operator(\)) operator({) + keyword(if) operator(()ident(originalKey) keyword(instanceof) ident(RubySymbol)operator(\)) operator({) + keyword(return) ident(originalKey)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(originalKey) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newSymbol)operator(()ident(originalKey)operator(.)ident(asJavaString)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(originalKey) keyword(instanceof) ident(RubyFixnum)operator(\)) operator({) + ident(getRuntime)operator(()operator(\))operator(.)ident(getWarnings)operator(()operator(\))operator(.)ident(warn)operator(()ident(ID)operator(.)ident(FIXNUMS_NOT_SYMBOLS)operator(,) string<delimiter(")content(Do not use Fixnums as Symbols)delimiter(")>operator(\))operator(;) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(originalKey) operator(+) string<delimiter(")content( is not a symbol)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(originalKey) operator(+) string<delimiter(")content( is not a symbol)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(synchronized) type(Map)operator(<)ident(IRubyObject)operator(,) ident(IRubyObject)operator(>) ident(getThreadLocals)operator(()operator(\)) operator({) + keyword(if) operator(()ident(threadLocalVariables) operator(==) keyword(null)operator(\)) operator({) + ident(threadLocalVariables) operator(=) keyword(new) type(HashMap)operator(<)ident(IRubyObject)operator(,) ident(IRubyObject)operator(>)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(threadLocalVariables)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([])delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_aref)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) + ident(IRubyObject) ident(value)operator(;) + keyword(if) operator(()operator(()ident(value) operator(=) ident(getThreadLocals)operator(()operator(\))operator(.)ident(get)operator(()ident(getSymbolKey)operator(()ident(key)operator(\))operator(\))operator(\)) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(value)operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content([]=)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(op_aset)operator(()ident(IRubyObject) ident(key)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(key) operator(=) ident(getSymbolKey)operator(()ident(key)operator(\))operator(;) + + ident(getThreadLocals)operator(()operator(\))operator(.)ident(put)operator(()ident(key)operator(,) ident(value)operator(\))operator(;) + keyword(return) ident(value)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abort_on_exception)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(abort_on_exception)operator(()operator(\)) operator({) + keyword(return) ident(abortOnException) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(abort_on_exception=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(abort_on_exception_set)operator(()ident(IRubyObject) ident(val)operator(\)) operator({) + ident(abortOnException) operator(=) ident(val)operator(.)ident(isTrue)operator(()operator(\))operator(;) + keyword(return) ident(val)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(alive?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(alive_p)operator(()operator(\)) operator({) + keyword(return) operator(!)ident(isDead) operator(&&) ident(threadImpl)operator(.)ident(isAlive)operator(()operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(join)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(backtrace) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(join)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + type(long) ident(timeoutMillis) operator(=) type(Long)operator(.)ident(MAX_VALUE)operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()ident(args)operator(.)ident(length)operator(,)integer(1)operator(\))operator(;) + operator(}) + comment(// MRI behavior: value given in seconds; converted to Float; less) + comment(// than or equal to zero returns immediately; returns nil) + ident(timeoutMillis) operator(=) operator(()type(long)operator(\))operator(()float(1000.0)ident(D) operator(*) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToFloat)operator(()operator(\))operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + keyword(if) operator(()ident(timeoutMillis) operator(<=) integer(0)operator(\)) operator({) + comment(// TODO: not sure that we should skip calling join(\) altogether.) + comment(// Thread.join(\) has some implications for Java Memory Model, etc.) + keyword(if) operator(()ident(threadImpl)operator(.)ident(isAlive)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) + operator(}) + keyword(if) operator(()ident(isCurrent)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newThreadError)operator(()string<delimiter(")content(thread tried to join itself)delimiter(")>operator(\))operator(;) + operator(}) + keyword(try) operator({) + keyword(if) operator(()ident(threadService)operator(.)ident(getCritical)operator(()operator(\))operator(\)) operator({) + comment(// If the target thread is sleeping or stopped, wake it) + directive(synchronized) operator(()ident(stopLock)operator(\)) operator({) + ident(stopLock)operator(.)ident(notify)operator(()operator(\))operator(;) + operator(}) + + comment(// interrupt the target thread in case it's blocking or waiting) + comment(// WARNING: We no longer interrupt the target thread, since this usually means) + comment(// interrupting IO and with NIO that means the channel is no longer usable.) + comment(// We either need a new way to handle waking a target thread that's waiting) + comment(// on IO, or we need to accept that we can't wake such threads and must wait) + comment(// for them to complete their operation.) + comment(//threadImpl.interrupt(\);) + operator(}) + + ident(RubyThread) ident(currentThread) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(;) + directive(final) type(long) ident(timeToWait) operator(=) type(Math)operator(.)ident(min)operator(()ident(timeoutMillis)operator(,) integer(200)operator(\))operator(;) + + comment(// We need this loop in order to be able to "unblock" the) + comment(// join call without actually calling interrupt.) + type(long) ident(start) operator(=) type(System)operator(.)ident(currentTimeMillis)operator(()operator(\))operator(;) + keyword(while)operator(()keyword(true)operator(\)) operator({) + ident(currentThread)operator(.)ident(pollThreadEvents)operator(()operator(\))operator(;) + ident(threadImpl)operator(.)ident(join)operator(()ident(timeToWait)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(threadImpl)operator(.)ident(isAlive)operator(()operator(\))operator(\)) operator({) + keyword(break)operator(;) + operator(}) + keyword(if) operator(()type(System)operator(.)ident(currentTimeMillis)operator(()operator(\)) operator(-) ident(start) operator(>) ident(timeoutMillis)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + operator(}) + operator(}) keyword(catch) operator(()type(InterruptedException) ident(ie)operator(\)) operator({) + ident(ie)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + ident(assert) keyword(false) operator(:) ident(ie)operator(;) + operator(}) keyword(catch) operator(()type(ExecutionException) ident(ie)operator(\)) operator({) + ident(ie)operator(.)ident(printStackTrace)operator(()operator(\))operator(;) + ident(assert) keyword(false) operator(:) ident(ie)operator(;) + operator(}) + + keyword(if) operator(()ident(exitingException) operator(!=) keyword(null)operator(\)) operator({) + keyword(throw) ident(exitingException)operator(;) + operator(}) + + keyword(if) operator(()ident(threadImpl)operator(.)ident(isAlive)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(value)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(value)operator(()operator(\)) operator({) + ident(join)operator(()keyword(new) ident(IRubyObject)operator([)integer(0)operator(])operator(\))operator(;) + directive(synchronized) operator(()local_variable(this)operator(\)) operator({) + keyword(return) ident(finalResult)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(group)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(group)operator(()operator(\)) operator({) + keyword(if) operator(()ident(threadGroup) operator(==) keyword(null)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(threadGroup)operator(;) + operator(}) + + type(void) ident(setThreadGroup)operator(()ident(RubyThreadGroup) ident(rubyThreadGroup)operator(\)) operator({) + ident(threadGroup) operator(=) ident(rubyThreadGroup)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inspect)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(inspect)operator(()operator(\)) operator({) + comment(// FIXME: There's some code duplication here with RubyObject#inspect) + type(StringBuilder) ident(part) operator(=) keyword(new) type(StringBuilder)operator(()operator(\))operator(;) + type(String) ident(cname) operator(=) ident(getMetaClass)operator(()operator(\))operator(.)ident(getRealClass)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(;) + ident(part)operator(.)ident(append)operator(()string<delimiter(")content(#<)delimiter(")>operator(\))operator(.)ident(append)operator(()ident(cname)operator(\))operator(.)ident(append)operator(()string<delimiter(")content(:0x)delimiter(")>operator(\))operator(;) + ident(part)operator(.)ident(append)operator(()type(Integer)operator(.)ident(toHexString)operator(()type(System)operator(.)ident(identityHashCode)operator(()local_variable(this)operator(\))operator(\))operator(\))operator(;) + + keyword(if) operator(()ident(threadImpl)operator(.)ident(isAlive)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(isStopped)operator(\)) operator({) + ident(part)operator(.)ident(append)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content( sleep)delimiter(")>operator(\))operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(killed)operator(\)) operator({) + ident(part)operator(.)ident(append)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content( aborting)delimiter(")>operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(part)operator(.)ident(append)operator(()ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content( run)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + ident(part)operator(.)ident(append)operator(()string<delimiter(")content( dead)delimiter(")>operator(\))operator(;) + operator(}) + + ident(part)operator(.)ident(append)operator(()string<delimiter(")content(>)delimiter(")>operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(part)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(key?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyBoolean) ident(key_p)operator(()ident(IRubyObject) ident(key)operator(\)) operator({) + ident(key) operator(=) ident(getSymbolKey)operator(()ident(key)operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(getThreadLocals)operator(()operator(\))operator(.)ident(containsKey)operator(()ident(key)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(keys)delimiter(")>operator(\)) + directive(public) ident(RubyArray) ident(keys)operator(()operator(\)) operator({) + ident(IRubyObject)type([]) ident(keys) operator(=) keyword(new) ident(IRubyObject)operator([)ident(getThreadLocals)operator(()operator(\))operator(.)ident(size)operator(()operator(\))operator(])operator(;) + + keyword(return) ident(RubyArray)operator(.)ident(newArrayNoCopy)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getThreadLocals)operator(()operator(\))operator(.)ident(keySet)operator(()operator(\))operator(.)ident(toArray)operator(()ident(keys)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(critical=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(critical_set)operator(()ident(IRubyObject) ident(receiver)operator(,) ident(IRubyObject) ident(value)operator(\)) operator({) + ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(setCritical)operator(()ident(value)operator(.)ident(isTrue)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(value)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(critical)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(critical)operator(()ident(IRubyObject) ident(receiver)operator(\)) operator({) + keyword(return) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(getCritical)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(stop)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(stop)operator(()ident(IRubyObject) ident(receiver)operator(\)) operator({) + ident(RubyThread) ident(rubyThread) operator(=) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(;) + type(Object) ident(stopLock) operator(=) ident(rubyThread)operator(.)ident(stopLock)operator(;) + + directive(synchronized) operator(()ident(stopLock)operator(\)) operator({) + ident(rubyThread)operator(.)ident(pollThreadEvents)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(rubyThread)operator(.)ident(isStopped) operator(=) keyword(true)operator(;) + comment(// attempt to decriticalize all if we're the critical thread) + ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(setCritical)operator(()keyword(false)operator(\))operator(;) + + ident(stopLock)operator(.)ident(wait)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(InterruptedException) ident(ie)operator(\)) operator({) + ident(rubyThread)operator(.)ident(pollThreadEvents)operator(()operator(\))operator(;) + operator(}) + ident(rubyThread)operator(.)ident(isStopped) operator(=) keyword(false)operator(;) + operator(}) + + keyword(return) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(kill)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(kill)operator(()ident(IRubyObject) ident(receiver)operator(,) ident(IRubyObject) ident(rubyThread)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(rubyThread) keyword(instanceof) ident(RubyThread)operator(\))operator(\)) keyword(throw) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(rubyThread)operator(,) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(\))operator(;) + keyword(return) operator(()operator(()ident(RubyThread)operator(\))ident(rubyThread)operator(\))operator(.)ident(kill)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(exit)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(s_exit)operator(()ident(IRubyObject) ident(receiver)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyThread) ident(rubyThread) operator(=) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(;) + + ident(rubyThread)operator(.)ident(killed) operator(=) keyword(true)operator(;) + comment(// attempt to decriticalize all if we're the critical thread) + ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(setCritical)operator(()keyword(false)operator(\))operator(;) + + keyword(throw) keyword(new) ident(ThreadKill)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(stop?)delimiter(")>operator(\)) + directive(public) ident(RubyBoolean) ident(stop_p)operator(()operator(\)) operator({) + comment(// not valid for "dead" state) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(isStopped)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(wakeup)delimiter(")>operator(\)) + directive(public) ident(RubyThread) ident(wakeup)operator(()operator(\)) operator({) + directive(synchronized) operator(()ident(stopLock)operator(\)) operator({) + ident(stopLock)operator(.)ident(notifyAll)operator(()operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(priority)delimiter(")>operator(\)) + directive(public) ident(RubyFixnum) ident(priority)operator(()operator(\)) operator({) + keyword(return) ident(priority)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(priority=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(priority_set)operator(()ident(IRubyObject) ident(priority)operator(\)) operator({) + comment(// FIXME: This should probably do some translation from Ruby priority levels to Java priority levels (until we have green threads\)) + type(int) ident(iPriority) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(priority)operator(\))operator(;) + + keyword(if) operator(()ident(iPriority) operator(<) type(Thread)operator(.)ident(MIN_PRIORITY)operator(\)) operator({) + ident(iPriority) operator(=) type(Thread)operator(.)ident(MIN_PRIORITY)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(iPriority) operator(>) type(Thread)operator(.)ident(MAX_PRIORITY)operator(\)) operator({) + ident(iPriority) operator(=) type(Thread)operator(.)ident(MAX_PRIORITY)operator(;) + operator(}) + + local_variable(this)operator(.)ident(priority) operator(=) ident(RubyFixnum)operator(.)ident(newFixnum)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(iPriority)operator(\))operator(;) + + keyword(if) operator(()ident(threadImpl)operator(.)ident(isAlive)operator(()operator(\))operator(\)) operator({) + ident(threadImpl)operator(.)ident(setPriority)operator(()ident(iPriority)operator(\))operator(;) + operator(}) + keyword(return) local_variable(this)operator(.)ident(priority)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(raise)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(raise)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(ensureNotCurrent)operator(()operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(getRuntime)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(DEBUG)operator(\)) type(System)operator(.)ident(out)operator(.)ident(println)operator(()string<delimiter(")content(thread )delimiter(")> operator(+) type(Thread)operator(.)ident(currentThread)operator(()operator(\)) operator(+) string<delimiter(")content( before raising)delimiter(")>operator(\))operator(;) + ident(RubyThread) ident(currentThread) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(;) + keyword(try) operator({) + keyword(while) operator(()operator(!)operator(()ident(currentThread)operator(.)ident(lock)operator(.)ident(tryLock)operator(()operator(\)) operator(&&) local_variable(this)operator(.)ident(lock)operator(.)ident(tryLock)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(if) operator(()ident(currentThread)operator(.)ident(lock)operator(.)ident(isHeldByCurrentThread)operator(()operator(\))operator(\)) ident(currentThread)operator(.)ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + + ident(currentThread)operator(.)ident(pollThreadEvents)operator(()operator(\))operator(;) + keyword(if) operator(()ident(DEBUG)operator(\)) type(System)operator(.)ident(out)operator(.)ident(println)operator(()string<delimiter(")content(thread )delimiter(")> operator(+) type(Thread)operator(.)ident(currentThread)operator(()operator(\)) operator(+) string<delimiter(")content( raising)delimiter(")>operator(\))operator(;) + ident(receivedException) operator(=) ident(prepareRaiseException)operator(()ident(runtime)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + + comment(// If the target thread is sleeping or stopped, wake it) + directive(synchronized) operator(()ident(stopLock)operator(\)) operator({) + ident(stopLock)operator(.)ident(notify)operator(()operator(\))operator(;) + operator(}) + + comment(// interrupt the target thread in case it's blocking or waiting) + comment(// WARNING: We no longer interrupt the target thread, since this usually means) + comment(// interrupting IO and with NIO that means the channel is no longer usable.) + comment(// We either need a new way to handle waking a target thread that's waiting) + comment(// on IO, or we need to accept that we can't wake such threads and must wait) + comment(// for them to complete their operation.) + comment(//threadImpl.interrupt(\);) + + comment(// new interrupt, to hopefully wake it out of any blocking IO) + local_variable(this)operator(.)ident(interrupt)operator(()operator(\))operator(;) + operator(}) keyword(finally) operator({) + keyword(if) operator(()ident(currentThread)operator(.)ident(lock)operator(.)ident(isHeldByCurrentThread)operator(()operator(\))operator(\)) ident(currentThread)operator(.)ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + keyword(if) operator(()local_variable(this)operator(.)ident(lock)operator(.)ident(isHeldByCurrentThread)operator(()operator(\))operator(\)) local_variable(this)operator(.)ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(prepareRaiseException)operator(()ident(Ruby) ident(runtime)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(==) integer(0)operator(\)) operator({) + ident(IRubyObject) ident(lastException) operator(=) ident(runtime)operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($!)delimiter(")>operator(\))operator(;) + keyword(if)operator(()ident(lastException)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(return) keyword(new) ident(RaiseException)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getRuntimeError)operator(()operator(\))operator(,) string<delimiter(")delimiter(")>operator(,) keyword(false)operator(\))operator(.)ident(getException)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(lastException)operator(;) + operator(}) + + ident(IRubyObject) ident(exception)operator(;) + ident(ThreadContext) ident(context) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + + keyword(if)operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + keyword(if)operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyString)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getRuntimeError)operator(()operator(\))operator(.)ident(newInstance)operator(()ident(context)operator(,) ident(args)operator(,) ident(block)operator(\))operator(;) + operator(}) + + keyword(if)operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(respondsTo)operator(()string<delimiter(")content(exception)delimiter(")>operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(exception class/object expected)delimiter(")>operator(\))operator(.)ident(getException)operator(()operator(\))operator(;) + operator(}) + ident(exception) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(exception)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(if) operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(respondsTo)operator(()string<delimiter(")content(exception)delimiter(")>operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(exception class/object expected)delimiter(")>operator(\))operator(.)ident(getException)operator(()operator(\))operator(;) + operator(}) + + ident(exception) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(exception)delimiter(")>operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + + keyword(if) operator(()operator(!)ident(runtime)operator(.)ident(getException)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(exception)operator(\))operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(exception object expected)delimiter(")>operator(\))operator(.)ident(getException)operator(()operator(\))operator(;) + operator(}) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(3)operator(\)) operator({) + operator(()operator(()ident(RubyException)operator(\)) ident(exception)operator(\))operator(.)ident(set_backtrace)operator(()ident(args)operator([)integer(2)operator(])operator(\))operator(;) + operator(}) + + keyword(return) ident(exception)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(run)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(run)operator(()operator(\)) operator({) + comment(// if stopped, unstop) + directive(synchronized) operator(()ident(stopLock)operator(\)) operator({) + keyword(if) operator(()ident(isStopped)operator(\)) operator({) + ident(isStopped) operator(=) keyword(false)operator(;) + ident(stopLock)operator(.)ident(notifyAll)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + directive(public) type(void) ident(sleep)operator(()type(long) ident(millis)operator(\)) directive(throws) type(InterruptedException) operator({) + ident(assert) local_variable(this) operator(==) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(;) + directive(synchronized) operator(()ident(stopLock)operator(\)) operator({) + ident(pollThreadEvents)operator(()operator(\))operator(;) + keyword(try) operator({) + ident(isStopped) operator(=) keyword(true)operator(;) + ident(stopLock)operator(.)ident(wait)operator(()ident(millis)operator(\))operator(;) + operator(}) keyword(finally) operator({) + ident(isStopped) operator(=) keyword(false)operator(;) + ident(pollThreadEvents)operator(()operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(status)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(status)operator(()operator(\)) operator({) + keyword(if) operator(()ident(threadImpl)operator(.)ident(isAlive)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()ident(isStopped) operator(||) ident(currentSelector) operator(!=) keyword(null) operator(&&) ident(currentSelector)operator(.)ident(isOpen)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(sleep)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(killed)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(aborting)delimiter(")>operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(run)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(exitingException) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(kill)delimiter(")>operator(,) string<delimiter(")content(exit)delimiter(")>operator(,) string<delimiter(")content(terminate)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(kill)operator(()operator(\)) operator({) + comment(// need to reexamine this) + ident(RubyThread) ident(currentThread) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(;) + + comment(// If the killee thread is the same as the killer thread, just die) + keyword(if) operator(()ident(currentThread) operator(==) local_variable(this)operator(\)) ident(throwThreadKill)operator(()operator(\))operator(;) + + keyword(try) operator({) + keyword(if) operator(()ident(DEBUG)operator(\)) type(System)operator(.)ident(out)operator(.)ident(println)operator(()string<delimiter(")content(thread )delimiter(")> operator(+) type(Thread)operator(.)ident(currentThread)operator(()operator(\)) operator(+) string<delimiter(")content( trying to kill)delimiter(")>operator(\))operator(;) + keyword(while) operator(()operator(!)operator(()ident(currentThread)operator(.)ident(lock)operator(.)ident(tryLock)operator(()operator(\)) operator(&&) local_variable(this)operator(.)ident(lock)operator(.)ident(tryLock)operator(()operator(\))operator(\))operator(\)) operator({) + keyword(if) operator(()ident(currentThread)operator(.)ident(lock)operator(.)ident(isHeldByCurrentThread)operator(()operator(\))operator(\)) ident(currentThread)operator(.)ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + + ident(currentThread)operator(.)ident(pollThreadEvents)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(DEBUG)operator(\)) type(System)operator(.)ident(out)operator(.)ident(println)operator(()string<delimiter(")content(thread )delimiter(")> operator(+) type(Thread)operator(.)ident(currentThread)operator(()operator(\)) operator(+) string<delimiter(")content( succeeded with kill)delimiter(")>operator(\))operator(;) + ident(killed) operator(=) keyword(true)operator(;) + + comment(// If the target thread is sleeping or stopped, wake it) + directive(synchronized) operator(()ident(stopLock)operator(\)) operator({) + ident(stopLock)operator(.)ident(notify)operator(()operator(\))operator(;) + operator(}) + + comment(// interrupt the target thread in case it's blocking or waiting) + comment(// WARNING: We no longer interrupt the target thread, since this usually means) + comment(// interrupting IO and with NIO that means the channel is no longer usable.) + comment(// We either need a new way to handle waking a target thread that's waiting) + comment(// on IO, or we need to accept that we can't wake such threads and must wait) + comment(// for them to complete their operation.) + comment(//threadImpl.interrupt(\);) + + comment(// new interrupt, to hopefully wake it out of any blocking IO) + local_variable(this)operator(.)ident(interrupt)operator(()operator(\))operator(;) + operator(}) keyword(finally) operator({) + keyword(if) operator(()ident(currentThread)operator(.)ident(lock)operator(.)ident(isHeldByCurrentThread)operator(()operator(\))operator(\)) ident(currentThread)operator(.)ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + keyword(if) operator(()local_variable(this)operator(.)ident(lock)operator(.)ident(isHeldByCurrentThread)operator(()operator(\))operator(\)) local_variable(this)operator(.)ident(lock)operator(.)ident(unlock)operator(()operator(\))operator(;) + operator(}) + + keyword(try) operator({) + ident(threadImpl)operator(.)ident(join)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(InterruptedException) ident(ie)operator(\)) operator({) + comment(// we were interrupted, check thread events again) + ident(currentThread)operator(.)ident(pollThreadEvents)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(ExecutionException) ident(ie)operator(\)) operator({) + comment(// we were interrupted, check thread events again) + ident(currentThread)operator(.)ident(pollThreadEvents)operator(()operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(kill!)delimiter(")>operator(,) string<delimiter(")content(exit!)delimiter(")>operator(,) string<delimiter(")content(terminate!)delimiter(")>operator(})operator(\)) + directive(public) ident(IRubyObject) ident(kill_bang)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Thread#kill!, exit!, and terminate! are not safe and not supported)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(safe_level)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(safe_level)operator(()operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newNotImplementedError)operator(()string<delimiter(")content(Thread-specific SAFE levels are not supported)delimiter(")>operator(\))operator(;) + operator(}) + + directive(private) type(boolean) ident(isCurrent)operator(()operator(\)) operator({) + keyword(return) ident(threadImpl)operator(.)ident(isCurrent)operator(()operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(exceptionRaised)operator(()ident(RaiseException) ident(exception)operator(\)) operator({) + ident(assert) ident(isCurrent)operator(()operator(\))operator(;) + + ident(RubyException) ident(rubyException) operator(=) ident(exception)operator(.)ident(getException)operator(()operator(\))operator(;) + ident(Ruby) ident(runtime) operator(=) ident(rubyException)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if) operator(()ident(runtime)operator(.)ident(getSystemExit)operator(()operator(\))operator(.)ident(isInstance)operator(()ident(rubyException)operator(\))operator(\)) operator({) + ident(threadService)operator(.)ident(getMainThread)operator(()operator(\))operator(.)ident(raise)operator(()keyword(new) ident(IRubyObject)type([]) operator({)ident(rubyException)operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(abortOnException)operator(()ident(runtime)operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(printError)operator(()ident(rubyException)operator(\))operator(;) + ident(RubyException) ident(systemExit) operator(=) ident(RubySystemExit)operator(.)ident(newInstance)operator(()ident(runtime)operator(,) integer(1)operator(\))operator(;) + ident(systemExit)operator(.)ident(message) operator(=) ident(rubyException)operator(.)ident(message)operator(;) + ident(systemExit)operator(.)ident(set_backtrace)operator(()ident(rubyException)operator(.)ident(backtrace)operator(()operator(\))operator(\))operator(;) + ident(threadService)operator(.)ident(getMainThread)operator(()operator(\))operator(.)ident(raise)operator(()keyword(new) ident(IRubyObject)type([]) operator({)ident(systemExit)operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + keyword(return)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(runtime)operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(runtime)operator(.)ident(printError)operator(()ident(exception)operator(.)ident(getException)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(exitingException) operator(=) ident(exception)operator(;) + operator(}) + + directive(private) type(boolean) ident(abortOnException)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + keyword(return) operator(()ident(runtime)operator(.)ident(isGlobalAbortOnExceptionEnabled)operator(()operator(\)) operator(||) ident(abortOnException)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyThread) ident(mainThread)operator(()ident(IRubyObject) ident(receiver)operator(\)) operator({) + keyword(return) ident(receiver)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getThreadService)operator(()operator(\))operator(.)ident(getMainThread)operator(()operator(\))operator(;) + operator(}) + + directive(private) type(Selector) ident(currentSelector)operator(;) + + annotation(@Deprecated) + directive(public) type(boolean) ident(selectForAccept)operator(()ident(RubyIO) ident(io)operator(\)) operator({) + keyword(return) ident(select)operator(()ident(io)operator(,) type(SelectionKey)operator(.)ident(OP_ACCEPT)operator(\))operator(;) + operator(}) + + directive(public) type(boolean) ident(select)operator(()ident(RubyIO) ident(io)operator(,) type(int) ident(ops)operator(\)) operator({) + type(Channel) ident(channel) operator(=) ident(io)operator(.)ident(getChannel)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(channel) keyword(instanceof) type(SelectableChannel)operator(\)) operator({) + type(SelectableChannel) ident(selectable) operator(=) operator(()type(SelectableChannel)operator(\))ident(channel)operator(;) + + directive(synchronized) operator(()ident(selectable)operator(.)ident(blockingLock)operator(()operator(\))operator(\)) operator({) + type(boolean) ident(oldBlocking) operator(=) ident(selectable)operator(.)ident(isBlocking)operator(()operator(\))operator(;) + + keyword(try) operator({) + ident(selectable)operator(.)ident(configureBlocking)operator(()keyword(false)operator(\))operator(;) + + ident(io)operator(.)ident(addBlockingThread)operator(()local_variable(this)operator(\))operator(;) + ident(currentSelector) operator(=) ident(selectable)operator(.)ident(provider)operator(()operator(\))operator(.)ident(openSelector)operator(()operator(\))operator(;) + + type(SelectionKey) ident(key) operator(=) ident(selectable)operator(.)ident(register)operator(()ident(currentSelector)operator(,) ident(ops)operator(\))operator(;) + + type(int) ident(result) operator(=) ident(currentSelector)operator(.)ident(select)operator(()operator(\))operator(;) + + comment(// check for thread events, in case we've been woken up to die) + ident(pollThreadEvents)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(result) operator(==) integer(1)operator(\)) operator({) + type(Set)operator(<)type(SelectionKey)operator(>) ident(keySet) operator(=) ident(currentSelector)operator(.)ident(selectedKeys)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(keySet)operator(.)ident(iterator)operator(()operator(\))operator(.)ident(next)operator(()operator(\)) operator(==) ident(key)operator(\)) operator({) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + + keyword(return) keyword(false)operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + keyword(throw) ident(io)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRuntimeError)operator(()string<delimiter(")content(Error with selector: )delimiter(")> operator(+) ident(ioe)operator(\))operator(;) + operator(}) keyword(finally) operator({) + keyword(if) operator(()ident(currentSelector) operator(!=) keyword(null)operator(\)) operator({) + keyword(try) operator({) + ident(currentSelector)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + keyword(throw) ident(io)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newRuntimeError)operator(()string<delimiter(")content(Could not close selector)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + ident(currentSelector) operator(=) keyword(null)operator(;) + ident(io)operator(.)ident(removeBlockingThread)operator(()local_variable(this)operator(\))operator(;) + keyword(try) operator({) + ident(selectable)operator(.)ident(configureBlocking)operator(()ident(oldBlocking)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(ioe)operator(\)) operator({) + comment(// ignore; I don't like doing it, but it seems like we) + comment(// really just need to make all channels non-blocking by) + comment(// default and use select when implementing blocking ops,) + comment(// so if this remains set non-blocking, perhaps it's not) + comment(// such a big deal...) + operator(}) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + comment(// can't select, just have to do a blocking call) + keyword(return) keyword(true)operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(interrupt)operator(()operator(\)) operator({) + keyword(if) operator(()ident(currentSelector) operator(!=) keyword(null)operator(\)) operator({) + ident(currentSelector)operator(.)ident(wakeup)operator(()operator(\))operator(;) + operator(}) + operator(}) + + directive(public) type(void) ident(beforeBlockingCall)operator(()operator(\)) operator({) + ident(isStopped) operator(=) keyword(true)operator(;) + operator(}) + + directive(public) type(void) ident(afterBlockingCall)operator(()operator(\)) operator({) + ident(isStopped) operator(=) keyword(false)operator(;) + operator(}) + + directive(private) type(void) ident(receivedAnException)operator(()ident(ThreadContext) ident(context)operator(\)) operator({) + comment(// clear this so we don't keep re-throwing) + ident(IRubyObject) ident(raiseException) operator(=) ident(receivedException)operator(;) + ident(receivedException) operator(=) keyword(null)operator(;) + ident(RubyModule) ident(kernelModule) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getKernel)operator(()operator(\))operator(;) + keyword(if) operator(()ident(DEBUG)operator(\)) operator({) + type(System)operator(.)ident(out)operator(.)ident(println)operator(()string<delimiter(")content(thread )delimiter(")> operator(+) type(Thread)operator(.)ident(currentThread)operator(()operator(\)) operator(+) string<delimiter(")content( before propagating exception: )delimiter(")> operator(+) ident(killed)operator(\))operator(;) + operator(}) + ident(kernelModule)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(raise)delimiter(")>operator(,) ident(raiseException)operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) + +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * Implementation of Ruby's <code>ThreadGroup</code> class. This is currently + * just a stub. + * <p> + * + * @author Charles O Nutter (headius@headius.com\) + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(ThreadGroup)delimiter(")>operator(\)) +directive(public) type(class) class(RubyThreadGroup) directive(extends) ident(RubyObject) operator({) + directive(private) type(Map)operator(<)type(Integer)operator(,) ident(IRubyObject)operator(>) ident(rubyThreadList) operator(=) keyword(new) type(HashMap)operator(<)type(Integer)operator(,) ident(IRubyObject)operator(>)operator(()operator(\))operator(;) + directive(private) type(boolean) ident(enclosed) operator(=) keyword(false)operator(;) + + comment(// ENEBO: Can these be fast?) + directive(public) directive(static) ident(RubyClass) ident(createThreadGroupClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(threadGroupClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(ThreadGroup)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setThreadGroup)operator(()ident(threadGroupClass)operator(\))operator(;) + + ident(threadGroupClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyThreadGroup)operator(.)ident(class)operator(\))operator(;) + + comment(// create the default thread group) + ident(RubyThreadGroup) ident(defaultThreadGroup) operator(=) keyword(new) ident(RubyThreadGroup)operator(()ident(runtime)operator(,) ident(threadGroupClass)operator(\))operator(;) + ident(runtime)operator(.)ident(setDefaultThreadGroup)operator(()ident(defaultThreadGroup)operator(\))operator(;) + ident(threadGroupClass)operator(.)ident(defineConstant)operator(()string<delimiter(")content(Default)delimiter(")>operator(,) ident(defaultThreadGroup)operator(\))operator(;) + + keyword(return) ident(threadGroupClass)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyThreadGroup)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,) operator(()ident(RubyClass)operator(\))ident(recv)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(add)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(synchronized) ident(IRubyObject) ident(add)operator(()ident(IRubyObject) ident(rubyThread)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(rubyThread) keyword(instanceof) ident(RubyThread)operator(\))operator(\)) keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()ident(rubyThread)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(getThread)operator(()operator(\))operator(\))operator(;) + + comment(// synchronize on the RubyThread for threadgroup updates) + keyword(if) operator(()ident(isFrozen)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't add to frozen ThreadGroup)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyThread) ident(thread) operator(=) operator(()ident(RubyThread)operator(\))ident(rubyThread)operator(;) + + comment(// we only add live threads) + keyword(if) operator(()ident(thread)operator(.)ident(alive_p)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(addDirectly)operator(()ident(thread)operator(\))operator(;) + operator(}) + + keyword(return) local_variable(this)operator(;) + operator(}) + + type(void) ident(addDirectly)operator(()ident(RubyThread) ident(rubyThread)operator(\)) operator({) + directive(synchronized) operator(()ident(rubyThread)operator(\)) operator({) + ident(IRubyObject) ident(oldGroup) operator(=) ident(rubyThread)operator(.)ident(group)operator(()operator(\))operator(;) + keyword(if) operator(()ident(oldGroup) operator(!=) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(\)) operator({) + ident(RubyThreadGroup) ident(threadGroup) operator(=) operator(()ident(RubyThreadGroup)operator(\)) ident(oldGroup)operator(;) + ident(threadGroup)operator(.)ident(rubyThreadList)operator(.)ident(remove)operator(()type(System)operator(.)ident(identityHashCode)operator(()ident(rubyThread)operator(\))operator(\))operator(;) + operator(}) + + ident(rubyThread)operator(.)ident(setThreadGroup)operator(()local_variable(this)operator(\))operator(;) + ident(rubyThreadList)operator(.)ident(put)operator(()type(System)operator(.)ident(identityHashCode)operator(()ident(rubyThread)operator(\))operator(,) ident(rubyThread)operator(\))operator(;) + operator(}) + operator(}) + + directive(public) directive(synchronized) type(void) ident(remove)operator(()ident(RubyThread) ident(rubyThread)operator(\)) operator({) + ident(rubyThread)operator(.)ident(setThreadGroup)operator(()keyword(null)operator(\))operator(;) + ident(rubyThreadList)operator(.)ident(remove)operator(()type(System)operator(.)ident(identityHashCode)operator(()ident(rubyThread)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(enclose)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(enclose)operator(()ident(Block) ident(block)operator(\)) operator({) + ident(enclosed) operator(=) keyword(true)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(enclosed?)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(enclosed_p)operator(()ident(Block) ident(block)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyBoolean)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(enclosed)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(list)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) directive(synchronized) ident(IRubyObject) ident(list)operator(()ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArrayNoCopy)operator(()operator(()ident(IRubyObject)type([])operator(\)) ident(rubyThreadList)operator(.)ident(values)operator(()operator(\))operator(.)ident(toArray)operator(()keyword(new) ident(IRubyObject)operator([)ident(rubyThreadList)operator(.)ident(size)operator(()operator(\))operator(])operator(\))operator(\))operator(;) + operator(}) + + directive(private) ident(RubyThreadGroup)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C\) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Joey Gibson <joey@joeygibson.com> + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C\) 2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2006 Ola Bini <ola.bini@ki.se> + * Copyright (C\) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.lang.ref.SoftReference)operator(;) +keyword(import) include(java.util.Date)operator(;) +keyword(import) include(java.util.HashMap)operator(;) +keyword(import) include(java.util.Locale)operator(;) +keyword(import) include(java.util.Map)operator(;) +keyword(import) include(java.util.TimeZone)operator(;) +keyword(import) include(java.util.regex.Matcher)operator(;) +keyword(import) include(java.util.regex.Pattern)operator(;) + +keyword(import) include(org.joda.time.DateTime)operator(;) +keyword(import) include(org.joda.time.DateTimeZone)operator(;) +keyword(import) include(org.joda.time.format.DateTimeFormat)operator(;) +keyword(import) include(org.joda.time.format.DateTimeFormatter)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ClassIndex)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.util.ByteList)operator(;) +keyword(import) include(org.jruby.util.RubyDateFormat)operator(;) + +comment(/** The Time class. + * + * @author chadfowler, jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Time)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Comparable)delimiter(")>operator(\)) +directive(public) type(class) class(RubyTime) directive(extends) ident(RubyObject) operator({) + directive(public) directive(static) directive(final) type(String) ident(UTC) operator(=) string<delimiter(")content(UTC)delimiter(")>operator(;) + directive(private) ident(DateTime) ident(dt)operator(;) + directive(private) type(long) ident(usec)operator(;) + + directive(private) directive(final) directive(static) ident(DateTimeFormatter) ident(ONE_DAY_CTIME_FORMATTER) operator(=) ident(DateTimeFormat)operator(.)ident(forPattern)operator(()string<delimiter(")content(EEE MMM d HH:mm:ss yyyy)delimiter(")>operator(\))operator(.)ident(withLocale)operator(()type(Locale)operator(.)ident(ENGLISH)operator(\))operator(;) + directive(private) directive(final) directive(static) ident(DateTimeFormatter) ident(TWO_DAY_CTIME_FORMATTER) operator(=) ident(DateTimeFormat)operator(.)ident(forPattern)operator(()string<delimiter(")content(EEE MMM dd HH:mm:ss yyyy)delimiter(")>operator(\))operator(.)ident(withLocale)operator(()type(Locale)operator(.)ident(ENGLISH)operator(\))operator(;) + + directive(private) directive(final) directive(static) ident(DateTimeFormatter) ident(TO_S_FORMATTER) operator(=) ident(DateTimeFormat)operator(.)ident(forPattern)operator(()string<delimiter(")content(EEE MMM dd HH:mm:ss Z yyyy)delimiter(")>operator(\))operator(.)ident(withLocale)operator(()type(Locale)operator(.)ident(ENGLISH)operator(\))operator(;) + directive(private) directive(final) directive(static) ident(DateTimeFormatter) ident(TO_S_UTC_FORMATTER) operator(=) ident(DateTimeFormat)operator(.)ident(forPattern)operator(()string<delimiter(")content(EEE MMM dd HH:mm:ss 'UTC' yyyy)delimiter(")>operator(\))operator(.)ident(withLocale)operator(()type(Locale)operator(.)ident(ENGLISH)operator(\))operator(;) + + comment(// There are two different popular TZ formats: legacy (AST+3:00:00, GMT-3\), and) + comment(// newer one (US/Pacific, America/Los_Angeles\). This pattern is to detect) + comment(// the legacy TZ format in order to convert it to the newer format) + comment(// understood by Java API.) + directive(private) directive(static) directive(final) type(Pattern) ident(TZ_PATTERN) + operator(=) type(Pattern)operator(.)ident(compile)operator(()string<delimiter(")content(()char(\\\\)content(D+?\)([)char(\\\\)content(+-]?\)()char(\\\\)content(d+\)(:)char(\\\\)content(d+\)?(:)char(\\\\)content(d+\)?)delimiter(")>operator(\))operator(;) + + directive(private) directive(static) directive(final) ident(ByteList) ident(TZ_STRING) operator(=) ident(ByteList)operator(.)ident(create)operator(()string<delimiter(")content(TZ)delimiter(")>operator(\))operator(;) + + directive(public) directive(static) ident(DateTimeZone) ident(getLocalTimeZone)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyString) ident(tzVar) operator(=) ident(runtime)operator(.)ident(newString)operator(()ident(TZ_STRING)operator(\))operator(;) + ident(RubyHash) ident(h) operator(=) operator(()operator(()ident(RubyHash)operator(\))ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ENV)delimiter(")>operator(\))operator(\))operator(;) + ident(IRubyObject) ident(tz) operator(=) ident(h)operator(.)ident(op_aref)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(tzVar)operator(\))operator(;) + keyword(if) operator(()ident(tz) operator(==) keyword(null) operator(||) operator(!) operator(()ident(tz) keyword(instanceof) ident(RubyString)operator(\))operator(\)) operator({) + keyword(return) ident(DateTimeZone)operator(.)ident(getDefault)operator(()operator(\))operator(;) + operator(}) keyword(else) operator({) + type(String) ident(zone) operator(=) ident(tz)operator(.)ident(toString)operator(()operator(\))operator(;) + ident(DateTimeZone) ident(cachedZone) operator(=) ident(runtime)operator(.)ident(getLocalTimezoneCache)operator(()operator(\))operator(.)ident(get)operator(()ident(zone)operator(\))operator(;) + + keyword(if) operator(()ident(cachedZone) operator(!=) keyword(null)operator(\)) keyword(return) ident(cachedZone)operator(;) + + type(String) ident(originalZone) operator(=) ident(zone)operator(;) + + comment(// Value of "TZ" property is of a bit different format,) + comment(// which confuses the Java's TimeZone.getTimeZone(id\) method,) + comment(// and so, we need to convert it.) + + type(Matcher) ident(tzMatcher) operator(=) ident(TZ_PATTERN)operator(.)ident(matcher)operator(()ident(zone)operator(\))operator(;) + keyword(if) operator(()ident(tzMatcher)operator(.)ident(matches)operator(()operator(\))operator(\)) operator({) + type(String) ident(sign) operator(=) ident(tzMatcher)operator(.)ident(group)operator(()integer(2)operator(\))operator(;) + type(String) ident(hours) operator(=) ident(tzMatcher)operator(.)ident(group)operator(()integer(3)operator(\))operator(;) + type(String) ident(minutes) operator(=) ident(tzMatcher)operator(.)ident(group)operator(()integer(4)operator(\))operator(;) + + comment(// GMT+00:00 --> Etc/GMT, see "MRI behavior") + comment(// comment below.) + keyword(if) operator(()operator(()string<delimiter(")content(00)delimiter(")>operator(.)ident(equals)operator(()ident(hours)operator(\)) operator(||) string<delimiter(")content(0)delimiter(")>operator(.)ident(equals)operator(()ident(hours)operator(\))operator(\)) + operator(&&) operator(()ident(minutes) operator(==) keyword(null) operator(||) string<delimiter(")content(:00)delimiter(")>operator(.)ident(equals)operator(()ident(minutes)operator(\)) operator(||) string<delimiter(")content(:0)delimiter(")>operator(.)ident(equals)operator(()ident(minutes)operator(\))operator(\))operator(\)) operator({) + ident(zone) operator(=) string<delimiter(")content(Etc/GMT)delimiter(")>operator(;) + operator(}) keyword(else) operator({) + comment(// Invert the sign, since TZ format and Java format) + comment(// use opposite signs, sigh... Also, Java API requires) + comment(// the sign to be always present, be it "+" or "-".) + ident(sign) operator(=) operator(()string<delimiter(")content(-)delimiter(")>operator(.)ident(equals)operator(()ident(sign)operator(\))operator(?) string<delimiter(")content(+)delimiter(")> operator(:) string<delimiter(")content(-)delimiter(")>operator(\))operator(;) + + comment(// Always use "GMT" since that's required by Java API.) + ident(zone) operator(=) string<delimiter(")content(GMT)delimiter(")> operator(+) ident(sign) operator(+) ident(hours)operator(;) + + keyword(if) operator(()ident(minutes) operator(!=) keyword(null)operator(\)) operator({) + ident(zone) operator(+=) ident(minutes)operator(;) + operator(}) + operator(}) + operator(}) + + comment(// MRI behavior: With TZ equal to "GMT" or "UTC", Time.now) + comment(// is *NOT* considered as a proper GMT/UTC time:) + comment(// ENV['TZ']="GMT") + comment(// Time.now.gmt? ==> false) + comment(// ENV['TZ']="UTC") + comment(// Time.now.utc? ==> false) + comment(// Hence, we need to adjust for that.) + keyword(if) operator(()string<delimiter(")content(GMT)delimiter(")>operator(.)ident(equalsIgnoreCase)operator(()ident(zone)operator(\)) operator(||) string<delimiter(")content(UTC)delimiter(")>operator(.)ident(equalsIgnoreCase)operator(()ident(zone)operator(\))operator(\)) operator({) + ident(zone) operator(=) string<delimiter(")content(Etc/)delimiter(")> operator(+) ident(zone)operator(;) + operator(}) + + ident(DateTimeZone) ident(dtz) operator(=) ident(DateTimeZone)operator(.)ident(forTimeZone)operator(()type(TimeZone)operator(.)ident(getTimeZone)operator(()ident(zone)operator(\))operator(\))operator(;) + ident(runtime)operator(.)ident(getLocalTimezoneCache)operator(()operator(\))operator(.)ident(put)operator(()ident(originalZone)operator(,) ident(dtz)operator(\))operator(;) + keyword(return) ident(dtz)operator(;) + operator(}) + operator(}) + + directive(public) ident(RubyTime)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyTime)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(rubyClass)operator(,) ident(DateTime) ident(dt)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(rubyClass)operator(\))operator(;) + local_variable(this)operator(.)ident(dt) operator(=) ident(dt)operator(;) + operator(}) + + comment(// We assume that these two time instances) + comment(// occurred at the same time.) + directive(private) directive(static) directive(final) type(long) ident(BASE_TIME_MILLIS) operator(=) type(System)operator(.)ident(currentTimeMillis)operator(()operator(\))operator(;) + directive(private) directive(static) directive(final) type(long) ident(BASE_TIME_NANOS) operator(=) type(System)operator(.)ident(nanoTime)operator(()operator(\))operator(;) + + directive(private) directive(static) ident(ObjectAllocator) ident(TIME_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + type(long) ident(usecsPassed) operator(=) operator(()type(System)operator(.)ident(nanoTime)operator(()operator(\)) operator(-) ident(BASE_TIME_NANOS)operator(\)) operator(/) integer(1000L)operator(;) + type(long) ident(millisTime) operator(=) ident(BASE_TIME_MILLIS) operator(+) ident(usecsPassed) operator(/) integer(1000L)operator(;) + type(long) ident(usecs) operator(=) ident(usecsPassed) operator(%) integer(1000L)operator(;) + + ident(DateTimeZone) ident(dtz) operator(=) ident(getLocalTimeZone)operator(()ident(runtime)operator(\))operator(;) + ident(DateTime) ident(dt) operator(=) keyword(new) ident(DateTime)operator(()ident(millisTime)operator(,) ident(dtz)operator(\))operator(;) + ident(RubyTime) ident(rt) operator(=) keyword(new) ident(RubyTime)operator(()ident(runtime)operator(,) ident(klass)operator(,) ident(dt)operator(\))operator(;) + ident(rt)operator(.)ident(setUSec)operator(()ident(usecs)operator(\))operator(;) + + keyword(return) ident(rt)operator(;) + operator(}) + operator(})operator(;) + + directive(public) directive(static) ident(RubyClass) ident(createTimeClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyClass) ident(timeClass) operator(=) ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(Time)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(TIME_ALLOCATOR)operator(\))operator(;) + ident(timeClass)operator(.)ident(index) operator(=) ident(ClassIndex)operator(.)ident(TIME)operator(;) + ident(runtime)operator(.)ident(setTime)operator(()ident(timeClass)operator(\))operator(;) + + ident(timeClass)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getComparable)operator(()operator(\))operator(\))operator(;) + + ident(timeClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyTime)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(timeClass)operator(;) + operator(}) + + directive(public) type(void) ident(setUSec)operator(()type(long) ident(usec)operator(\)) operator({) + local_variable(this)operator(.)ident(usec) operator(=) ident(usec)operator(;) + operator(}) + + directive(public) type(long) ident(getUSec)operator(()operator(\)) operator({) + keyword(return) ident(usec)operator(;) + operator(}) + + directive(public) type(void) ident(updateCal)operator(()ident(DateTime) ident(dt)operator(\)) operator({) + local_variable(this)operator(.)ident(dt) operator(=) ident(dt)operator(;) + operator(}) + + directive(protected) type(long) ident(getTimeInMillis)operator(()operator(\)) operator({) + keyword(return) ident(dt)operator(.)ident(getMillis)operator(()operator(\))operator(;) comment(// For JDK 1.4 we can use "cal.getTimeInMillis(\)") + operator(}) + + directive(public) directive(static) ident(RubyTime) ident(newTime)operator(()ident(Ruby) ident(runtime)operator(,) type(long) ident(milliseconds)operator(\)) operator({) + keyword(return) ident(newTime)operator(()ident(runtime)operator(,) keyword(new) ident(DateTime)operator(()ident(milliseconds)operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyTime) ident(newTime)operator(()ident(Ruby) ident(runtime)operator(,) ident(DateTime) ident(dt)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyTime)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getTime)operator(()operator(\))operator(,) ident(dt)operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyTime) ident(newTime)operator(()ident(Ruby) ident(runtime)operator(,) ident(DateTime) ident(dt)operator(,) type(long) ident(usec)operator(\)) operator({) + ident(RubyTime) ident(t) operator(=) keyword(new) ident(RubyTime)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getTime)operator(()operator(\))operator(,) ident(dt)operator(\))operator(;) + ident(t)operator(.)ident(setUSec)operator(()ident(usec)operator(\))operator(;) + keyword(return) ident(t)operator(;) + operator(}) + + annotation(@Override) + directive(public) type(Class)operator(<)operator(?)operator(>) ident(getJavaClass)operator(()operator(\)) operator({) + keyword(return) type(Date)operator(.)ident(class)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize_copy)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(initialize_copy)operator(()ident(IRubyObject) ident(original)operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(original) keyword(instanceof) ident(RubyTime)operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(Expecting an instance of class Time)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyTime) ident(originalTime) operator(=) operator(()ident(RubyTime)operator(\)) ident(original)operator(;) + + comment(// We can just use dt, since it is immutable) + ident(dt) operator(=) ident(originalTime)operator(.)ident(dt)operator(;) + ident(usec) operator(=) ident(originalTime)operator(.)ident(usec)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(succ)delimiter(")>operator(\)) + directive(public) ident(RubyTime) ident(succ)operator(()operator(\)) operator({) + keyword(return) ident(newTime)operator(()ident(getRuntime)operator(()operator(\))operator(,)ident(dt)operator(.)ident(plusSeconds)operator(()integer(1)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(gmtime)delimiter(")>operator(,) string<delimiter(")content(utc)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyTime) ident(gmtime)operator(()operator(\)) operator({) + ident(dt) operator(=) ident(dt)operator(.)ident(withZone)operator(()ident(DateTimeZone)operator(.)ident(UTC)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(localtime)delimiter(")>operator(\)) + directive(public) ident(RubyTime) ident(localtime)operator(()operator(\)) operator({) + ident(dt) operator(=) ident(dt)operator(.)ident(withZone)operator(()ident(getLocalTimeZone)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(gmt?)delimiter(")>operator(,) string<delimiter(")content(utc?)delimiter(")>operator(,) string<delimiter(")content(gmtime?)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyBoolean) ident(gmt)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(dt)operator(.)ident(getZone)operator(()operator(\))operator(.)ident(getID)operator(()operator(\))operator(.)ident(equals)operator(()string<delimiter(")content(UTC)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(getgm)delimiter(")>operator(,) string<delimiter(")content(getutc)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyTime) ident(getgm)operator(()operator(\)) operator({) + keyword(return) ident(newTime)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(dt)operator(.)ident(withZone)operator(()ident(DateTimeZone)operator(.)ident(UTC)operator(\))operator(,) ident(getUSec)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getlocal)delimiter(")>operator(\)) + directive(public) ident(RubyTime) ident(getlocal)operator(()operator(\)) operator({) + keyword(return) ident(newTime)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(dt)operator(.)ident(withZone)operator(()ident(getLocalTimeZone)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(,) ident(getUSec)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(strftime)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(RubyString) ident(strftime)operator(()ident(IRubyObject) ident(format)operator(\)) operator({) + directive(final) ident(RubyDateFormat) ident(rubyDateFormat) operator(=) keyword(new) ident(RubyDateFormat)operator(()string<delimiter(")content(-)delimiter(")>operator(,) type(Locale)operator(.)ident(US)operator(\))operator(;) + ident(rubyDateFormat)operator(.)ident(applyPattern)operator(()ident(format)operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(rubyDateFormat)operator(.)ident(setDateTime)operator(()ident(dt)operator(\))operator(;) + type(String) ident(result) operator(=) ident(rubyDateFormat)operator(.)ident(format)operator(()keyword(null)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_ge)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(cmp)operator(()operator(()ident(RubyTime)operator(\)) ident(other)operator(\)) operator(>=) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyComparable)operator(.)ident(op_ge)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_gt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(cmp)operator(()operator(()ident(RubyTime)operator(\)) ident(other)operator(\)) operator(>) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyComparable)operator(.)ident(op_gt)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_le)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(cmp)operator(()operator(()ident(RubyTime)operator(\)) ident(other)operator(\)) operator(<=) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyComparable)operator(.)ident(op_le)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_lt)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()ident(cmp)operator(()operator(()ident(RubyTime)operator(\)) ident(other)operator(\)) operator(<) integer(0)operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyComparable)operator(.)ident(op_lt)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(other)operator(\))operator(;) + operator(}) + + directive(private) type(int) ident(cmp)operator(()ident(RubyTime) ident(other)operator(\)) operator({) + type(long) ident(millis) operator(=) ident(getTimeInMillis)operator(()operator(\))operator(;) + type(long) ident(millis_other) operator(=) ident(other)operator(.)ident(getTimeInMillis)operator(()operator(\))operator(;) + type(long) ident(usec_other) operator(=) ident(other)operator(.)ident(usec)operator(;) + + keyword(if) operator(()ident(millis) operator(>) ident(millis_other) operator(||) operator(()ident(millis) operator(==) ident(millis_other) operator(&&) ident(usec) operator(>) ident(usec_other)operator(\))operator(\)) operator({) + keyword(return) integer(1)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(millis) operator(<) ident(millis_other) operator(||) operator(()ident(millis) operator(==) ident(millis_other) operator(&&) ident(usec) operator(<) ident(usec_other)operator(\))operator(\)) operator({) + keyword(return) operator(-)integer(1)operator(;) + operator(}) + + keyword(return) integer(0)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(+)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_plus)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + type(long) ident(time) operator(=) ident(getTimeInMillis)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(time + time ?)delimiter(")>operator(\))operator(;) + operator(}) + type(long) ident(adjustment) operator(=) operator(()type(long)operator(\)) operator(()ident(RubyNumeric)operator(.)ident(num2dbl)operator(()ident(other)operator(\)) operator(*) integer(1000000)operator(\))operator(;) + type(int) ident(micro) operator(=) operator(()type(int)operator(\)) operator(()ident(adjustment) operator(%) integer(1000)operator(\))operator(;) + ident(adjustment) operator(=) ident(adjustment) operator(/) integer(1000)operator(;) + + ident(time) operator(+=) ident(adjustment)operator(;) + + ident(RubyTime) ident(newTime) operator(=) keyword(new) ident(RubyTime)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + ident(newTime)operator(.)ident(dt) operator(=) keyword(new) ident(DateTime)operator(()ident(time)operator(\))operator(.)ident(withZone)operator(()ident(dt)operator(.)ident(getZone)operator(()operator(\))operator(\))operator(;) + ident(newTime)operator(.)ident(setUSec)operator(()ident(micro)operator(\))operator(;) + + keyword(return) ident(newTime)operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(opMinus)operator(()ident(RubyTime) ident(other)operator(\)) operator({) + type(long) ident(time) operator(=) ident(getTimeInMillis)operator(()operator(\)) operator(*) integer(1000) operator(+) ident(getUSec)operator(()operator(\))operator(;) + + ident(time) operator(-=) ident(other)operator(.)ident(getTimeInMillis)operator(()operator(\)) operator(*) integer(1000) operator(+) ident(other)operator(.)ident(getUSec)operator(()operator(\))operator(;) + + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(time) operator(/) float(1000000.0)operator(\))operator(;) comment(// float number of seconds) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(-)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_minus)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyTime)operator(\)) keyword(return) ident(opMinus)operator(()operator(()ident(RubyTime)operator(\)) ident(other)operator(\))operator(;) + + type(long) ident(time) operator(=) ident(getTimeInMillis)operator(()operator(\))operator(;) + type(long) ident(adjustment) operator(=) operator(()type(long)operator(\)) operator(()ident(RubyNumeric)operator(.)ident(num2dbl)operator(()ident(other)operator(\)) operator(*) integer(1000000)operator(\))operator(;) + type(int) ident(micro) operator(=) operator(()type(int)operator(\)) operator(()ident(adjustment) operator(%) integer(1000)operator(\))operator(;) + ident(adjustment) operator(=) ident(adjustment) operator(/) integer(1000)operator(;) + + ident(time) operator(-=) ident(adjustment)operator(;) + + ident(RubyTime) ident(newTime) operator(=) keyword(new) ident(RubyTime)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(getMetaClass)operator(()operator(\))operator(\))operator(;) + ident(newTime)operator(.)ident(dt) operator(=) keyword(new) ident(DateTime)operator(()ident(time)operator(\))operator(.)ident(withZone)operator(()ident(dt)operator(.)ident(getZone)operator(()operator(\))operator(\))operator(;) + ident(newTime)operator(.)ident(setUSec)operator(()ident(micro)operator(\))operator(;) + + keyword(return) ident(newTime)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(===)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(op_eqq)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(return) operator(()ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_SPACESHIP)operator(,) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(other)operator(\))operator(\)) operator(==) integer(0)operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<=>)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(op_cmp)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(cmp)operator(()operator(()ident(RubyTime)operator(\)) ident(other)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eql?)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(eql_p)operator(()ident(IRubyObject) ident(other)operator(\)) operator({) + keyword(if) operator(()ident(other) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + ident(RubyTime) ident(otherTime) operator(=) operator(()ident(RubyTime)operator(\))ident(other)operator(;) + keyword(return) operator(()ident(usec) operator(==) ident(otherTime)operator(.)ident(usec) operator(&&) ident(getTimeInMillis)operator(()operator(\)) operator(==) ident(otherTime)operator(.)ident(getTimeInMillis)operator(()operator(\))operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(asctime)delimiter(")>operator(,) string<delimiter(")content(ctime)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyString) ident(asctime)operator(()operator(\)) operator({) + ident(DateTimeFormatter) ident(simpleDateFormat)operator(;) + + keyword(if) operator(()ident(dt)operator(.)ident(getDayOfMonth)operator(()operator(\)) operator(<) integer(10)operator(\)) operator({) + ident(simpleDateFormat) operator(=) ident(ONE_DAY_CTIME_FORMATTER)operator(;) + operator(}) keyword(else) operator({) + ident(simpleDateFormat) operator(=) ident(TWO_DAY_CTIME_FORMATTER)operator(;) + operator(}) + type(String) ident(result) operator(=) ident(simpleDateFormat)operator(.)ident(print)operator(()ident(dt)operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_s)delimiter(")>operator(,) string<delimiter(")content(inspect)delimiter(")>operator(})operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_s)operator(()operator(\)) operator({) + ident(DateTimeFormatter) ident(simpleDateFormat)operator(;) + keyword(if) operator(()ident(dt)operator(.)ident(getZone)operator(()operator(\)) operator(==) ident(DateTimeZone)operator(.)ident(UTC)operator(\)) operator({) + ident(simpleDateFormat) operator(=) ident(TO_S_UTC_FORMATTER)operator(;) + operator(}) keyword(else) operator({) + ident(simpleDateFormat) operator(=) ident(TO_S_FORMATTER)operator(;) + operator(}) + + type(String) ident(result) operator(=) ident(simpleDateFormat)operator(.)ident(print)operator(()ident(dt)operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_a)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyArray) ident(to_a)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArrayNoCopy)operator(()keyword(new) ident(IRubyObject)type([]) operator({) ident(sec)operator(()operator(\))operator(,) ident(min)operator(()operator(\))operator(,) ident(hour)operator(()operator(\))operator(,) ident(mday)operator(()operator(\))operator(,) ident(month)operator(()operator(\))operator(,) + ident(year)operator(()operator(\))operator(,) ident(wday)operator(()operator(\))operator(,) ident(yday)operator(()operator(\))operator(,) ident(isdst)operator(()operator(\))operator(,) ident(zone)operator(()operator(\)) operator(})operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_f)delimiter(")>operator(\)) + directive(public) ident(RubyFloat) ident(to_f)operator(()operator(\)) operator({) + type(long) ident(time) operator(=) ident(getTimeInMillis)operator(()operator(\))operator(;) + ident(time) operator(=) ident(time) operator(*) integer(1000) operator(+) ident(usec)operator(;) + keyword(return) ident(RubyFloat)operator(.)ident(newFloat)operator(()ident(getRuntime)operator(()operator(\))operator(,) ident(time) operator(/) float(1000000.0)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(to_i)delimiter(")>operator(,) string<delimiter(")content(tv_sec)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyInteger) ident(to_i)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(getTimeInMillis)operator(()operator(\)) operator(/) integer(1000)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(usec)delimiter(")>operator(,) string<delimiter(")content(tv_usec)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyInteger) ident(usec)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(dt)operator(.)ident(getMillisOfSecond)operator(()operator(\)) operator(*) integer(1000) operator(+) ident(getUSec)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(setMicroseconds)operator(()type(long) ident(mic)operator(\)) operator({) + type(long) ident(millis) operator(=) ident(getTimeInMillis)operator(()operator(\)) operator(%) integer(1000)operator(;) + type(long) ident(withoutMillis) operator(=) ident(getTimeInMillis)operator(()operator(\)) operator(-) ident(millis)operator(;) + ident(withoutMillis) operator(+=) operator(()ident(mic) operator(/) integer(1000)operator(\))operator(;) + ident(dt) operator(=) ident(dt)operator(.)ident(withMillis)operator(()ident(withoutMillis)operator(\))operator(;) + ident(usec) operator(=) ident(mic) operator(%) integer(1000)operator(;) + operator(}) + + directive(public) type(long) ident(microseconds)operator(()operator(\)) operator({) + keyword(return) ident(getTimeInMillis)operator(()operator(\)) operator(%) integer(1000) operator(*) integer(1000) operator(+) ident(usec)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sec)delimiter(")>operator(\)) + directive(public) ident(RubyInteger) ident(sec)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(dt)operator(.)ident(getSecondOfMinute)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(min)delimiter(")>operator(\)) + directive(public) ident(RubyInteger) ident(min)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(dt)operator(.)ident(getMinuteOfHour)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hour)delimiter(")>operator(\)) + directive(public) ident(RubyInteger) ident(hour)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(dt)operator(.)ident(getHourOfDay)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(mday)delimiter(")>operator(,) string<delimiter(")content(day)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyInteger) ident(mday)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(dt)operator(.)ident(getDayOfMonth)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(month)delimiter(")>operator(,) string<delimiter(")content(mon)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyInteger) ident(month)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(dt)operator(.)ident(getMonthOfYear)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(year)delimiter(")>operator(\)) + directive(public) ident(RubyInteger) ident(year)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(dt)operator(.)ident(getYear)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(wday)delimiter(")>operator(\)) + directive(public) ident(RubyInteger) ident(wday)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()operator(()ident(dt)operator(.)ident(getDayOfWeek)operator(()operator(\))operator(%)integer(7)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(yday)delimiter(")>operator(\)) + directive(public) ident(RubyInteger) ident(yday)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(dt)operator(.)ident(getDayOfYear)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(gmt_offset)delimiter(")>operator(,) string<delimiter(")content(gmtoff)delimiter(")>operator(,) string<delimiter(")content(utc_offset)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyInteger) ident(gmt_offset)operator(()operator(\)) operator({) + type(int) ident(offset) operator(=) ident(dt)operator(.)ident(getZone)operator(()operator(\))operator(.)ident(getOffsetFromLocal)operator(()ident(dt)operator(.)ident(getMillis)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()operator(()type(int)operator(\))operator(()ident(offset)operator(/)integer(1000)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(isdst)delimiter(")>operator(,) string<delimiter(")content(dst?)delimiter(")>operator(})operator(\)) + directive(public) ident(RubyBoolean) ident(isdst)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newBoolean)operator(()operator(!)ident(dt)operator(.)ident(getZone)operator(()operator(\))operator(.)ident(isStandardOffset)operator(()ident(dt)operator(.)ident(getMillis)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zone)delimiter(")>operator(\)) + directive(public) ident(RubyString) ident(zone)operator(()operator(\)) operator({) + type(String) ident(zone) operator(=) ident(dt)operator(.)ident(getZone)operator(()operator(\))operator(.)ident(getShortName)operator(()ident(dt)operator(.)ident(getMillis)operator(()operator(\))operator(\))operator(;) + keyword(if)operator(()ident(zone)operator(.)ident(equals)operator(()string<delimiter(")content(+00:00)delimiter(")>operator(\))operator(\)) operator({) + ident(zone) operator(=) string<delimiter(")content(GMT)delimiter(")>operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(zone)operator(\))operator(;) + operator(}) + + directive(public) type(void) ident(setDateTime)operator(()ident(DateTime) ident(dt)operator(\)) operator({) + local_variable(this)operator(.)ident(dt) operator(=) ident(dt)operator(;) + operator(}) + + directive(public) ident(DateTime) ident(getDateTime)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(.)ident(dt)operator(;) + operator(}) + + directive(public) type(Date) ident(getJavaDate)operator(()operator(\)) operator({) + keyword(return) local_variable(this)operator(.)ident(dt)operator(.)ident(toDate)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(hash)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyFixnum) ident(hash)operator(()operator(\)) operator({) + comment(// modified to match how hash is calculated in 1.8.2) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()operator(()type(int)operator(\))operator(()operator(()operator(()ident(dt)operator(.)ident(getMillis)operator(()operator(\)) operator(/) integer(1000)operator(\)) operator(^) ident(microseconds)operator(()operator(\))operator(\)) operator(<)operator(<) integer(1)operator(\)) operator(>)operator(>) integer(1)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(_dump)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyString) ident(dump)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(RubyString) ident(str) operator(=) operator(()ident(RubyString)operator(\)) ident(mdump)operator(()keyword(new) ident(IRubyObject)type([]) operator({) local_variable(this) operator(})operator(\))operator(;) + ident(str)operator(.)ident(syncVariables)operator(()local_variable(this)operator(.)ident(getVariableList)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(str)operator(;) + operator(}) + + directive(public) ident(RubyObject) ident(mdump)operator(()directive(final) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(RubyTime) ident(obj) operator(=) operator(()ident(RubyTime)operator(\))ident(args)operator([)integer(0)operator(])operator(;) + ident(DateTime) ident(dateTime) operator(=) ident(obj)operator(.)ident(dt)operator(.)ident(withZone)operator(()ident(DateTimeZone)operator(.)ident(UTC)operator(\))operator(;) + type(byte) ident(dumpValue)type([]) operator(=) keyword(new) type(byte)operator([)integer(8)operator(])operator(;) + type(int) ident(pe) operator(=) + hex(0x1) operator(<)operator(<) integer(31) operator(|) + operator(()ident(dateTime)operator(.)ident(getYear)operator(()operator(\))operator(-)integer(1900)operator(\)) operator(<)operator(<) integer(14) operator(|) + operator(()ident(dateTime)operator(.)ident(getMonthOfYear)operator(()operator(\))operator(-)integer(1)operator(\)) operator(<)operator(<) integer(10) operator(|) + ident(dateTime)operator(.)ident(getDayOfMonth)operator(()operator(\)) operator(<)operator(<) integer(5) operator(|) + ident(dateTime)operator(.)ident(getHourOfDay)operator(()operator(\))operator(;) + type(int) ident(se) operator(=) + ident(dateTime)operator(.)ident(getMinuteOfHour)operator(()operator(\)) operator(<)operator(<) integer(26) operator(|) + ident(dateTime)operator(.)ident(getSecondOfMinute)operator(()operator(\)) operator(<)operator(<) integer(20) operator(|) + operator(()ident(dateTime)operator(.)ident(getMillisOfSecond)operator(()operator(\)) operator(*) integer(1000) operator(+) operator(()type(int)operator(\))ident(usec)operator(\))operator(;) comment(// dump usec, not msec) + + keyword(for)operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) integer(4)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(dumpValue)operator([)ident(i)operator(]) operator(=) operator(()type(byte)operator(\))operator(()ident(pe) operator(&) hex(0xFF)operator(\))operator(;) + ident(pe) operator(>)operator(>)operator(>=) integer(8)operator(;) + operator(}) + keyword(for)operator(()type(int) ident(i) operator(=) integer(4)operator(;) ident(i) operator(<) integer(8) operator(;)ident(i)operator(++)operator(\)) operator({) + ident(dumpValue)operator([)ident(i)operator(]) operator(=) operator(()type(byte)operator(\))operator(()ident(se) operator(&) hex(0xFF)operator(\))operator(;) + ident(se) operator(>)operator(>)operator(>=) integer(8)operator(;) + operator(}) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(obj)operator(.)ident(getRuntime)operator(()operator(\))operator(,) keyword(new) ident(ByteList)operator(()ident(dumpValue)operator(,)keyword(false)operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(Block) ident(block)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + comment(/* Time class methods */) + + directive(public) directive(static) ident(IRubyObject) ident(s_new)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyTime) ident(time) operator(=) keyword(new) ident(RubyTime)operator(()ident(runtime)operator(,) operator(()ident(RubyClass)operator(\)) ident(recv)operator(,) keyword(new) ident(DateTime)operator(()ident(getLocalTimeZone)operator(()ident(runtime)operator(\))operator(\))operator(\))operator(;) + ident(time)operator(.)ident(callInit)operator(()ident(args)operator(,)ident(block)operator(\))operator(;) + keyword(return) ident(time)operator(;) + operator(}) + + comment(/** + * @deprecated Use {@link #newInstance(ThreadContext, IRubyObject\)} + */) + annotation(@Deprecated) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(newInstance)operator(()ident(context)operator(,) ident(recv)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(now)delimiter(")>operator(,) ident(backtrace) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(newInstance)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(\)) operator({) + ident(IRubyObject) ident(obj) operator(=) operator(()operator(()ident(RubyClass)operator(\)) ident(recv)operator(\))operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(obj)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getBaseCallSites)operator(()operator(\))operator([)ident(RubyClass)operator(.)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(obj)operator(\))operator(;) + keyword(return) ident(obj)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(at)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(at)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + directive(final) ident(RubyTime) ident(time)operator(;) + + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyTime)operator(\)) operator({) + ident(RubyTime) ident(other) operator(=) operator(()ident(RubyTime)operator(\)) ident(arg)operator(;) + ident(time) operator(=) keyword(new) ident(RubyTime)operator(()ident(runtime)operator(,) operator(()ident(RubyClass)operator(\)) ident(recv)operator(,) ident(other)operator(.)ident(dt)operator(\))operator(;) + ident(time)operator(.)ident(setUSec)operator(()ident(other)operator(.)ident(getUSec)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(time) operator(=) keyword(new) ident(RubyTime)operator(()ident(runtime)operator(,) operator(()ident(RubyClass)operator(\)) ident(recv)operator(,) + keyword(new) ident(DateTime)operator(()integer(0L)operator(,) ident(getLocalTimeZone)operator(()ident(runtime)operator(\))operator(\))operator(\))operator(;) + + type(long) ident(seconds) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg)operator(\))operator(;) + type(long) ident(millisecs) operator(=) integer(0)operator(;) + type(long) ident(microsecs) operator(=) integer(0)operator(;) + + comment(// In the case of two arguments, MRI will discard the portion of) + comment(// the first argument after a decimal point (i.e., "floor"\).) + comment(// However in the case of a single argument, any portion after) + comment(// the decimal point is honored.) + keyword(if) operator(()ident(arg) keyword(instanceof) ident(RubyFloat)operator(\)) operator({) + type(double) ident(dbl) operator(=) operator(()operator(()ident(RubyFloat)operator(\)) ident(arg)operator(\))operator(.)ident(getDoubleValue)operator(()operator(\))operator(;) + type(long) ident(micro) operator(=) operator(()type(long)operator(\)) operator(()operator(()ident(dbl) operator(-) ident(seconds)operator(\)) operator(*) integer(1000000)operator(\))operator(;) + ident(millisecs) operator(=) ident(micro) operator(/) integer(1000)operator(;) + ident(microsecs) operator(=) ident(micro) operator(%) integer(1000)operator(;) + operator(}) + ident(time)operator(.)ident(setUSec)operator(()ident(microsecs)operator(\))operator(;) + ident(time)operator(.)ident(dt) operator(=) ident(time)operator(.)ident(dt)operator(.)ident(withMillis)operator(()ident(seconds) operator(*) integer(1000) operator(+) ident(millisecs)operator(\))operator(;) + operator(}) + + ident(time)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getBaseCallSites)operator(()operator(\))operator([)ident(RubyClass)operator(.)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(time)operator(\))operator(;) + + keyword(return) ident(time)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(at)delimiter(")>operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(at)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(arg1)operator(,) ident(IRubyObject) ident(arg2)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(RubyTime) ident(time) operator(=) keyword(new) ident(RubyTime)operator(()ident(runtime)operator(,) operator(()ident(RubyClass)operator(\)) ident(recv)operator(,) + keyword(new) ident(DateTime)operator(()integer(0L)operator(,) ident(getLocalTimeZone)operator(()ident(runtime)operator(\))operator(\))operator(\))operator(;) + + type(long) ident(seconds) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg1)operator(\))operator(;) + type(long) ident(millisecs) operator(=) integer(0)operator(;) + type(long) ident(microsecs) operator(=) integer(0)operator(;) + + type(long) ident(tmp) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(arg2)operator(\))operator(;) + ident(millisecs) operator(=) ident(tmp) operator(/) integer(1000)operator(;) + ident(microsecs) operator(=) ident(tmp) operator(%) integer(1000)operator(;) + + ident(time)operator(.)ident(setUSec)operator(()ident(microsecs)operator(\))operator(;) + ident(time)operator(.)ident(dt) operator(=) ident(time)operator(.)ident(dt)operator(.)ident(withMillis)operator(()ident(seconds) operator(*) integer(1000) operator(+) ident(millisecs)operator(\))operator(;) + + ident(time)operator(.)ident(getMetaClass)operator(()operator(\))operator(.)ident(getBaseCallSites)operator(()operator(\))operator([)ident(RubyClass)operator(.)ident(CS_IDX_INITIALIZE)operator(])operator(.)ident(call)operator(()ident(context)operator(,) ident(time)operator(\))operator(;) + + keyword(return) ident(time)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(local)delimiter(")>operator(,) string<delimiter(")content(mktime)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(9)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyTime) ident(new_local)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(createTime)operator(()ident(recv)operator(,) ident(args)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(utc)delimiter(")>operator(,) string<delimiter(")content(gm)delimiter(")>operator(})operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(9)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyTime) ident(new_utc)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(createTime)operator(()ident(recv)operator(,) ident(args)operator(,) keyword(true)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(_load)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyTime) ident(load)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(from)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(s_mload)operator(()ident(recv)operator(,) operator(()ident(RubyTime)operator(\))operator(()operator(()operator(()ident(RubyClass)operator(\))ident(recv)operator(\))operator(.)ident(allocate)operator(()operator(\))operator(\))operator(,) ident(from)operator(\))operator(;) + operator(}) + + directive(protected) directive(static) ident(RubyTime) ident(s_mload)operator(()ident(IRubyObject) ident(recv)operator(,) ident(RubyTime) ident(time)operator(,) ident(IRubyObject) ident(from)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + + ident(DateTime) ident(dt) operator(=) keyword(new) ident(DateTime)operator(()ident(DateTimeZone)operator(.)ident(UTC)operator(\))operator(;) + + type(byte)type([]) ident(fromAsBytes) operator(=) keyword(null)operator(;) + ident(fromAsBytes) operator(=) ident(from)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getBytes)operator(()operator(\))operator(;) + keyword(if)operator(()ident(fromAsBytes)operator(.)ident(length) operator(!=) integer(8)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newTypeError)operator(()string<delimiter(")content(marshaled time format differ)delimiter(")>operator(\))operator(;) + operator(}) + type(int) ident(p)operator(=)integer(0)operator(;) + type(int) ident(s)operator(=)integer(0)operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) integer(4)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(p) operator(|=) operator(()operator(()type(int)operator(\))ident(fromAsBytes)operator([)ident(i)operator(]) operator(&) hex(0xFF)operator(\)) operator(<)operator(<) operator(()integer(8) operator(*) ident(i)operator(\))operator(;) + operator(}) + keyword(for) operator(()type(int) ident(i) operator(=) integer(4)operator(;) ident(i) operator(<) integer(8)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(s) operator(|=) operator(()operator(()type(int)operator(\))ident(fromAsBytes)operator([)ident(i)operator(]) operator(&) hex(0xFF)operator(\)) operator(<)operator(<) operator(()integer(8) operator(*) operator(()ident(i) operator(-) integer(4)operator(\))operator(\))operator(;) + operator(}) + keyword(if) operator(()operator(()ident(p) operator(&) operator(()integer(1)operator(<)operator(<)integer(31)operator(\))operator(\)) operator(==) integer(0)operator(\)) operator({) + ident(dt) operator(=) ident(dt)operator(.)ident(withMillis)operator(()ident(p) operator(*) integer(1000L) operator(+) ident(s)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(p) operator(&=) operator(~)operator(()integer(1)operator(<)operator(<)integer(31)operator(\))operator(;) + ident(dt) operator(=) ident(dt)operator(.)ident(withYear)operator(()operator(()operator(()ident(p) operator(>)operator(>)operator(>) integer(14)operator(\)) operator(&) hex(0xFFFF)operator(\)) operator(+) integer(1900)operator(\))operator(;) + ident(dt) operator(=) ident(dt)operator(.)ident(withMonthOfYear)operator(()operator(()operator(()ident(p) operator(>)operator(>)operator(>) integer(10)operator(\)) operator(&) hex(0xF)operator(\)) operator(+) integer(1)operator(\))operator(;) + ident(dt) operator(=) ident(dt)operator(.)ident(withDayOfMonth)operator(()operator(()operator(()ident(p) operator(>)operator(>)operator(>) integer(5)operator(\)) operator(&) hex(0x1F)operator(\))operator(\))operator(;) + ident(dt) operator(=) ident(dt)operator(.)ident(withHourOfDay)operator(()operator(()ident(p) operator(&) hex(0x1F)operator(\))operator(\))operator(;) + ident(dt) operator(=) ident(dt)operator(.)ident(withMinuteOfHour)operator(()operator(()operator(()ident(s) operator(>)operator(>)operator(>) integer(26)operator(\)) operator(&) hex(0x3F)operator(\))operator(\))operator(;) + ident(dt) operator(=) ident(dt)operator(.)ident(withSecondOfMinute)operator(()operator(()operator(()ident(s) operator(>)operator(>)operator(>) integer(20)operator(\)) operator(&) hex(0x3F)operator(\))operator(\))operator(;) + comment(// marsaling dumps usec, not msec) + ident(dt) operator(=) ident(dt)operator(.)ident(withMillisOfSecond)operator(()operator(()ident(s) operator(&) hex(0xFFFFF)operator(\)) operator(/) integer(1000)operator(\))operator(;) + ident(dt) operator(=) ident(dt)operator(.)ident(withZone)operator(()ident(getLocalTimeZone)operator(()ident(runtime)operator(\))operator(\))operator(;) + ident(time)operator(.)ident(setUSec)operator(()operator(()ident(s) operator(&) hex(0xFFFFF)operator(\)) operator(%) integer(1000)operator(\))operator(;) + operator(}) + ident(time)operator(.)ident(setDateTime)operator(()ident(dt)operator(\))operator(;) + keyword(return) ident(time)operator(;) + operator(}) + + directive(private) directive(static) directive(final) type(String)type([]) ident(MONTHS) operator(=) operator({)string<delimiter(")content(jan)delimiter(")>operator(,) string<delimiter(")content(feb)delimiter(")>operator(,) string<delimiter(")content(mar)delimiter(")>operator(,) string<delimiter(")content(apr)delimiter(")>operator(,) string<delimiter(")content(may)delimiter(")>operator(,) string<delimiter(")content(jun)delimiter(")>operator(,) + string<delimiter(")content(jul)delimiter(")>operator(,) string<delimiter(")content(aug)delimiter(")>operator(,) string<delimiter(")content(sep)delimiter(")>operator(,) string<delimiter(")content(oct)delimiter(")>operator(,) string<delimiter(")content(nov)delimiter(")>operator(,) string<delimiter(")content(dec)delimiter(")>operator(})operator(;) + + directive(private) directive(static) directive(final) type(Map)operator(<)type(String)operator(,) type(Integer)operator(>) ident(MONTHS_MAP) operator(=) keyword(new) type(HashMap)operator(<)type(String)operator(,) type(Integer)operator(>)operator(()operator(\))operator(;) + directive(static) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(i) operator(<) ident(MONTHS)operator(.)ident(length)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(MONTHS_MAP)operator(.)ident(put)operator(()ident(MONTHS)operator([)ident(i)operator(])operator(,) ident(i) operator(+) integer(1)operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) directive(final) type(int)type([]) ident(time_min) operator(=) operator({)integer(1)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) type(Integer)operator(.)ident(MIN_VALUE)operator(})operator(;) + directive(private) directive(static) directive(final) type(int)type([]) ident(time_max) operator(=) operator({)integer(31)operator(,) integer(23)operator(,) integer(59)operator(,) integer(60)operator(,) type(Integer)operator(.)ident(MAX_VALUE)operator(})operator(;) + + directive(private) directive(static) directive(final) type(int) ident(ARG_SIZE) operator(=) integer(7)operator(;) + + directive(private) directive(static) ident(RubyTime) ident(createTime)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) type(boolean) ident(gmt)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + type(int) ident(len) operator(=) ident(ARG_SIZE)operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(10)operator(\)) operator({) + ident(args) operator(=) keyword(new) ident(IRubyObject)type([]) operator({) ident(args)operator([)integer(5)operator(])operator(,) ident(args)operator([)integer(4)operator(])operator(,) ident(args)operator([)integer(3)operator(])operator(,) ident(args)operator([)integer(2)operator(])operator(,) ident(args)operator([)integer(1)operator(])operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(runtime)operator(.)ident(getNil)operator(()operator(\)) operator(})operator(;) + operator(}) keyword(else) operator({) + comment(// MRI accepts additional wday argument which appears to be ignored.) + ident(len) operator(=) ident(args)operator(.)ident(length)operator(;) + + keyword(if) operator(()ident(len) operator(<) ident(ARG_SIZE)operator(\)) operator({) + ident(IRubyObject)type([]) ident(newArgs) operator(=) keyword(new) ident(IRubyObject)operator([)ident(ARG_SIZE)operator(])operator(;) + type(System)operator(.)ident(arraycopy)operator(()ident(args)operator(,) integer(0)operator(,) ident(newArgs)operator(,) integer(0)operator(,) ident(args)operator(.)ident(length)operator(\))operator(;) + keyword(for) operator(()type(int) ident(i) operator(=) ident(len)operator(;) ident(i) operator(<) ident(ARG_SIZE)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(newArgs)operator([)ident(i)operator(]) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + ident(args) operator(=) ident(newArgs)operator(;) + ident(len) operator(=) ident(ARG_SIZE)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()ident(args)operator([)integer(0)operator(]) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(args)operator([)integer(0)operator(]) operator(=) ident(RubyNumeric)operator(.)ident(str2inum)operator(()ident(runtime)operator(,) operator(()ident(RubyString)operator(\)) ident(args)operator([)integer(0)operator(])operator(,) integer(10)operator(,) keyword(false)operator(\))operator(;) + operator(}) + + type(int) ident(year) operator(=) operator(()type(int)operator(\)) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + type(int) ident(month) operator(=) integer(1)operator(;) + + keyword(if) operator(()ident(len) operator(>) integer(1)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(tmp) operator(=) ident(args)operator([)integer(1)operator(])operator(.)ident(checkStringType)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(tmp)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + type(String) ident(monthString) operator(=) ident(tmp)operator(.)ident(toString)operator(()operator(\))operator(.)ident(toLowerCase)operator(()operator(\))operator(;) + type(Integer) ident(monthInt) operator(=) ident(MONTHS_MAP)operator(.)ident(get)operator(()ident(monthString)operator(\))operator(;) + + keyword(if) operator(()ident(monthInt) operator(!=) keyword(null)operator(\)) operator({) + ident(month) operator(=) ident(monthInt)operator(;) + operator(}) keyword(else) operator({) + keyword(try) operator({) + ident(month) operator(=) type(Integer)operator(.)ident(parseInt)operator(()ident(monthString)operator(\))operator(;) + operator(}) keyword(catch) operator(()type(NumberFormatException) ident(nfExcptn)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(Argument out of range.)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + operator(}) keyword(else) operator({) + ident(month) operator(=) operator(()type(int)operator(\)) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + operator(}) + keyword(if) operator(()integer(1) operator(>) ident(month) operator(||) ident(month) operator(>) integer(12)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(Argument out of range: for month: )delimiter(")> operator(+) ident(month)operator(\))operator(;) + operator(}) + operator(}) + + type(int)type([]) ident(int_args) operator(=) operator({) integer(1)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(0) operator(})operator(;) + + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(;) ident(int_args)operator(.)ident(length) operator(>=) ident(i) operator(+) integer(2)operator(;) ident(i)operator(++)operator(\)) operator({) + keyword(if) operator(()operator(!)ident(args)operator([)ident(i) operator(+) integer(2)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(if) operator(()operator(!)operator(()ident(args)operator([)ident(i) operator(+) integer(2)operator(]) keyword(instanceof) ident(RubyNumeric)operator(\))operator(\)) operator({) + ident(args)operator([)ident(i) operator(+) integer(2)operator(]) operator(=) ident(args)operator([)ident(i) operator(+) integer(2)operator(])operator(.)ident(callMethod)operator(() + ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) string<delimiter(")content(to_i)delimiter(")>operator(\))operator(;) + operator(}) + + type(long) ident(value) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)ident(i) operator(+) integer(2)operator(])operator(\))operator(;) + keyword(if) operator(()ident(time_min)operator([)ident(i)operator(]) operator(>) ident(value) operator(||) ident(value) operator(>) ident(time_max)operator([)ident(i)operator(])operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(argument out of range.)delimiter(")>operator(\))operator(;) + operator(}) + ident(int_args)operator([)ident(i)operator(]) operator(=) operator(()type(int)operator(\)) ident(value)operator(;) + operator(}) + operator(}) + + keyword(if) operator(()integer(0) operator(<=) ident(year) operator(&&) ident(year) operator(<) integer(39)operator(\)) operator({) + ident(year) operator(+=) integer(2000)operator(;) + operator(}) keyword(else) keyword(if) operator(()integer(69) operator(<=) ident(year) operator(&&) ident(year) operator(<) integer(139)operator(\)) operator({) + ident(year) operator(+=) integer(1900)operator(;) + operator(}) + + ident(DateTimeZone) ident(dtz)operator(;) + keyword(if) operator(()ident(gmt)operator(\)) operator({) + ident(dtz) operator(=) ident(DateTimeZone)operator(.)ident(UTC)operator(;) + operator(}) keyword(else) operator({) + ident(dtz) operator(=) ident(getLocalTimeZone)operator(()ident(runtime)operator(\))operator(;) + operator(}) + + ident(DateTime) ident(dt)operator(;) + comment(// set up with min values and then add to allow rolling over) + keyword(try) operator({) + ident(dt) operator(=) keyword(new) ident(DateTime)operator(()ident(year)operator(,) integer(1)operator(,) integer(1)operator(,) integer(0)operator(,) integer(0) operator(,) integer(0)operator(,) integer(0)operator(,) ident(dtz)operator(\))operator(;) + + ident(dt) operator(=) ident(dt)operator(.)ident(plusMonths)operator(()ident(month) operator(-) integer(1)operator(\)) + operator(.)ident(plusDays)operator(()ident(int_args)operator([)integer(0)operator(]) operator(-) integer(1)operator(\)) + operator(.)ident(plusHours)operator(()ident(int_args)operator([)integer(1)operator(])operator(\)) + operator(.)ident(plusMinutes)operator(()ident(int_args)operator([)integer(2)operator(])operator(\)) + operator(.)ident(plusSeconds)operator(()ident(int_args)operator([)integer(3)operator(])operator(\))operator(;) + operator(}) keyword(catch) operator(()ident(org)operator(.)ident(joda)operator(.)ident(time)operator(.)ident(IllegalFieldValueException) ident(e)operator(\)) operator({) + keyword(throw) ident(runtime)operator(.)ident(newArgumentError)operator(()string<delimiter(")content(time out of range)delimiter(")>operator(\))operator(;) + operator(}) + + ident(RubyTime) ident(time) operator(=) keyword(new) ident(RubyTime)operator(()ident(runtime)operator(,) operator(()ident(RubyClass)operator(\)) ident(recv)operator(,) ident(dt)operator(\))operator(;) + comment(// Ignores usec if 8 args (for compatibility with parsedate\) or if not supplied.) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(8) operator(&&) operator(!)ident(args)operator([)integer(6)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + type(int) ident(usec) operator(=) ident(int_args)operator([)integer(4)operator(]) operator(%) integer(1000)operator(;) + type(int) ident(msec) operator(=) ident(int_args)operator([)integer(4)operator(]) operator(/) integer(1000)operator(;) + + keyword(if) operator(()ident(int_args)operator([)integer(4)operator(]) operator(<) integer(0)operator(\)) operator({) + ident(msec) operator(-=) integer(1)operator(;) + ident(usec) operator(+=) integer(1000)operator(;) + operator(}) + ident(time)operator(.)ident(dt) operator(=) ident(dt)operator(.)ident(withMillis)operator(()ident(dt)operator(.)ident(getMillis)operator(()operator(\)) operator(+) ident(msec)operator(\))operator(;) + ident(time)operator(.)ident(setUSec)operator(()ident(usec)operator(\))operator(;) + operator(}) + + ident(time)operator(.)ident(callInit)operator(()ident(IRubyObject)operator(.)ident(NULL_ARRAY)operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + keyword(return) ident(time)operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.internal.runtime.methods.DynamicMethod)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +comment(/** + * + * Note: This was renamed from UnboundMethod.java + * + * @author jpetersen + */) +annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(UnboundMethod)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Method)delimiter(")>operator(\)) +directive(public) type(class) class(RubyUnboundMethod) directive(extends) ident(RubyMethod) operator({) + directive(protected) ident(RubyUnboundMethod)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getUnboundMethod)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(RubyUnboundMethod) ident(newUnboundMethod)operator(() + ident(RubyModule) ident(implementationModule)operator(,) + type(String) ident(methodName)operator(,) + ident(RubyModule) ident(originModule)operator(,) + type(String) ident(originName)operator(,) + ident(DynamicMethod) ident(method)operator(\)) operator({) + ident(RubyUnboundMethod) ident(newMethod) operator(=) keyword(new) ident(RubyUnboundMethod)operator(()ident(implementationModule)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(;) + + ident(newMethod)operator(.)ident(implementationModule) operator(=) ident(implementationModule)operator(;) + ident(newMethod)operator(.)ident(methodName) operator(=) ident(methodName)operator(;) + ident(newMethod)operator(.)ident(originModule) operator(=) ident(originModule)operator(;) + ident(newMethod)operator(.)ident(originName) operator(=) ident(originName)operator(;) + ident(newMethod)operator(.)ident(method) operator(=) ident(method)operator(;) + + keyword(return) ident(newMethod)operator(;) + operator(}) + + directive(public) directive(static) ident(RubyClass) ident(defineUnboundMethodClass)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + comment(// TODO: NOT_ALLOCATABLE_ALLOCATOR is probably ok here. Confirm. JRUBY-415) + ident(RubyClass) ident(newClass) operator(=) + ident(runtime)operator(.)ident(defineClass)operator(()string<delimiter(")content(UnboundMethod)delimiter(")>operator(,) ident(runtime)operator(.)ident(getMethod)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(runtime)operator(.)ident(setUnboundMethod)operator(()ident(newClass)operator(\))operator(;) + + ident(newClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyUnboundMethod)operator(.)ident(class)operator(\))operator(;) + + keyword(return) ident(newClass)operator(;) + operator(}) + + comment(/** + * @see org.jruby.RubyMethod#call(IRubyObject[]\) + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) operator({)string<delimiter(")content(call)delimiter(")>operator(,) string<delimiter(")content([])delimiter(")>operator(})operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(call)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(you cannot call unbound method; bind first)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.RubyMethod#unbind(\) + */) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(unbind)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + annotation(@Override) + directive(public) ident(RubyUnboundMethod) ident(unbind)operator(()ident(Block) ident(block)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(bind)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(RubyMethod) ident(bind)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(aReceiver)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(receiverClass) operator(=) ident(aReceiver)operator(.)ident(getMetaClass)operator(()operator(\))operator(;) + + keyword(if) operator(()operator(!)ident(originModule)operator(.)ident(isInstance)operator(()ident(aReceiver)operator(\))operator(\)) operator({) + keyword(if) operator(()ident(originModule) keyword(instanceof) ident(MetaClass)operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(singleton method called for a different object)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(receiverClass) keyword(instanceof) ident(MetaClass) operator(&&) ident(receiverClass)operator(.)ident(getMethods)operator(()operator(\))operator(.)ident(containsKey)operator(()ident(originName)operator(\))operator(\)) operator({) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(method `)delimiter(")> operator(+) ident(originName) operator(+) string<delimiter(")content(' overridden)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(() + operator(!)operator(()ident(originModule)operator(.)ident(isModule)operator(()operator(\)) operator(?) ident(originModule)operator(.)ident(isInstance)operator(()ident(aReceiver)operator(\)) operator(:) ident(aReceiver)operator(.)ident(getType)operator(()operator(\)) operator(==) ident(originModule)operator(\))operator(\)) operator({) + comment(// FIX replace type(\) == ... with isInstanceOf(...\)) + keyword(throw) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(bind argument must be an instance of )delimiter(")> operator(+) ident(originModule)operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(RubyMethod)operator(.)ident(newMethod)operator(()ident(implementationModule)operator(,) ident(methodName)operator(,) ident(receiverClass)operator(,) ident(originName)operator(,) ident(method)operator(,) ident(aReceiver)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(clone)delimiter(")>operator(\)) + annotation(@Override) + directive(public) ident(RubyMethod) ident(rbClone)operator(()operator(\)) operator({) + keyword(return) ident(newUnboundMethod)operator(()ident(implementationModule)operator(,) ident(methodName)operator(,) ident(originModule)operator(,) ident(originName)operator(,) ident(method)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_proc)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + annotation(@Override) + directive(public) ident(IRubyObject) ident(to_proc)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) local_variable(super)operator(.)ident(to_proc)operator(()ident(context)operator(,) ident(unusedBlock)operator(\))operator(;) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2007 Ola Bini <ola.bini@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.IOException)operator(;) + +keyword(import) include(java.util.Iterator)operator(;) +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.Map)operator(;) + +keyword(import) include(java.util.regex.Pattern)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) + +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +keyword(import) include(org.jruby.javasupport.JavaEmbedUtils)operator(;) + +keyword(import) include(org.jruby.javasupport.JavaUtil)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.MethodIndex)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) + +keyword(import) include(org.jruby.yaml.JRubyRepresenter)operator(;) +keyword(import) include(org.jruby.yaml.JRubyConstructor)operator(;) +keyword(import) include(org.jruby.yaml.JRubySerializer)operator(;) +keyword(import) include(org.jruby.util.IOInputStream)operator(;) +keyword(import) include(org.jruby.util.IOOutputStream)operator(;) + +keyword(import) include(org.jvyamlb.Representer)operator(;) +keyword(import) include(org.jvyamlb.Constructor)operator(;) +keyword(import) include(org.jvyamlb.ParserImpl)operator(;) +keyword(import) include(org.jvyamlb.PositioningParserImpl)operator(;) +keyword(import) include(org.jvyamlb.Scanner)operator(;) +keyword(import) include(org.jvyamlb.ScannerImpl)operator(;) +keyword(import) include(org.jvyamlb.Composer)operator(;) +keyword(import) include(org.jvyamlb.ComposerImpl)operator(;) +keyword(import) include(org.jvyamlb.PositioningScannerImpl)operator(;) +keyword(import) include(org.jvyamlb.PositioningComposerImpl)operator(;) +keyword(import) include(org.jvyamlb.Serializer)operator(;) +keyword(import) include(org.jvyamlb.ResolverImpl)operator(;) +keyword(import) include(org.jvyamlb.EmitterImpl)operator(;) +keyword(import) include(org.jvyamlb.exceptions.YAMLException)operator(;) +keyword(import) include(org.jvyamlb.YAMLConfig)operator(;) +keyword(import) include(org.jvyamlb.YAML)operator(;) +keyword(import) include(org.jvyamlb.PositioningScanner)operator(;) +keyword(import) include(org.jvyamlb.Positionable)operator(;) +keyword(import) include(org.jvyamlb.Position)operator(;) + +comment(/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */) +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(YAML)delimiter(")>operator(\)) +directive(public) type(class) class(RubyYAML) operator({) + directive(public) directive(static) ident(RubyModule) ident(createYAMLModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(result) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(YAML)delimiter(")>operator(\))operator(;) + + ident(runtime)operator(.)ident(getKernel)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,)string<delimiter(")content(require)delimiter(")>operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(stringio)delimiter(")>operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyYAML)operator(.)ident(class)operator(\))operator(;) + + ident(RubyClass) ident(obj) operator(=) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(;) + ident(RubyClass) ident(clazz) operator(=) ident(runtime)operator(.)ident(getClassClass)operator(()operator(\))operator(;) + ident(RubyClass) ident(hash) operator(=) ident(runtime)operator(.)ident(getHash)operator(()operator(\))operator(;) + ident(RubyClass) ident(array) operator(=) ident(runtime)operator(.)ident(getArray)operator(()operator(\))operator(;) + ident(RubyClass) ident(struct) operator(=) ident(runtime)operator(.)ident(getStructClass)operator(()operator(\))operator(;) + ident(RubyClass) ident(exception) operator(=) ident(runtime)operator(.)ident(getException)operator(()operator(\))operator(;) + ident(RubyClass) ident(string) operator(=) ident(runtime)operator(.)ident(getString)operator(()operator(\))operator(;) + ident(RubyClass) ident(symbol) operator(=) ident(runtime)operator(.)ident(getSymbol)operator(()operator(\))operator(;) + ident(RubyClass) ident(range) operator(=) ident(runtime)operator(.)ident(getRange)operator(()operator(\))operator(;) + ident(RubyClass) ident(regexp) operator(=) ident(runtime)operator(.)ident(getRegexp)operator(()operator(\))operator(;) + ident(RubyClass) ident(time) operator(=) ident(runtime)operator(.)ident(getTime)operator(()operator(\))operator(;) + ident(RubyClass) ident(date) operator(=) ident(runtime)operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Date)delimiter(")>operator(\))operator(;) + ident(RubyClass) ident(fixnum) operator(=) ident(runtime)operator(.)ident(getFixnum)operator(()operator(\))operator(;) + ident(RubyClass) ident(bignum) operator(=) ident(runtime)operator(.)ident(getBignum)operator(()operator(\))operator(;) + ident(RubyClass) ident(flt) operator(=) ident(runtime)operator(.)ident(getFloat)operator(()operator(\))operator(;) + ident(RubyClass) ident(trueClass) operator(=) ident(runtime)operator(.)ident(getTrueClass)operator(()operator(\))operator(;) + ident(RubyClass) ident(falseClass) operator(=) ident(runtime)operator(.)ident(getFalseClass)operator(()operator(\))operator(;) + ident(RubyClass) ident(nilClass) operator(=) ident(runtime)operator(.)ident(getNilClass)operator(()operator(\))operator(;) + + ident(clazz)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLClassMethods)operator(.)ident(class)operator(\))operator(;) + + ident(obj)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLObjectMethods)operator(.)ident(class)operator(\))operator(;) + + ident(hash)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLHashMethods)operator(.)ident(class)operator(\))operator(;) + + ident(array)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLArrayMethods)operator(.)ident(class)operator(\))operator(;) + + ident(struct)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLStructMethods)operator(.)ident(class)operator(\))operator(;) + + ident(exception)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLExceptionMethods)operator(.)ident(class)operator(\))operator(;) + + ident(string)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLStringMethods)operator(.)ident(class)operator(\))operator(;) + + ident(symbol)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLSymbolMethods)operator(.)ident(class)operator(\))operator(;) + + ident(range)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLRangeMethods)operator(.)ident(class)operator(\))operator(;) + + ident(regexp)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLRegexpMethods)operator(.)ident(class)operator(\))operator(;) + + ident(time)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLTimeMethods)operator(.)ident(class)operator(\))operator(;) + + ident(date)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLDateMethods)operator(.)ident(class)operator(\))operator(;) + + ident(bignum)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLNumericMethods)operator(.)ident(class)operator(\))operator(;) + + ident(fixnum)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLNumericMethods)operator(.)ident(class)operator(\))operator(;) + + ident(flt)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLNumericMethods)operator(.)ident(class)operator(\))operator(;) + + ident(trueClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLTrueMethods)operator(.)ident(class)operator(\))operator(;) + + ident(falseClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLFalseMethods)operator(.)ident(class)operator(\))operator(;) + + ident(nilClass)operator(.)ident(defineAnnotatedMethods)operator(()ident(YAMLNilMethods)operator(.)ident(class)operator(\))operator(;) + + ident(runtime)operator(.)ident(setObjectToYamlMethod)operator(()ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(searchMethod)operator(()string<delimiter(")content(to_yaml)delimiter(")>operator(\))operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dump)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(dump)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(IRubyObject) ident(obj) operator(=) ident(args)operator([)integer(0)operator(])operator(;) + ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(val) operator(=) ident(runtime)operator(.)ident(newArray)operator(()ident(obj)operator(\))operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length)operator(>)integer(1)operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(self)operator(,)string<delimiter(")content(dump_all)delimiter(")>operator(,) ident(val)operator(,) ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(self)operator(.)ident(callMethod)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,)string<delimiter(")content(dump_all)delimiter(")>operator(,) ident(val)operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dump_all)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(dump_all)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(RubyArray) ident(objs) operator(=) operator(()ident(RubyArray)operator(\))ident(args)operator([)integer(0)operator(])operator(;) + ident(IRubyObject) ident(io) operator(=) keyword(null)operator(;) + ident(IRubyObject) ident(io2) operator(=) keyword(null)operator(;) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(==) integer(2) operator(&&) ident(args)operator([)integer(1)operator(]) operator(!=) keyword(null) operator(&&) operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(io) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + operator(}) + ident(YAMLConfig) ident(cfg) operator(=) ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(;) + ident(IOOutputStream) ident(iox) operator(=) keyword(null)operator(;) + keyword(if)operator(()keyword(null) operator(==) ident(io)operator(\)) operator({) + ident(io2) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(StringIO)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + ident(iox) operator(=) keyword(new) ident(IOOutputStream)operator(()ident(io2)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(iox) operator(=) keyword(new) ident(IOOutputStream)operator(()ident(io)operator(\))operator(;) + operator(}) + ident(Serializer) ident(ser) operator(=) keyword(new) ident(JRubySerializer)operator(()keyword(new) ident(EmitterImpl)operator(()ident(iox)operator(,)ident(cfg)operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(,)ident(cfg)operator(\))operator(;) + keyword(try) operator({) + ident(ser)operator(.)ident(open)operator(()operator(\))operator(;) + ident(Representer) ident(r) operator(=) keyword(new) ident(JRubyRepresenter)operator(()ident(ser)operator(,) ident(cfg)operator(\))operator(;) + keyword(for)operator(()type(Iterator) ident(iter) operator(=) ident(objs)operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;)ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(r)operator(.)ident(represent)operator(()ident(iter)operator(.)ident(next)operator(()operator(\))operator(\))operator(;) + operator(}) + ident(ser)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newIOErrorFromException)operator(()ident(e)operator(\))operator(;) + operator(}) + keyword(if)operator(()keyword(null) operator(==) ident(io)operator(\)) operator({) + ident(io2)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(rewind)delimiter(")>operator(\))operator(;) + keyword(return) ident(io2)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(read)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(return) ident(io)operator(;) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(_parse_internal)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(parse_internal)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + type(boolean) ident(debug) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + ident(IRubyObject) ident(io) operator(=) ident(check_yaml_port)operator(()ident(arg)operator(\))operator(;) + type(Scanner) ident(scn) operator(=) keyword(null)operator(;) + keyword(try) operator({) + keyword(if)operator(()ident(io) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\))operator(;) + operator(}) + ident(Composer) ident(ctor) operator(=) + ident(debug) operator(?) + keyword(new) ident(PositioningComposerImpl)operator(()keyword(new) ident(PositioningParserImpl)operator(()operator(()ident(PositioningScanner)operator(\))ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\)) operator(:) + keyword(new) ident(ComposerImpl)operator(()keyword(new) ident(ParserImpl)operator(()ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\)) + operator(;) + keyword(if)operator(()ident(ctor)operator(.)ident(checkNode)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(JavaEmbedUtils)operator(.)ident(javaToRuby)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(ctor)operator(.)ident(getNode)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()ident(YAMLException) ident(e)operator(\)) operator({) + keyword(if)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + type(Position)operator(.)ident(Range) ident(range) operator(=) operator(()operator(()ident(Positionable)operator(\))ident(e)operator(\))operator(.)ident(getRange)operator(()operator(\))operator(;) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error on )delimiter(")> operator(+) ident(range)operator(.)ident(start) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(range)operator(.)ident(end) operator(+) string<delimiter(")content(: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error:)delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(load)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(load)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + type(boolean) ident(debug) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + ident(IRubyObject) ident(io) operator(=) ident(check_yaml_port)operator(()ident(arg)operator(\))operator(;) + type(Scanner) ident(scn) operator(=) keyword(null)operator(;) + keyword(try) operator({) + keyword(if)operator(()ident(io) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\))operator(;) + operator(}) + type(Constructor) ident(ctor) operator(=) + ident(debug) operator(?) + keyword(new) ident(JRubyConstructor)operator(()ident(self)operator(,) keyword(new) ident(PositioningComposerImpl)operator(()keyword(new) ident(PositioningParserImpl)operator(()operator(()ident(PositioningScanner)operator(\))ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\))operator(\)) operator(:) + keyword(new) ident(JRubyConstructor)operator(()ident(self)operator(,) keyword(new) ident(ComposerImpl)operator(()keyword(new) ident(ParserImpl)operator(()ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\))operator(\)) + operator(;) + keyword(if)operator(()ident(ctor)operator(.)ident(checkData)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(JavaEmbedUtils)operator(.)ident(javaToRuby)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(ctor)operator(.)ident(getData)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()ident(YAMLException) ident(e)operator(\)) operator({) + keyword(if)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + type(Position)operator(.)ident(Range) ident(range) operator(=) operator(()operator(()ident(Positionable)operator(\))ident(e)operator(\))operator(.)ident(getRange)operator(()operator(\))operator(;) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error on )delimiter(")> operator(+) ident(range)operator(.)ident(start) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(range)operator(.)ident(end) operator(+) string<delimiter(")content(: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error:)delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(load_file)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(load_file)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(io) operator(=) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getFile)operator(()operator(\))operator(,)string<delimiter(")content(open)delimiter(")>operator(,) ident(arg)operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(r)delimiter(")>operator(\))operator(\))operator(;) + ident(IRubyObject) ident(val) operator(=) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(load)delimiter(")>operator(,) ident(io)operator(\))operator(;) + ident(io)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(close)delimiter(")>operator(\))operator(;) + keyword(return) ident(val)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_document)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(each_document)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(boolean) ident(debug) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(io) operator(=) ident(arg)operator(;) + type(Scanner) ident(scn) operator(=) keyword(null)operator(;) + keyword(try) operator({) + keyword(if)operator(()ident(io) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\))operator(;) + operator(}) + type(Constructor) ident(ctor) operator(=) + ident(debug) operator(?) + keyword(new) ident(JRubyConstructor)operator(()ident(self)operator(,) keyword(new) ident(PositioningComposerImpl)operator(()keyword(new) ident(PositioningParserImpl)operator(()operator(()ident(PositioningScanner)operator(\))ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\))operator(\)) operator(:) + keyword(new) ident(JRubyConstructor)operator(()ident(self)operator(,) keyword(new) ident(ComposerImpl)operator(()keyword(new) ident(ParserImpl)operator(()ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\))operator(\)) + operator(;) + keyword(while)operator(()ident(ctor)operator(.)ident(checkData)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(JavaEmbedUtils)operator(.)ident(javaToRuby)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(ctor)operator(.)ident(getData)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()ident(YAMLException) ident(e)operator(\)) operator({) + keyword(if)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + type(Position)operator(.)ident(Range) ident(range) operator(=) operator(()operator(()ident(Positionable)operator(\))ident(e)operator(\))operator(.)ident(getRange)operator(()operator(\))operator(;) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error on )delimiter(")> operator(+) ident(range)operator(.)ident(start) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(range)operator(.)ident(end) operator(+) string<delimiter(")content(: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error:)delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(load_documents)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(load_documents)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(,) ident(Block) ident(block)operator(\)) operator({) + type(boolean) ident(debug) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(io) operator(=) ident(check_yaml_port)operator(()ident(arg)operator(\))operator(;) + type(Scanner) ident(scn) operator(=) keyword(null)operator(;) + keyword(try) operator({) + keyword(if)operator(()ident(io) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\))operator(;) + operator(}) + type(Constructor) ident(ctor) operator(=) + ident(debug) operator(?) + keyword(new) ident(JRubyConstructor)operator(()ident(self)operator(,) keyword(new) ident(PositioningComposerImpl)operator(()keyword(new) ident(PositioningParserImpl)operator(()operator(()ident(PositioningScanner)operator(\))ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\))operator(\)) operator(:) + keyword(new) ident(JRubyConstructor)operator(()ident(self)operator(,) keyword(new) ident(ComposerImpl)operator(()keyword(new) ident(ParserImpl)operator(()ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\))operator(\)) + operator(;) + keyword(while)operator(()ident(ctor)operator(.)ident(checkData)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(JavaEmbedUtils)operator(.)ident(javaToRuby)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(ctor)operator(.)ident(getData)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(catch)operator(()ident(YAMLException) ident(e)operator(\)) operator({) + keyword(if)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + type(Position)operator(.)ident(Range) ident(range) operator(=) operator(()operator(()ident(Positionable)operator(\))ident(e)operator(\))operator(.)ident(getRange)operator(()operator(\))operator(;) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error on )delimiter(")> operator(+) ident(range)operator(.)ident(start) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(range)operator(.)ident(end) operator(+) string<delimiter(")content(: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error:)delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(load_stream)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(load_stream)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + type(boolean) ident(debug) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(d) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(IRubyObject) ident(io) operator(=) ident(arg)operator(;) + type(Scanner) ident(scn) operator(=) keyword(null)operator(;) + keyword(try) operator({) + keyword(if)operator(()ident(io) keyword(instanceof) ident(RubyString)operator(\)) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()operator(()operator(()ident(RubyString)operator(\))ident(io)operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(scn) operator(=) ident(debug) operator(?) keyword(new) ident(PositioningScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\)) operator(:) keyword(new) ident(ScannerImpl)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\))operator(;) + operator(}) + type(Constructor) ident(ctor) operator(=) + ident(debug) operator(?) + keyword(new) ident(JRubyConstructor)operator(()ident(self)operator(,) keyword(new) ident(PositioningComposerImpl)operator(()keyword(new) ident(PositioningParserImpl)operator(()operator(()ident(PositioningScanner)operator(\))ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\))operator(\)) operator(:) + keyword(new) ident(JRubyConstructor)operator(()ident(self)operator(,) keyword(new) ident(ComposerImpl)operator(()keyword(new) ident(ParserImpl)operator(()ident(scn)operator(,)ident(YAML)operator(.)ident(config)operator(()operator(\))operator(.)ident(version)operator(()string<delimiter(")content(1.0)delimiter(")>operator(\))operator(\))operator(,)keyword(new) ident(ResolverImpl)operator(()operator(\))operator(\))operator(\)) + operator(;) + keyword(while)operator(()ident(ctor)operator(.)ident(checkData)operator(()operator(\))operator(\)) operator({) + keyword(if)operator(()ident(d)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(d) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetModule)operator(()string<delimiter(")content(YAML)delimiter(")>operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Stream)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(new)delimiter(")>operator(,) ident(d)operator(\))operator(;) + operator(}) + ident(d)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(add)delimiter(")>operator(,) ident(JavaEmbedUtils)operator(.)ident(javaToRuby)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(ctor)operator(.)ident(getData)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(d)operator(;) + operator(}) keyword(catch)operator(()ident(YAMLException) ident(e)operator(\)) operator({) + keyword(if)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getDebug)operator(()operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + type(Position)operator(.)ident(Range) ident(range) operator(=) operator(()operator(()ident(Positionable)operator(\))ident(e)operator(\))operator(.)ident(getRange)operator(()operator(\))operator(;) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error on )delimiter(")> operator(+) ident(range)operator(.)ident(start) operator(+) string<delimiter(")content(:)delimiter(")> operator(+) ident(range)operator(.)ident(end) operator(+) string<delimiter(")content(: )delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(syntax error:)delimiter(")> operator(+) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(dump_stream)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(dump_stream)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(stream) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetModule)operator(()string<delimiter(")content(YAML)delimiter(")>operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Stream)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + keyword(for)operator(()type(int) ident(i)operator(=)integer(0)operator(,)ident(j)operator(=)ident(args)operator(.)ident(length)operator(;)ident(i)operator(<)ident(j)operator(;)ident(i)operator(++)operator(\)) operator({) + ident(stream)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(add)delimiter(")>operator(,) ident(args)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(stream)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(emit)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(quick_emit_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(quick_emit_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(block)operator(.)ident(yield)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + +comment(// @JRubyMethod(name = "quick_emit_node", rest = true, module = true, visibility = Visibility.PRIVATE\)) + directive(public) directive(static) ident(IRubyObject) ident(quick_emit)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + comment(// prepares IO port type for load (ported from ext/syck/rubyext.c\)) + directive(private) directive(static) ident(IRubyObject) ident(check_yaml_port)operator(()ident(IRubyObject) ident(port)operator(\)) operator({) + keyword(if) operator(()ident(port) keyword(instanceof) ident(RubyString)operator(\)) operator({) + comment(// OK) + operator(}) + keyword(else) keyword(if) operator(()ident(port)operator(.)ident(respondsTo)operator(()string<delimiter(")content(read)delimiter(")>operator(\))operator(\)) operator({) + keyword(if) operator(()ident(port)operator(.)ident(respondsTo)operator(()string<delimiter(")content(binmode)delimiter(")>operator(\))operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(port)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(port)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(binmode)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + keyword(else) operator({) + keyword(throw) ident(port)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(instance of IO needed)delimiter(")>operator(\))operator(;) + operator(}) + keyword(return) ident(port)operator(;) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Hash)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLHashMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(hash_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(ThreadContext) ident(context) operator(=) ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(map)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Object)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLObjectMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_properties)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(obj_to_yaml_properties)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(instance_variables)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(sort)delimiter(")>operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(obj_to_yaml_style)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(obj_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + type(Map) ident(mep) operator(=) operator(()type(Map)operator(\))operator(()keyword(new) ident(RubyHash)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + ident(RubyArray) ident(props) operator(=) operator(()ident(RubyArray)operator(\))ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_properties)delimiter(")>operator(\))operator(;) + keyword(for)operator(()type(Iterator) ident(iter) operator(=) ident(props)operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(String) ident(m) operator(=) ident(iter)operator(.)ident(next)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(.)ident(substring)operator(()integer(1)operator(\))operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(instance_variable_get)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(map)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) operator(()ident(IRubyObject)operator(\))ident(mep)operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(obj_to_yaml)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetModule)operator(()string<delimiter(")content(YAML)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(dump)delimiter(")>operator(,) ident(self)operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(taguri)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(obj_taguri)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(!ruby/object:)delimiter(")> operator(+) ident(self)operator(.)ident(getType)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Class)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLClassMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(class_to_yaml)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) operator({) + keyword(throw) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newTypeError)operator(()string<delimiter(")content(can't dump anonymous class )delimiter(")> operator(+) ident(self)operator(.)ident(getType)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Array)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLArrayMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(array_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(seq)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Struct)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLStructMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(struct_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + type(Map) ident(mep) operator(=) operator(()type(Map)operator(\))operator(()keyword(new) ident(RubyHash)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(for)operator(()type(Iterator) ident(iter) operator(=) operator(()operator(()ident(RubyArray)operator(\))ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(members)delimiter(")>operator(\))operator(\))operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;)ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + ident(IRubyObject) ident(key) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(iter)operator(.)ident(next)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(key)operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,)ident(MethodIndex)operator(.)ident(AREF)operator(,) string<delimiter(")content([])delimiter(")>operator(,) ident(key)operator(\))operator(\))operator(;) + operator(}) + keyword(for)operator(()type(Iterator) ident(iter) operator(=) operator(()operator(()ident(RubyArray)operator(\))ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_properties)delimiter(")>operator(\))operator(\))operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(String) ident(m) operator(=) ident(iter)operator(.)ident(next)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(.)ident(substring)operator(()integer(1)operator(\))operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(instance_variable_get)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(map)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) operator(()ident(IRubyObject)operator(\))ident(mep)operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(taguri)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(struct_taguri)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(!ruby/struct:)delimiter(")> operator(+) ident(self)operator(.)ident(getType)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Exception)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLExceptionMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exception_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + type(Map) ident(mep) operator(=) operator(()type(Map)operator(\))operator(()keyword(new) ident(RubyHash)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(message)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(message)delimiter(")>operator(\))operator(\))operator(;) + keyword(for)operator(()type(Iterator) ident(iter) operator(=) operator(()operator(()ident(RubyArray)operator(\))ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_properties)delimiter(")>operator(\))operator(\))operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(String) ident(m) operator(=) ident(iter)operator(.)ident(next)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(.)ident(substring)operator(()integer(1)operator(\))operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(instance_variable_get)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(")content(map)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) operator(()ident(IRubyObject)operator(\))ident(mep)operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(taguri)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(exception_taguri)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(!ruby/exception:)delimiter(")> operator(+) ident(self)operator(.)ident(getType)operator(()operator(\))operator(.)ident(getName)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) + + directive(private) directive(static) directive(final) type(Pattern) ident(AFTER_NEWLINE) operator(=) type(Pattern)operator(.)ident(compile)operator(()string<delimiter(")char(\\n)content(.+)delimiter(")>operator(,) type(Pattern)operator(.)ident(DOTALL)operator(\))operator(;) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(String)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLStringMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(is_complex_yaml?)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(string_is_complex)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) operator(()ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(.)ident(isTrue)operator(()operator(\)) operator(||) + operator(()operator(()type(List)operator(\))ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_properties)delimiter(")>operator(\))operator(\))operator(.)ident(isEmpty)operator(()operator(\)) operator(||) + ident(AFTER_NEWLINE)operator(.)ident(matcher)operator(()ident(self)operator(.)ident(toString)operator(()operator(\))operator(\))operator(.)ident(find)operator(()operator(\))operator(\)) operator(?) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(is_binary_data?)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(string_is_binary)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(if)operator(()ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(EMPTY_P)operator(,) string<delimiter(")content(empty?)delimiter(")>operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(self)operator(.)ident(toString)operator(()operator(\))operator(.)ident(indexOf)operator(()string<delimiter(')content(\\0)delimiter(')>operator(\)) operator(!=) operator(-)integer(1) operator(?) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + directive(private) directive(static) ident(JRubyRepresenter) ident(into)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(IRubyObject) ident(jobj) operator(=) ident(arg)operator(.)ident(getInstanceVariables)operator(()operator(\))operator(.)ident(fastGetInstanceVariable)operator(()string<delimiter(")content(@java_object)delimiter(")>operator(\))operator(;) + keyword(if)operator(()ident(jobj) operator(!=) keyword(null)operator(\)) operator({) + keyword(return) operator(()ident(JRubyRepresenter)operator(\))operator(()operator(()operator(()ident(org)operator(.)ident(jruby)operator(.)ident(javasupport)operator(.)ident(JavaObject)operator(\))ident(jobj)operator(\))operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + keyword(return) keyword(null)operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(string_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(Ruby) ident(rt) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + keyword(if)operator(()ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(is_binary_data?)delimiter(")>operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(scalar)delimiter(")>operator(,) ident(rt)operator(.)ident(newString)operator(()string<delimiter(")content(tag:yaml.org,2002:binary)delimiter(")>operator(\))operator(,) ident(rt)operator(.)ident(newArray)operator(()ident(self)operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(pack)delimiter(")>operator(,) ident(rt)operator(.)ident(newString)operator(()string<delimiter(")content(m)delimiter(")>operator(\))operator(\))operator(,) ident(rt)operator(.)ident(newString)operator(()string<delimiter(")content(|)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + keyword(if)operator(()operator(()operator(()type(List)operator(\))ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_properties)delimiter(")>operator(\))operator(\))operator(.)ident(isEmpty)operator(()operator(\))operator(\)) operator({) + ident(JRubyRepresenter) ident(rep) operator(=) ident(into)operator(()ident(arg)operator(\))operator(;) + keyword(if)operator(()ident(rep) operator(!=) keyword(null)operator(\)) operator({) + keyword(try) operator({) + keyword(return) ident(JavaUtil)operator(.)ident(convertJavaToRuby)operator(()ident(rt)operator(,)ident(rep)operator(.)ident(scalar)operator(()ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(.)ident(toString)operator(()operator(\))operator(,)ident(self)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(,)ident(self)operator(.)ident(toString)operator(()operator(\))operator(.)ident(startsWith)operator(()string<delimiter(")content(:)delimiter(")>operator(\)) operator(?) string<delimiter(")char(\\")delimiter(")> operator(:) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(.)ident(toString)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) keyword(catch)operator(()type(IOException) ident(e)operator(\)) operator({) + keyword(throw) ident(rt)operator(.)ident(newIOErrorFromException)operator(()ident(e)operator(\))operator(;) + operator(}) + operator(}) keyword(else) operator({) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(,) ident(self)operator(.)ident(toString)operator(()operator(\))operator(.)ident(startsWith)operator(()string<delimiter(")content(:)delimiter(")>operator(\)) operator(?) ident(rt)operator(.)ident(newString)operator(()string<delimiter(")char(\\")delimiter(")>operator(\)) operator(:) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + type(Map) ident(mep) operator(=) operator(()type(Map)operator(\))operator(()keyword(new) ident(RubyHash)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(str)delimiter(")>operator(\))operator(,)ident(rt)operator(.)ident(newString)operator(()ident(self)operator(.)ident(toString)operator(()operator(\))operator(\))operator(\))operator(;) + keyword(for)operator(()type(Iterator) ident(iter) operator(=) operator(()operator(()ident(RubyArray)operator(\))ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_properties)delimiter(")>operator(\))operator(\))operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(String) ident(m) operator(=) ident(iter)operator(.)ident(next)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(instance_variable_get)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(map)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) operator(()ident(IRubyObject)operator(\))ident(mep)operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Symbol)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLSymbolMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(symbol_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(taguri)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(symbol_taguri)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(tag:yaml.org,2002:str)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Numeric)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLNumericMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(numeric_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + type(String) ident(val) operator(=) ident(self)operator(.)ident(toString)operator(()operator(\))operator(;) + keyword(if)operator(()string<delimiter(")content(Infinity)delimiter(")>operator(.)ident(equals)operator(()ident(val)operator(\))operator(\)) operator({) + ident(val) operator(=) string<delimiter(")content(.Inf)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if)operator(()string<delimiter(")content(-Infinity)delimiter(")>operator(.)ident(equals)operator(()ident(val)operator(\))operator(\)) operator({) + ident(val) operator(=) string<delimiter(")content(-.Inf)delimiter(")>operator(;) + operator(}) keyword(else) keyword(if)operator(()string<delimiter(")content(NaN)delimiter(")>operator(.)ident(equals)operator(()ident(val)operator(\))operator(\)) operator({) + ident(val) operator(=) string<delimiter(")content(.NaN)delimiter(")>operator(;) + operator(}) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(val)operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Range)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLRangeMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(range_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + type(Map) ident(mep) operator(=) operator(()type(Map)operator(\))operator(()keyword(new) ident(RubyHash)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(begin)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(begin)delimiter(")>operator(\))operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(end)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(end)delimiter(")>operator(\))operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(excl)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(exclude_end?)delimiter(")>operator(\))operator(\))operator(;) + keyword(for)operator(()type(Iterator) ident(iter) operator(=) operator(()operator(()ident(RubyArray)operator(\))ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_properties)delimiter(")>operator(\))operator(\))operator(.)ident(getList)operator(()operator(\))operator(.)ident(iterator)operator(()operator(\))operator(;) ident(iter)operator(.)ident(hasNext)operator(()operator(\))operator(;)operator(\)) operator({) + type(String) ident(m) operator(=) ident(iter)operator(.)ident(next)operator(()operator(\))operator(.)ident(toString)operator(()operator(\))operator(;) + ident(mep)operator(.)ident(put)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(.)ident(substring)operator(()integer(1)operator(\))operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(instance_variable_get)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(m)operator(\))operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(map)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) operator(()ident(IRubyObject)operator(\))ident(mep)operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Regexp)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLRegexpMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(regexp_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(inspect)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Time)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLTimeMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(time_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + ident(IRubyObject) ident(tz) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(Z)delimiter(")>operator(\))operator(;) + ident(IRubyObject) ident(difference_sign) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(-)delimiter(")>operator(\))operator(;) + ident(self) operator(=) ident(self)operator(.)ident(dup)operator(()operator(\))operator(;) + keyword(if)operator(()operator(!)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(utc?)delimiter(")>operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(IRubyObject) ident(utc_same_instant) operator(=) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(utc)delimiter(")>operator(\))operator(;) + ident(IRubyObject) ident(utc_same_writing) operator(=) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getTime)operator(()operator(\))operator(,) string<delimiter(")content(utc)delimiter(")>operator(,) keyword(new) ident(IRubyObject)type([])operator({) + ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(year)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(month)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(day)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(hour)delimiter(")>operator(\))operator(,) + ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(min)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(sec)delimiter(")>operator(\))operator(,)ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(usec)delimiter(")>operator(\))operator(})operator(\))operator(;) + ident(IRubyObject) ident(difference_to_utc) operator(=) ident(utc_same_writing)operator(.)ident(callMethod)operator(()ident(context)operator(,)ident(MethodIndex)operator(.)ident(OP_MINUS)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(utc_same_instant)operator(\))operator(;) + ident(IRubyObject) ident(absolute_difference)operator(;) + keyword(if)operator(()ident(difference_to_utc)operator(.)ident(callMethod)operator(()ident(context)operator(,)ident(MethodIndex)operator(.)ident(OP_LT)operator(,) string<delimiter(")content(<)delimiter(")>operator(,) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(difference_sign) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(-)delimiter(")>operator(\))operator(;) + ident(absolute_difference) operator(=) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,)ident(MethodIndex)operator(.)ident(OP_MINUS)operator(,) string<delimiter(")content(-)delimiter(")>operator(,) ident(difference_to_utc)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(difference_sign) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(+)delimiter(")>operator(\))operator(;) + ident(absolute_difference) operator(=) ident(difference_to_utc)operator(;) + operator(}) + ident(IRubyObject) ident(difference_minutes) operator(=) ident(absolute_difference)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(/)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(60)operator(\))operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(round)delimiter(")>operator(\))operator(;) + ident(tz) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(%s%02d:%02d)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(%)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArrayNoCopy)operator(()keyword(new) ident(IRubyObject)type([])operator({)ident(difference_sign)operator(,)ident(difference_minutes)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(/)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(60)operator(\))operator(\))operator(,)ident(difference_minutes)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(%)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()integer(60)operator(\))operator(\))operator(})operator(\))operator(\))operator(;) + operator(}) + ident(IRubyObject) ident(standard) operator(=) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(strftime)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(%Y-%m-%d %H:%M:%S)delimiter(")>operator(\))operator(\))operator(;) + keyword(if)operator(()ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(usec)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(nonzero?)delimiter(")>operator(\))operator(.)ident(isTrue)operator(()operator(\))operator(\)) operator({) + ident(standard) operator(=) ident(standard)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(OP_PLUS)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(.%06d)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(%)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(usec)delimiter(")>operator(\))operator(\))operator(\))operator(\))operator(;) + operator(}) + ident(standard) operator(=) ident(standard)operator(.)ident(callMethod)operator(()ident(context)operator(,)ident(MethodIndex)operator(.)ident(OP_PLUS)operator(,) string<delimiter(")content(+)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content( %s)delimiter(")>operator(\))operator(.)ident(callMethod)operator(()ident(context)operator(,)string<delimiter(")content(%)delimiter(")>operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(tz)operator(\))operator(\))operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(standard)operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Date)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLDateMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(date_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_S)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(TrueClass)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLTrueMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(true_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_S)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(taguri)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(true_taguri)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(tag:yaml.org,2002:bool)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(FalseClass)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLFalseMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(false_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,) string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) ident(MethodIndex)operator(.)ident(TO_S)operator(,) string<delimiter(")content(to_s)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(taguri)delimiter(")>operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(false_taguri)operator(()ident(IRubyObject) ident(self)operator(\)) operator({) + keyword(return) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")content(tag:yaml.org,2002:bool)delimiter(")>operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(NilClass)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(YAMLNilMethods) operator({) + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_yaml_node)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(nil_to_yaml_node)operator(()ident(IRubyObject) ident(self)operator(,) ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(ThreadContext) ident(context) operator(=) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(;) + keyword(return) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(arg)operator(,)string<delimiter(")content(scalar)delimiter(")>operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(taguri)delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()string<delimiter(")delimiter(")>operator(\))operator(,) ident(self)operator(.)ident(callMethod)operator(()ident(context)operator(,) string<delimiter(")content(to_yaml_style)delimiter(")>operator(\))operator(\))operator(;) + operator(}) + operator(}) +operator(})comment(// RubyYAML) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2006 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(java.io.InputStream)operator(;) +keyword(import) include(java.io.IOException)operator(;) + +keyword(import) include(java.util.List)operator(;) +keyword(import) include(java.util.ArrayList)operator(;) + +keyword(import) include(java.util.zip.GZIPInputStream)operator(;) +keyword(import) include(java.util.zip.GZIPOutputStream)operator(;) +keyword(import) include(org.jruby.anno.FrameField)operator(;) +keyword(import) include(org.jruby.anno.JRubyMethod)operator(;) +keyword(import) include(org.jruby.anno.JRubyClass)operator(;) +keyword(import) include(org.jruby.anno.JRubyModule)operator(;) + +keyword(import) include(org.jruby.exceptions.RaiseException)operator(;) +keyword(import) include(org.jruby.javasupport.util.RuntimeHelpers)operator(;) +keyword(import) include(org.jruby.runtime.Arity)operator(;) + +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.ObjectAllocator)operator(;) +keyword(import) include(org.jruby.runtime.ThreadContext)operator(;) +keyword(import) include(org.jruby.runtime.Visibility)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) + +keyword(import) include(org.jruby.util.IOInputStream)operator(;) +keyword(import) include(org.jruby.util.IOOutputStream)operator(;) +keyword(import) include(org.jruby.util.CRC32Ext)operator(;) +keyword(import) include(org.jruby.util.Adler32Ext)operator(;) +keyword(import) include(org.jruby.util.ZlibInflate)operator(;) +keyword(import) include(org.jruby.util.ZlibDeflate)operator(;) + +keyword(import) include(org.jruby.util.ByteList)operator(;) + +annotation(@JRubyModule)operator(()ident(name)operator(=)string<delimiter(")content(Zlib)delimiter(")>operator(\)) +directive(public) type(class) class(RubyZlib) operator({) + comment(/** Create the Zlib module and add it to the Ruby runtime. + * + */) + directive(public) directive(static) ident(RubyModule) ident(createZlibModule)operator(()ident(Ruby) ident(runtime)operator(\)) operator({) + ident(RubyModule) ident(result) operator(=) ident(runtime)operator(.)ident(defineModule)operator(()string<delimiter(")content(Zlib)delimiter(")>operator(\))operator(;) + + ident(RubyClass) ident(gzfile) operator(=) ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(GzipFile)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(RubyGzipFile)operator(.)ident(GZIPFILE_ALLOCATOR)operator(\))operator(;) + ident(gzfile)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyGzipFile)operator(.)ident(class)operator(\))operator(;) + + ident(RubyClass) ident(gzreader) operator(=) ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(GzipReader)delimiter(")>operator(,) ident(gzfile)operator(,) ident(RubyGzipReader)operator(.)ident(GZIPREADER_ALLOCATOR)operator(\))operator(;) + ident(gzreader)operator(.)ident(includeModule)operator(()ident(runtime)operator(.)ident(getEnumerable)operator(()operator(\))operator(\))operator(;) + ident(gzreader)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyGzipReader)operator(.)ident(class)operator(\))operator(;) + + ident(RubyClass) ident(standardError) operator(=) ident(runtime)operator(.)ident(getStandardError)operator(()operator(\))operator(;) + ident(RubyClass) ident(zlibError) operator(=) ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Error)delimiter(")>operator(,) ident(standardError)operator(,) ident(standardError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(gzreader)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Error)delimiter(")>operator(,) ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + + ident(RubyClass) ident(gzwriter) operator(=) ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(GzipWriter)delimiter(")>operator(,) ident(gzfile)operator(,) ident(RubyGzipWriter)operator(.)ident(GZIPWRITER_ALLOCATOR)operator(\))operator(;) + ident(gzwriter)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyGzipWriter)operator(.)ident(class)operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(ZLIB_VERSION)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(1.2.1)delimiter(")>operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(VERSION)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(0.6.0)delimiter(")>operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(BINARY)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(ASCII)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(UNKNOWN)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(2)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(DEF_MEM_LEVEL)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(8)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MAX_MEM_LEVEL)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(9)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_UNIX)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(3)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_UNKNOWN)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(255)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_CODE)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(11)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_ZSYSTEM)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(8)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_VMCMS)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(4)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_VMS)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(2)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_RISCOS)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(13)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_MACOS)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(7)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_OS2)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(6)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_AMIGA)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_QDOS)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(12)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_WIN32)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(11)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_ATARI)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(5)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_MSDOS)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_CPM)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(9)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(OS_TOPS20)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(10)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(DEFAULT_STRATEGY)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(FILTERED)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(HUFFMAN_ONLY)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(2)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(NO_FLUSH)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(SYNC_FLUSH)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(2)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(FULL_FLUSH)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(3)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(FINISH)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(4)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(NO_COMPRESSION)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(0)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(BEST_SPEED)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(1)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(DEFAULT_COMPRESSION)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()operator(-)integer(1)operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(BEST_COMPRESSION)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(9)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineConstant)operator(()string<delimiter(")content(MAX_WBITS)delimiter(")>operator(,)ident(runtime)operator(.)ident(newFixnum)operator(()integer(15)operator(\))operator(\))operator(;) + + ident(result)operator(.)ident(defineAnnotatedMethods)operator(()ident(RubyZlib)operator(.)ident(class)operator(\))operator(;) + + ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(StreamEnd)delimiter(")>operator(,)ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(StreamError)delimiter(")>operator(,)ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(BufError)delimiter(")>operator(,)ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(NeedDict)delimiter(")>operator(,)ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(MemError)delimiter(")>operator(,)ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(VersionError)delimiter(")>operator(,)ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(DataError)delimiter(")>operator(,)ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + + ident(RubyClass) ident(gzError) operator(=) ident(gzfile)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Error)delimiter(")>operator(,)ident(zlibError)operator(,) ident(zlibError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(gzfile)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(CRCError)delimiter(")>operator(,)ident(gzError)operator(,) ident(gzError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(gzfile)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(NoFooter)delimiter(")>operator(,)ident(gzError)operator(,) ident(gzError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + ident(gzfile)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(LengthError)delimiter(")>operator(,)ident(gzError)operator(,) ident(gzError)operator(.)ident(getAllocator)operator(()operator(\))operator(\))operator(;) + + comment(// ZStream actually *isn't* allocatable) + ident(RubyClass) ident(zstream) operator(=) ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(ZStream)delimiter(")>operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(,) ident(ObjectAllocator)operator(.)ident(NOT_ALLOCATABLE_ALLOCATOR)operator(\))operator(;) + ident(zstream)operator(.)ident(defineAnnotatedMethods)operator(()ident(ZStream)operator(.)ident(class)operator(\))operator(;) + ident(zstream)operator(.)ident(undefineMethod)operator(()string<delimiter(")content(new)delimiter(")>operator(\))operator(;) + + ident(RubyClass) ident(infl) operator(=) ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Inflate)delimiter(")>operator(,) ident(zstream)operator(,) ident(Inflate)operator(.)ident(INFLATE_ALLOCATOR)operator(\))operator(;) + ident(infl)operator(.)ident(defineAnnotatedMethods)operator(()ident(Inflate)operator(.)ident(class)operator(\))operator(;) + + ident(RubyClass) ident(defl) operator(=) ident(result)operator(.)ident(defineClassUnder)operator(()string<delimiter(")content(Deflate)delimiter(")>operator(,) ident(zstream)operator(,) ident(Deflate)operator(.)ident(DEFLATE_ALLOCATOR)operator(\))operator(;) + ident(defl)operator(.)ident(defineAnnotatedMethods)operator(()ident(Deflate)operator(.)ident(class)operator(\))operator(;) + + ident(runtime)operator(.)ident(getKernel)operator(()operator(\))operator(.)ident(callMethod)operator(()ident(runtime)operator(.)ident(getCurrentContext)operator(()operator(\))operator(,)string<delimiter(")content(require)delimiter(")>operator(,)ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(stringio)delimiter(")>operator(\))operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(StandardError)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::StreamEnd)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(StreamEnd) directive(extends) type(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::StreamError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(StreamError) directive(extends) type(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::BufError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(BufError) directive(extends) type(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::NeedDict)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(NeedDict) directive(extends) type(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::MemError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(MemError) directive(extends) type(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::VersionError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(VersionError) directive(extends) type(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::DataError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(DataError) directive(extends) type(Error) operator({)operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(zlib_version)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(zlib_version)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyModule)operator(\))ident(recv)operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(ZLIB_VERSION)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(version)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(version)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + keyword(return) operator(()operator(()ident(RubyModule)operator(\))ident(recv)operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(VERSION)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(crc32)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(crc32)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + ident(args) operator(=) ident(Arity)operator(.)ident(scanArgs)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(0)operator(,)integer(2)operator(\))operator(;) + type(long) ident(crc) operator(=) integer(0)operator(;) + ident(ByteList) ident(bytes) operator(=) keyword(null)operator(;) + + keyword(if) operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(bytes) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(crc) operator(=) ident(RubyNumeric)operator(.)ident(num2long)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + + ident(CRC32Ext) ident(ext) operator(=) keyword(new) ident(CRC32Ext)operator(()operator(()type(int)operator(\))ident(crc)operator(\))operator(;) + keyword(if) operator(()ident(bytes) operator(!=) keyword(null)operator(\)) operator({) + ident(ext)operator(.)ident(update)operator(()ident(bytes)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(begin)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(ext)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(adler32)delimiter(")>operator(,) ident(optional) operator(=) integer(2)operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(adler32)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + ident(args) operator(=) ident(Arity)operator(.)ident(scanArgs)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(0)operator(,)integer(2)operator(\))operator(;) + type(int) ident(adler) operator(=) integer(1)operator(;) + ident(ByteList) ident(bytes) operator(=) keyword(null)operator(;) + keyword(if) operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(bytes) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) ident(adler) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + + ident(Adler32Ext) ident(ext) operator(=) keyword(new) ident(Adler32Ext)operator(()ident(adler)operator(\))operator(;) + keyword(if) operator(()ident(bytes) operator(!=) keyword(null)operator(\)) operator({) + ident(ext)operator(.)ident(update)operator(()ident(bytes)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(begin)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) comment(// it's safe since adler.update doesn't modify the array) + operator(}) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(ext)operator(.)ident(getValue)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(private) directive(final) directive(static) type(long)type([]) ident(crctab) operator(=) keyword(new) type(long)type([])operator({) + integer(0L)operator(,) integer(1996959894L)operator(,) integer(3993919788L)operator(,) integer(2567524794L)operator(,) integer(124634137L)operator(,) integer(1886057615L)operator(,) integer(3915621685L)operator(,) integer(2657392035L)operator(,) integer(249268274L)operator(,) integer(2044508324L)operator(,) integer(3772115230L)operator(,) integer(2547177864L)operator(,) integer(162941995L)operator(,) + integer(2125561021L)operator(,) integer(3887607047L)operator(,) integer(2428444049L)operator(,) integer(498536548L)operator(,) integer(1789927666L)operator(,) integer(4089016648L)operator(,) integer(2227061214L)operator(,) integer(450548861L)operator(,) integer(1843258603L)operator(,) integer(4107580753L)operator(,) integer(2211677639L)operator(,) integer(325883990L)operator(,) + integer(1684777152L)operator(,) integer(4251122042L)operator(,) integer(2321926636L)operator(,) integer(335633487L)operator(,) integer(1661365465L)operator(,) integer(4195302755L)operator(,) integer(2366115317L)operator(,) integer(997073096L)operator(,) integer(1281953886L)operator(,) integer(3579855332L)operator(,) integer(2724688242L)operator(,) integer(1006888145L)operator(,) + integer(1258607687L)operator(,) integer(3524101629L)operator(,) integer(2768942443L)operator(,) integer(901097722L)operator(,) integer(1119000684L)operator(,) integer(3686517206L)operator(,) integer(2898065728L)operator(,) integer(853044451L)operator(,) integer(1172266101L)operator(,) integer(3705015759L)operator(,) integer(2882616665L)operator(,) integer(651767980L)operator(,) + integer(1373503546L)operator(,) integer(3369554304L)operator(,) integer(3218104598L)operator(,) integer(565507253L)operator(,) integer(1454621731L)operator(,) integer(3485111705L)operator(,) integer(3099436303L)operator(,) integer(671266974L)operator(,) integer(1594198024L)operator(,) integer(3322730930L)operator(,) integer(2970347812L)operator(,) integer(795835527L)operator(,) + integer(1483230225L)operator(,) integer(3244367275L)operator(,) integer(3060149565L)operator(,) integer(1994146192L)operator(,) integer(31158534L)operator(,) integer(2563907772L)operator(,) integer(4023717930L)operator(,) integer(1907459465L)operator(,) integer(112637215L)operator(,) integer(2680153253L)operator(,) integer(3904427059L)operator(,) integer(2013776290L)operator(,) + integer(251722036L)operator(,) integer(2517215374L)operator(,) integer(3775830040L)operator(,) integer(2137656763L)operator(,) integer(141376813L)operator(,) integer(2439277719L)operator(,) integer(3865271297L)operator(,) integer(1802195444L)operator(,) integer(476864866L)operator(,) integer(2238001368L)operator(,) integer(4066508878L)operator(,) integer(1812370925L)operator(,) + integer(453092731L)operator(,) integer(2181625025L)operator(,) integer(4111451223L)operator(,) integer(1706088902L)operator(,) integer(314042704L)operator(,) integer(2344532202L)operator(,) integer(4240017532L)operator(,) integer(1658658271L)operator(,) integer(366619977L)operator(,) integer(2362670323L)operator(,) integer(4224994405L)operator(,) integer(1303535960L)operator(,) + integer(984961486L)operator(,) integer(2747007092L)operator(,) integer(3569037538L)operator(,) integer(1256170817L)operator(,) integer(1037604311L)operator(,) integer(2765210733L)operator(,) integer(3554079995L)operator(,) integer(1131014506L)operator(,) integer(879679996L)operator(,) integer(2909243462L)operator(,) integer(3663771856L)operator(,) integer(1141124467L)operator(,) + integer(855842277L)operator(,) integer(2852801631L)operator(,) integer(3708648649L)operator(,) integer(1342533948L)operator(,) integer(654459306L)operator(,) integer(3188396048L)operator(,) integer(3373015174L)operator(,) integer(1466479909L)operator(,) integer(544179635L)operator(,) integer(3110523913L)operator(,) integer(3462522015L)operator(,) integer(1591671054L)operator(,) + integer(702138776L)operator(,) integer(2966460450L)operator(,) integer(3352799412L)operator(,) integer(1504918807L)operator(,) integer(783551873L)operator(,) integer(3082640443L)operator(,) integer(3233442989L)operator(,) integer(3988292384L)operator(,) integer(2596254646L)operator(,) integer(62317068L)operator(,) integer(1957810842L)operator(,) integer(3939845945L)operator(,) + integer(2647816111L)operator(,) integer(81470997L)operator(,) integer(1943803523L)operator(,) integer(3814918930L)operator(,) integer(2489596804L)operator(,) integer(225274430L)operator(,) integer(2053790376L)operator(,) integer(3826175755L)operator(,) integer(2466906013L)operator(,) integer(167816743L)operator(,) integer(2097651377L)operator(,) integer(4027552580L)operator(,) + integer(2265490386L)operator(,) integer(503444072L)operator(,) integer(1762050814L)operator(,) integer(4150417245L)operator(,) integer(2154129355L)operator(,) integer(426522225L)operator(,) integer(1852507879L)operator(,) integer(4275313526L)operator(,) integer(2312317920L)operator(,) integer(282753626L)operator(,) integer(1742555852L)operator(,) integer(4189708143L)operator(,) + integer(2394877945L)operator(,) integer(397917763L)operator(,) integer(1622183637L)operator(,) integer(3604390888L)operator(,) integer(2714866558L)operator(,) integer(953729732L)operator(,) integer(1340076626L)operator(,) integer(3518719985L)operator(,) integer(2797360999L)operator(,) integer(1068828381L)operator(,) integer(1219638859L)operator(,) integer(3624741850L)operator(,) + integer(2936675148L)operator(,) integer(906185462L)operator(,) integer(1090812512L)operator(,) integer(3747672003L)operator(,) integer(2825379669L)operator(,) integer(829329135L)operator(,) integer(1181335161L)operator(,) integer(3412177804L)operator(,) integer(3160834842L)operator(,) integer(628085408L)operator(,) integer(1382605366L)operator(,) integer(3423369109L)operator(,) + integer(3138078467L)operator(,) integer(570562233L)operator(,) integer(1426400815L)operator(,) integer(3317316542L)operator(,) integer(2998733608L)operator(,) integer(733239954L)operator(,) integer(1555261956L)operator(,) integer(3268935591L)operator(,) integer(3050360625L)operator(,) integer(752459403L)operator(,) integer(1541320221L)operator(,) integer(2607071920L)operator(,) + integer(3965973030L)operator(,) integer(1969922972L)operator(,) integer(40735498L)operator(,) integer(2617837225L)operator(,) integer(3943577151L)operator(,) integer(1913087877L)operator(,) integer(83908371L)operator(,) integer(2512341634L)operator(,) integer(3803740692L)operator(,) integer(2075208622L)operator(,) integer(213261112L)operator(,) integer(2463272603L)operator(,) + integer(3855990285L)operator(,) integer(2094854071L)operator(,) integer(198958881L)operator(,) integer(2262029012L)operator(,) integer(4057260610L)operator(,) integer(1759359992L)operator(,) integer(534414190L)operator(,) integer(2176718541L)operator(,) integer(4139329115L)operator(,) integer(1873836001L)operator(,) integer(414664567L)operator(,) integer(2282248934L)operator(,) + integer(4279200368L)operator(,) integer(1711684554L)operator(,) integer(285281116L)operator(,) integer(2405801727L)operator(,) integer(4167216745L)operator(,) integer(1634467795L)operator(,) integer(376229701L)operator(,) integer(2685067896L)operator(,) integer(3608007406L)operator(,) integer(1308918612L)operator(,) integer(956543938L)operator(,) integer(2808555105L)operator(,) + integer(3495958263L)operator(,) integer(1231636301L)operator(,) integer(1047427035L)operator(,) integer(2932959818L)operator(,) integer(3654703836L)operator(,) integer(1088359270L)operator(,) integer(936918000L)operator(,) integer(2847714899L)operator(,) integer(3736837829L)operator(,) integer(1202900863L)operator(,) integer(817233897L)operator(,) integer(3183342108L)operator(,) + integer(3401237130L)operator(,) integer(1404277552L)operator(,) integer(615818150L)operator(,) integer(3134207493L)operator(,) integer(3453421203L)operator(,) integer(1423857449L)operator(,) integer(601450431L)operator(,) integer(3009837614L)operator(,) integer(3294710456L)operator(,) integer(1567103746L)operator(,) integer(711928724L)operator(,) integer(3020668471L)operator(,) + integer(3272380065L)operator(,) integer(1510334235L)operator(,) integer(755167117)operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(crc_table)delimiter(")>operator(,) ident(module) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(crc_table)operator(()ident(IRubyObject) ident(recv)operator(\)) operator({) + type(List)operator(<)ident(IRubyObject)operator(>) ident(ll) operator(=) keyword(new) type(ArrayList)operator(<)ident(IRubyObject)operator(>)operator(()ident(crctab)operator(.)ident(length)operator(\))operator(;) + keyword(for)operator(()type(int) ident(i)operator(=)integer(0)operator(;)ident(i)operator(<)ident(crctab)operator(.)ident(length)operator(;)ident(i)operator(++)operator(\)) operator({) + ident(ll)operator(.)ident(add)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(crctab)operator([)ident(i)operator(])operator(\))operator(\))operator(;) + operator(}) + keyword(return) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(ll)operator(\))operator(;) + operator(}) + + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::ZStream)delimiter(")>operator(\)) + directive(public) directive(static) directive(abstract) type(class) class(ZStream) directive(extends) ident(RubyObject) operator({) + directive(protected) type(boolean) ident(closed) operator(=) keyword(false)operator(;) + directive(protected) type(boolean) ident(ended) operator(=) keyword(false)operator(;) + directive(protected) type(boolean) ident(finished) operator(=) keyword(false)operator(;) + + directive(protected) directive(abstract) type(int) ident(internalTotalOut)operator(()operator(\))operator(;) + directive(protected) directive(abstract) type(boolean) ident(internalStreamEndP)operator(()operator(\))operator(;) + directive(protected) directive(abstract) type(void) ident(internalEnd)operator(()operator(\))operator(;) + directive(protected) directive(abstract) type(void) ident(internalReset)operator(()operator(\))operator(;) + directive(protected) directive(abstract) type(int) ident(internalAdler)operator(()operator(\))operator(;) + directive(protected) directive(abstract) ident(IRubyObject) ident(internalFinish)operator(()operator(\)) directive(throws) type(Exception)operator(;) + directive(protected) directive(abstract) type(int) ident(internalTotalIn)operator(()operator(\))operator(;) + directive(protected) directive(abstract) type(void) ident(internalClose)operator(()operator(\))operator(;) + + directive(public) ident(ZStream)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(flust_next_out)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(flush_next_out)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(total_out)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(total_out)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(internalTotalOut)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(stream_end?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(stream_end_p)operator(()operator(\)) operator({) + keyword(return) ident(internalStreamEndP)operator(()operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(data_type)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(data_type)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetModule)operator(()string<delimiter(")content(Zlib)delimiter(")>operator(\))operator(.)ident(fastGetConstant)operator(()string<delimiter(")content(UNKNOWN)delimiter(")>operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(closed?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(closed_p)operator(()operator(\)) operator({) + keyword(return) ident(closed) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ended?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(ended_p)operator(()operator(\)) operator({) + keyword(return) ident(ended) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(end)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(end)operator(()operator(\)) operator({) + keyword(if)operator(()operator(!)ident(ended)operator(\)) operator({) + ident(internalEnd)operator(()operator(\))operator(;) + ident(ended) operator(=) keyword(true)operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(reset)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(reset)operator(()operator(\)) operator({) + ident(internalReset)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(avail_out)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(avail_out)operator(()operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(avail_out=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_avail_out)operator(()ident(IRubyObject) ident(p1)operator(\)) operator({) + keyword(return) ident(p1)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(adler)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(adler)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(internalAdler)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(finish)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(finish)operator(()operator(\)) directive(throws) type(Exception) operator({) + keyword(if)operator(()operator(!)ident(finished)operator(\)) operator({) + ident(finished) operator(=) keyword(true)operator(;) + keyword(return) ident(internalFinish)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(avail_in)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(avail_in)operator(()operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(flush_next_in)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(flush_next_in)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(total_in)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(total_in)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(internalTotalIn)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(finished?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(finished_p)operator(()operator(\)) operator({) + keyword(return) ident(finished) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) operator({) + keyword(if)operator(()operator(!)ident(closed)operator(\)) operator({) + ident(internalClose)operator(()operator(\))operator(;) + ident(closed) operator(=) keyword(true)operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::Inflate)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::ZStream)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Inflate) directive(extends) ident(ZStream) operator({) + directive(protected) directive(static) directive(final) ident(ObjectAllocator) ident(INFLATE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(Inflate)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inflate)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(s_inflate)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(string)operator(\)) directive(throws) type(Exception) operator({) + keyword(return) ident(ZlibInflate)operator(.)ident(s_inflate)operator(()ident(recv)operator(,)ident(string)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) + + directive(public) ident(Inflate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + directive(private) ident(ZlibInflate) ident(infl)operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(_initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + ident(infl) operator(=) keyword(new) ident(ZlibInflate)operator(()local_variable(this)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(append)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + ident(infl)operator(.)ident(append)operator(()ident(arg)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sync_point?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(sync_point_p)operator(()operator(\)) operator({) + keyword(return) ident(infl)operator(.)ident(sync_point)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(set_dictionary)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_dictionary)operator(()ident(IRubyObject) ident(arg)operator(\)) directive(throws) type(Exception) operator({) + keyword(return) ident(infl)operator(.)ident(set_dictionary)operator(()ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(inflate)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(inflate)operator(()ident(IRubyObject) ident(string)operator(\)) directive(throws) type(Exception) operator({) + keyword(return) ident(infl)operator(.)ident(inflate)operator(()ident(string)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sync)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(sync)operator(()ident(IRubyObject) ident(string)operator(\)) operator({) + keyword(return) ident(infl)operator(.)ident(sync)operator(()ident(string)operator(\))operator(;) + operator(}) + + directive(protected) type(int) ident(internalTotalOut)operator(()operator(\)) operator({) + keyword(return) ident(infl)operator(.)ident(getInflater)operator(()operator(\))operator(.)ident(getTotalOut)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(boolean) ident(internalStreamEndP)operator(()operator(\)) operator({) + keyword(return) ident(infl)operator(.)ident(getInflater)operator(()operator(\))operator(.)ident(finished)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(void) ident(internalEnd)operator(()operator(\)) operator({) + ident(infl)operator(.)ident(getInflater)operator(()operator(\))operator(.)ident(end)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(void) ident(internalReset)operator(()operator(\)) operator({) + ident(infl)operator(.)ident(getInflater)operator(()operator(\))operator(.)ident(reset)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(int) ident(internalAdler)operator(()operator(\)) operator({) + keyword(return) ident(infl)operator(.)ident(getInflater)operator(()operator(\))operator(.)ident(getAdler)operator(()operator(\))operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(internalFinish)operator(()operator(\)) directive(throws) type(Exception) operator({) + ident(infl)operator(.)ident(finish)operator(()operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finished_p)operator(()operator(\)) operator({) + keyword(return) ident(infl)operator(.)ident(getInflater)operator(()operator(\))operator(.)ident(finished)operator(()operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(int) ident(internalTotalIn)operator(()operator(\)) operator({) + keyword(return) ident(infl)operator(.)ident(getInflater)operator(()operator(\))operator(.)ident(getTotalIn)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(void) ident(internalClose)operator(()operator(\)) operator({) + ident(infl)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::Deflate)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::ZStream)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Deflate) directive(extends) ident(ZStream) operator({) + directive(protected) directive(static) directive(final) ident(ObjectAllocator) ident(DEFLATE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(Deflate)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(deflate)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(s_deflate)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + ident(args) operator(=) ident(Arity)operator(.)ident(scanArgs)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(1)operator(,)integer(1)operator(\))operator(;) + type(int) ident(level) operator(=) operator(-)integer(1)operator(;) + keyword(if)operator(()operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(level) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(ZlibDeflate)operator(.)ident(s_deflate)operator(()ident(recv)operator(,)ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(,)ident(level)operator(\))operator(;) + operator(}) + + directive(public) ident(Deflate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + directive(private) ident(ZlibDeflate) ident(defl)operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(optional) operator(=) integer(4)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(_initialize)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + ident(args) operator(=) ident(Arity)operator(.)ident(scanArgs)operator(()ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(0)operator(,)integer(4)operator(\))operator(;) + type(int) ident(level) operator(=) operator(-)integer(1)operator(;) + type(int) ident(window_bits) operator(=) integer(15)operator(;) + type(int) ident(memlevel) operator(=) integer(8)operator(;) + type(int) ident(strategy) operator(=) integer(0)operator(;) + keyword(if)operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(level) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + keyword(if)operator(()operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(window_bits) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + keyword(if)operator(()operator(!)ident(args)operator([)integer(2)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(memlevel) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(2)operator(])operator(\))operator(;) + operator(}) + keyword(if)operator(()operator(!)ident(args)operator([)integer(3)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(strategy) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(3)operator(])operator(\))operator(;) + operator(}) + ident(defl) operator(=) keyword(new) ident(ZlibDeflate)operator(()local_variable(this)operator(,)ident(level)operator(,)ident(window_bits)operator(,)ident(memlevel)operator(,)ident(strategy)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(<<)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(append)operator(()ident(IRubyObject) ident(arg)operator(\)) directive(throws) type(Exception) operator({) + ident(defl)operator(.)ident(append)operator(()ident(arg)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(params)delimiter(")>operator(,) ident(required) operator(=) integer(2)operator(\)) + directive(public) ident(IRubyObject) ident(params)operator(()ident(IRubyObject) ident(level)operator(,) ident(IRubyObject) ident(strategy)operator(\)) operator({) + ident(defl)operator(.)ident(params)operator(()ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(level)operator(\))operator(,)ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(strategy)operator(\))operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(set_dictionary)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_dictionary)operator(()ident(IRubyObject) ident(arg)operator(\)) directive(throws) type(Exception) operator({) + keyword(return) ident(defl)operator(.)ident(set_dictionary)operator(()ident(arg)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(flush)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(flush)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + type(int) ident(flush) operator(=) integer(2)operator(;) comment(// SYNC_FLUSH) + keyword(if)operator(()ident(args)operator(.)ident(length) operator(==) integer(1)operator(\)) operator({) + keyword(if)operator(()operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(flush) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(defl)operator(.)ident(flush)operator(()ident(flush)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(deflate)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(deflate)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(Exception) operator({) + ident(args) operator(=) ident(Arity)operator(.)ident(scanArgs)operator(()ident(getRuntime)operator(()operator(\))operator(,)ident(args)operator(,)integer(1)operator(,)integer(1)operator(\))operator(;) + type(int) ident(flush) operator(=) integer(0)operator(;) comment(// NO_FLUSH) + keyword(if)operator(()operator(!)ident(args)operator([)integer(1)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(flush) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(1)operator(])operator(\))operator(;) + operator(}) + keyword(return) ident(defl)operator(.)ident(deflate)operator(()ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(,)ident(flush)operator(\))operator(;) + operator(}) + + directive(protected) type(int) ident(internalTotalOut)operator(()operator(\)) operator({) + keyword(return) ident(defl)operator(.)ident(getDeflater)operator(()operator(\))operator(.)ident(getTotalOut)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(boolean) ident(internalStreamEndP)operator(()operator(\)) operator({) + keyword(return) ident(defl)operator(.)ident(getDeflater)operator(()operator(\))operator(.)ident(finished)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(void) ident(internalEnd)operator(()operator(\)) operator({) + ident(defl)operator(.)ident(getDeflater)operator(()operator(\))operator(.)ident(end)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(void) ident(internalReset)operator(()operator(\)) operator({) + ident(defl)operator(.)ident(getDeflater)operator(()operator(\))operator(.)ident(reset)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(int) ident(internalAdler)operator(()operator(\)) operator({) + keyword(return) ident(defl)operator(.)ident(getDeflater)operator(()operator(\))operator(.)ident(getAdler)operator(()operator(\))operator(;) + operator(}) + + directive(protected) ident(IRubyObject) ident(internalFinish)operator(()operator(\)) directive(throws) type(Exception) operator({) + keyword(return) ident(defl)operator(.)ident(finish)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(int) ident(internalTotalIn)operator(()operator(\)) operator({) + keyword(return) ident(defl)operator(.)ident(getDeflater)operator(()operator(\))operator(.)ident(getTotalIn)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(void) ident(internalClose)operator(()operator(\)) operator({) + ident(defl)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::GzipFile)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(RubyGzipFile) directive(extends) ident(RubyObject) operator({) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::GzipFile::Error)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::GzipFile::CRCError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::GzipFile::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(CRCError) directive(extends) type(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::GzipFile::NoFooter)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::GzipFile::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(NoFooter) directive(extends) type(Error) operator({)operator(}) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::GzipFile::LengthError)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::GzipFile::Error)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(LengthError) directive(extends) type(Error) operator({)operator(}) + + directive(private) directive(static) ident(IRubyObject) ident(wrap)operator(()ident(ThreadContext) ident(context)operator(,) ident(RubyGzipFile) ident(instance)operator(,) + ident(IRubyObject) ident(io)operator(,) ident(Block) ident(block)operator(\)) directive(throws) type(IOException) operator({) + keyword(if) operator(()ident(block)operator(.)ident(isGiven)operator(()operator(\))operator(\)) operator({) + keyword(try) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(instance)operator(\))operator(;) + + keyword(return) ident(instance)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) keyword(finally) operator({) + keyword(if) operator(()operator(!)ident(instance)operator(.)ident(isClosed)operator(()operator(\))operator(\)) ident(instance)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + operator(}) + + keyword(return) ident(io)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(wrap)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(wrap)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(io)operator(,) ident(Block) ident(block)operator(\)) directive(throws) type(IOException) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyGzipFile) ident(instance)operator(;) + + comment(// TODO: People extending GzipWriter/reader will break. Find better way here.) + keyword(if) operator(()ident(recv) operator(==) ident(runtime)operator(.)ident(getModule)operator(()string<delimiter(")content(Zlib)delimiter(")>operator(\))operator(.)ident(getClass)operator(()string<delimiter(")content(GzipWriter)delimiter(")>operator(\))operator(\)) operator({) + ident(instance) operator(=) ident(RubyGzipWriter)operator(.)ident(newGzipWriter)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(io) operator(})operator(,) ident(block)operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(instance) operator(=) ident(RubyGzipReader)operator(.)ident(newInstance)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([]) operator({) ident(io) operator(})operator(,) ident(block)operator(\))operator(;) + operator(}) + + keyword(return) ident(wrap)operator(()ident(context)operator(,) ident(instance)operator(,) ident(io)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(protected) directive(static) directive(final) ident(ObjectAllocator) ident(GZIPFILE_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyGzipFile)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyGzipFile) ident(newInstance)operator(()ident(IRubyObject) ident(recv)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(klass) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + + ident(RubyGzipFile) ident(result) operator(=) operator(()ident(RubyGzipFile)operator(\)) ident(klass)operator(.)ident(allocate)operator(()operator(\))operator(;) + + ident(result)operator(.)ident(callInit)operator(()keyword(new) ident(IRubyObject)operator([)integer(0)operator(])operator(,) ident(block)operator(\))operator(;) + + keyword(return) ident(result)operator(;) + operator(}) + + directive(protected) type(boolean) ident(closed) operator(=) keyword(false)operator(;) + directive(protected) type(boolean) ident(finished) operator(=) keyword(false)operator(;) + directive(private) type(int) ident(os_code) operator(=) integer(255)operator(;) + directive(private) type(int) ident(level) operator(=) operator(-)integer(1)operator(;) + directive(private) type(String) ident(orig_name)operator(;) + directive(private) type(String) ident(comment)operator(;) + directive(protected) ident(IRubyObject) ident(realIo)operator(;) + directive(private) ident(IRubyObject) ident(mtime)operator(;) + + directive(public) ident(RubyGzipFile)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + ident(mtime) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(os_code)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(os_code)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(os_code)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(closed?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(closed_p)operator(()operator(\)) operator({) + keyword(return) ident(closed) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + directive(protected) type(boolean) ident(isClosed)operator(()operator(\)) operator({) + keyword(return) ident(closed)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(orig_name)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(orig_name)operator(()operator(\)) operator({) + keyword(return) ident(orig_name) operator(==) keyword(null) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(orig_name)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(to_io)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(to_io)operator(()operator(\)) operator({) + keyword(return) ident(realIo)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(comment)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(comment)operator(()operator(\)) operator({) + keyword(return) ident(comment) operator(==) keyword(null) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(newString)operator(()ident(comment)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(crc)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(crc)operator(()operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(mtime)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(mtime)operator(()operator(\)) operator({) + keyword(return) ident(mtime)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sync)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(sync)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(finish)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(finish)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(if) operator(()operator(!)ident(finished)operator(\)) operator({) + comment(//io.finish(\);) + operator(}) + ident(finished) operator(=) keyword(true)operator(;) + keyword(return) ident(realIo)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(return) keyword(null)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(level)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(level)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(level)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(sync=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_sync)operator(()ident(IRubyObject) ident(ignored)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::GzipReader)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::GzipFile)delimiter(")>operator(,) ident(include)operator(=)string<delimiter(")content(Enumerable)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(RubyGzipReader) directive(extends) ident(RubyGzipFile) operator({) + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::GzipReader::Error)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::GzipReader)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(Error) operator({)operator(}) + directive(protected) directive(static) directive(final) ident(ObjectAllocator) ident(GZIPREADER_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyGzipReader)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyGzipReader) ident(newInstance)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(klass) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + ident(RubyGzipReader) ident(result) operator(=) operator(()ident(RubyGzipReader)operator(\))ident(klass)operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(result)operator(.)ident(callInit)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(open)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(open)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject) ident(filename)operator(,) ident(Block) ident(block)operator(\)) directive(throws) type(IOException) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(io) operator(=) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getFile)operator(()operator(\))operator(,) string<delimiter(")content(open)delimiter(")>operator(,) ident(filename)operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(rb)delimiter(")>operator(\))operator(\))operator(;) + ident(RubyGzipFile) ident(instance) operator(=) ident(newInstance)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([])operator({)ident(io)operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + + keyword(return) ident(RubyGzipFile)operator(.)ident(wrap)operator(()ident(context)operator(,) ident(instance)operator(,) ident(io)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyGzipReader)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + directive(private) type(int) ident(line)operator(;) + directive(private) type(InputStream) ident(io)operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize)operator(()ident(IRubyObject) ident(io)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + ident(realIo) operator(=) ident(io)operator(;) + keyword(try) operator({) + local_variable(this)operator(.)ident(io) operator(=) keyword(new) type(GZIPInputStream)operator(()keyword(new) ident(IOInputStream)operator(()ident(io)operator(\))operator(\))operator(;) + operator(}) keyword(catch) operator(()type(IOException) ident(e)operator(\)) operator({) + ident(Ruby) ident(runtime) operator(=) ident(io)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(RubyClass) ident(errorClass) operator(=) ident(runtime)operator(.)ident(fastGetModule)operator(()string<delimiter(")content(Zlib)delimiter(")>operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(GzipReader)delimiter(")>operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(Error)delimiter(")>operator(\))operator(;) + keyword(throw) keyword(new) ident(RaiseException)operator(()ident(RubyException)operator(.)ident(newException)operator(()ident(runtime)operator(,) ident(errorClass)operator(,) ident(e)operator(.)ident(getMessage)operator(()operator(\))operator(\))operator(\))operator(;) + operator(}) + + ident(line) operator(=) integer(1)operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(rewind)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(rewind)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lineno)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(lineno)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(line)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readline)delimiter(")>operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) ident(IRubyObject) ident(readline)operator(()ident(ThreadContext) ident(context)operator(\)) directive(throws) type(IOException) operator({) + ident(IRubyObject) ident(dst) operator(=) ident(gets)operator(()ident(context)operator(,) keyword(new) ident(IRubyObject)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(dst)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(dst)operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(internalGets)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(IOException) operator({) + ident(ByteList) ident(sep) operator(=) operator(()operator(()ident(RubyString)operator(\))ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($/)delimiter(")>operator(\))operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(sep) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(internalSepGets)operator(()ident(sep)operator(\))operator(;) + operator(}) + + directive(private) ident(IRubyObject) ident(internalSepGets)operator(()ident(ByteList) ident(sep)operator(\)) directive(throws) type(IOException) operator({) + ident(ByteList) ident(result) operator(=) keyword(new) ident(ByteList)operator(()operator(\))operator(;) + type(int) ident(ce) operator(=) ident(io)operator(.)ident(read)operator(()operator(\))operator(;) + keyword(while) operator(()ident(ce) operator(!=) operator(-)integer(1) operator(&&) ident(sep)operator(.)ident(indexOf)operator(()ident(ce)operator(\)) operator(==) operator(-)integer(1)operator(\)) operator({) + ident(result)operator(.)ident(append)operator(()operator(()type(byte)operator(\))ident(ce)operator(\))operator(;) + ident(ce) operator(=) ident(io)operator(.)ident(read)operator(()operator(\))operator(;) + operator(}) + ident(line)operator(++)operator(;) + ident(result)operator(.)ident(append)operator(()ident(sep)operator(\))operator(;) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,)ident(result)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(gets)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(writes) operator(=) ident(FrameField)operator(.)ident(LASTLINE)operator(\)) + directive(public) ident(IRubyObject) ident(gets)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(IOException) operator({) + ident(IRubyObject) ident(result) operator(=) ident(internalGets)operator(()ident(args)operator(\))operator(;) + keyword(if) operator(()operator(!)ident(result)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(context)operator(.)ident(getCurrentFrame)operator(()operator(\))operator(.)ident(setLastLine)operator(()ident(result)operator(\))operator(;) + operator(}) + keyword(return) ident(result)operator(;) + operator(}) + + directive(private) directive(final) directive(static) type(int) ident(BUFF_SIZE) operator(=) integer(4096)operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(read)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(read)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(IOException) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0) operator(||) ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(ByteList) ident(val) operator(=) keyword(new) ident(ByteList)operator(()integer(10)operator(\))operator(;) + type(byte)type([]) ident(buffer) operator(=) keyword(new) type(byte)operator([)ident(BUFF_SIZE)operator(])operator(;) + type(int) ident(read) operator(=) ident(io)operator(.)ident(read)operator(()ident(buffer)operator(\))operator(;) + keyword(while) operator(()ident(read) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(val)operator(.)ident(append)operator(()ident(buffer)operator(,)integer(0)operator(,)ident(read)operator(\))operator(;) + ident(read) operator(=) ident(io)operator(.)ident(read)operator(()ident(buffer)operator(\))operator(;) + operator(}) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,)ident(val)operator(\))operator(;) + operator(}) + + type(int) ident(len) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(;) + keyword(if) operator(()ident(len) operator(<) integer(0)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newArgumentError)operator(()string<delimiter(")content(negative length )delimiter(")> operator(+) ident(len) operator(+) string<delimiter(")content( given)delimiter(")>operator(\))operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(len) operator(>) integer(0)operator(\)) operator({) + type(byte)type([]) ident(buffer) operator(=) keyword(new) type(byte)operator([)ident(len)operator(])operator(;) + type(int) ident(toRead) operator(=) ident(len)operator(;) + type(int) ident(offset) operator(=) integer(0)operator(;) + type(int) ident(read) operator(=) integer(0)operator(;) + keyword(while) operator(()ident(toRead) operator(>) integer(0)operator(\)) operator({) + ident(read) operator(=) ident(io)operator(.)ident(read)operator(()ident(buffer)operator(,)ident(offset)operator(,)ident(toRead)operator(\))operator(;) + keyword(if) operator(()ident(read) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(break)operator(;) + operator(}) + ident(toRead) operator(-=) ident(read)operator(;) + ident(offset) operator(+=) ident(read)operator(;) + operator(}) comment(// hmm...) + keyword(return) ident(RubyString)operator(.)ident(newString)operator(()ident(getRuntime)operator(()operator(\))operator(,)keyword(new) ident(ByteList)operator(()ident(buffer)operator(,)integer(0)operator(,)ident(len)operator(-)ident(toRead)operator(,)keyword(false)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(RubyString)operator(.)ident(newEmptyString)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(lineno=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_lineno)operator(()ident(IRubyObject) ident(lineArg)operator(\)) operator({) + ident(line) operator(=) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(lineArg)operator(\))operator(;) + keyword(return) ident(lineArg)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pos)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(pos)operator(()operator(\)) operator({) + keyword(return) ident(RubyFixnum)operator(.)ident(zero)operator(()ident(getRuntime)operator(()operator(\))operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readchar)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(readchar)operator(()operator(\)) directive(throws) type(IOException) operator({) + type(int) ident(value) operator(=) ident(io)operator(.)ident(read)operator(()operator(\))operator(;) + keyword(if) operator(()ident(value) operator(==) operator(-)integer(1)operator(\)) operator({) + keyword(throw) ident(getRuntime)operator(()operator(\))operator(.)ident(newEOFError)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(getc)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(getc)operator(()operator(\)) directive(throws) type(IOException) operator({) + type(int) ident(value) operator(=) ident(io)operator(.)ident(read)operator(()operator(\))operator(;) + keyword(return) ident(value) operator(==) operator(-)integer(1) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(\))operator(;) + operator(}) + + directive(private) type(boolean) ident(isEof)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(return) operator(()operator(()type(GZIPInputStream)operator(\))ident(io)operator(\))operator(.)ident(available)operator(()operator(\)) operator(!=) integer(1)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(if) operator(()operator(!)ident(closed)operator(\)) operator({) + ident(io)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + local_variable(this)operator(.)ident(closed) operator(=) keyword(true)operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eof)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(eof)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(return) ident(isEof)operator(()operator(\)) operator(?) ident(getRuntime)operator(()operator(\))operator(.)ident(getTrue)operator(()operator(\)) operator(:) ident(getRuntime)operator(()operator(\))operator(.)ident(getFalse)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(eof?)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(eof_p)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(return) ident(eof)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(unused)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(unused)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(tell)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(tell)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) directive(throws) type(IOException) operator({) + ident(ByteList) ident(sep) operator(=) operator(()operator(()ident(RubyString)operator(\))ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($/)delimiter(")>operator(\))operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0) operator(&&) operator(!)ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(sep) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + operator(}) + + keyword(while) operator(()operator(!)ident(isEof)operator(()operator(\))operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(internalSepGets)operator(()ident(sep)operator(\))operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(ungetc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(ungetc)operator(()ident(IRubyObject) ident(arg)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(readlines)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(readlines)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(IOException) operator({) + type(List)operator(<)ident(IRubyObject)operator(>) ident(array) operator(=) keyword(new) type(ArrayList)operator(<)ident(IRubyObject)operator(>)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(0) operator(&&) ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(array)operator(.)ident(add)operator(()ident(read)operator(()keyword(new) ident(IRubyObject)operator([)integer(0)operator(])operator(\))operator(\))operator(;) + operator(}) keyword(else) operator({) + ident(ByteList) ident(seperator) operator(=) operator(()operator(()ident(RubyString)operator(\))ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($/)delimiter(")>operator(\))operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(0)operator(\)) operator({) + ident(seperator) operator(=) ident(args)operator([)integer(0)operator(])operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + operator(}) + keyword(while) operator(()operator(!)ident(isEof)operator(()operator(\))operator(\)) operator({) + ident(array)operator(.)ident(add)operator(()ident(internalSepGets)operator(()ident(seperator)operator(\))operator(\))operator(;) + operator(}) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newArray)operator(()ident(array)operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(each_byte)delimiter(")>operator(,) ident(frame) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(each_byte)operator(()ident(ThreadContext) ident(context)operator(,) ident(Block) ident(block)operator(\)) directive(throws) type(IOException) operator({) + type(int) ident(value) operator(=) ident(io)operator(.)ident(read)operator(()operator(\))operator(;) + + keyword(while) operator(()ident(value) operator(!=) operator(-)integer(1)operator(\)) operator({) + ident(block)operator(.)ident(yield)operator(()ident(context)operator(,) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(value)operator(\))operator(\))operator(;) + ident(value) operator(=) ident(io)operator(.)ident(read)operator(()operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + operator(}) + + annotation(@JRubyClass)operator(()ident(name)operator(=)string<delimiter(")content(Zlib::GzipWriter)delimiter(")>operator(,) ident(parent)operator(=)string<delimiter(")content(Zlib::GzipFile)delimiter(")>operator(\)) + directive(public) directive(static) type(class) class(RubyGzipWriter) directive(extends) ident(RubyGzipFile) operator({) + directive(protected) directive(static) directive(final) ident(ObjectAllocator) ident(GZIPWRITER_ALLOCATOR) operator(=) keyword(new) ident(ObjectAllocator)operator(()operator(\)) operator({) + directive(public) ident(IRubyObject) ident(allocate)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(klass)operator(\)) operator({) + keyword(return) keyword(new) ident(RubyGzipWriter)operator(()ident(runtime)operator(,) ident(klass)operator(\))operator(;) + operator(}) + operator(})operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(new)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(RubyGzipWriter) ident(newGzipWriter)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(RubyClass) ident(klass) operator(=) operator(()ident(RubyClass)operator(\))ident(recv)operator(;) + + ident(RubyGzipWriter) ident(result) operator(=) operator(()ident(RubyGzipWriter)operator(\))ident(klass)operator(.)ident(allocate)operator(()operator(\))operator(;) + ident(result)operator(.)ident(callInit)operator(()ident(args)operator(,) ident(block)operator(\))operator(;) + keyword(return) ident(result)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(open)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(optional) operator(=) integer(2)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(meta) operator(=) keyword(true)operator(\)) + directive(public) directive(static) ident(IRubyObject) ident(open)operator(()directive(final) ident(ThreadContext) ident(context)operator(,) ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) directive(throws) type(IOException) operator({) + ident(Ruby) ident(runtime) operator(=) ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(;) + ident(IRubyObject) ident(level) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + ident(IRubyObject) ident(strategy) operator(=) ident(runtime)operator(.)ident(getNil)operator(()operator(\))operator(;) + + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(1)operator(\)) operator({) + ident(level) operator(=) ident(args)operator([)integer(1)operator(])operator(;) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(>) integer(2)operator(\)) ident(strategy) operator(=) ident(args)operator([)integer(2)operator(])operator(;) + operator(}) + + ident(IRubyObject) ident(io) operator(=) ident(RuntimeHelpers)operator(.)ident(invoke)operator(()ident(context)operator(,) ident(runtime)operator(.)ident(getFile)operator(()operator(\))operator(,) string<delimiter(")content(open)delimiter(")>operator(,) ident(args)operator([)integer(0)operator(])operator(,) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(wb)delimiter(")>operator(\))operator(\))operator(;) + ident(RubyGzipFile) ident(instance) operator(=) ident(newGzipWriter)operator(()ident(recv)operator(,) keyword(new) ident(IRubyObject)type([])operator({)ident(io)operator(,) ident(level)operator(,) ident(strategy)operator(})operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + + keyword(return) ident(RubyGzipFile)operator(.)ident(wrap)operator(()ident(context)operator(,) ident(instance)operator(,) ident(io)operator(,) ident(block)operator(\))operator(;) + operator(}) + + directive(public) ident(RubyGzipWriter)operator(()ident(Ruby) ident(runtime)operator(,) ident(RubyClass) ident(type)operator(\)) operator({) + local_variable(super)operator(()ident(runtime)operator(,) ident(type)operator(\))operator(;) + operator(}) + + directive(private) type(GZIPOutputStream) ident(io)operator(;) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(initialize)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(,) ident(frame) operator(=) keyword(true)operator(,) ident(visibility) operator(=) type(Visibility)operator(.)ident(PRIVATE)operator(\)) + directive(public) ident(IRubyObject) ident(initialize2)operator(()ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) directive(throws) type(IOException) operator({) + ident(realIo) operator(=) operator(()ident(RubyObject)operator(\))ident(args)operator([)integer(0)operator(])operator(;) + local_variable(this)operator(.)ident(io) operator(=) keyword(new) type(GZIPOutputStream)operator(()keyword(new) ident(IOOutputStream)operator(()ident(args)operator([)integer(0)operator(])operator(\))operator(\))operator(;) + + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(close)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(close)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(if) operator(()operator(!)ident(closed)operator(\)) operator({) + ident(io)operator(.)ident(close)operator(()operator(\))operator(;) + operator(}) + local_variable(this)operator(.)ident(closed) operator(=) keyword(true)operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(append)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(append)operator(()ident(IRubyObject) ident(p1)operator(\)) directive(throws) type(IOException) operator({) + local_variable(this)operator(.)ident(write)operator(()ident(p1)operator(\))operator(;) + keyword(return) local_variable(this)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(printf)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(printf)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(IOException) operator({) + ident(write)operator(()ident(RubyKernel)operator(.)ident(sprintf)operator(()ident(context)operator(,) local_variable(this)operator(,) ident(args)operator(\))operator(\))operator(;) + keyword(return) ident(context)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(print)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(print)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(IOException) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(!=) integer(0)operator(\)) operator({) + keyword(for) operator(()type(int) ident(i) operator(=) integer(0)operator(,) ident(j) operator(=) ident(args)operator(.)ident(length)operator(;) ident(i) operator(<) ident(j)operator(;) ident(i)operator(++)operator(\)) operator({) + ident(write)operator(()ident(args)operator([)ident(i)operator(])operator(\))operator(;) + operator(}) + operator(}) + + ident(IRubyObject) ident(sep) operator(=) ident(getRuntime)operator(()operator(\))operator(.)ident(getGlobalVariables)operator(()operator(\))operator(.)ident(get)operator(()string<delimiter(")content($)char(\\\\)delimiter(")>operator(\))operator(;) + keyword(if) operator(()operator(!)ident(sep)operator(.)ident(isNil)operator(()operator(\))operator(\)) operator({) + ident(write)operator(()ident(sep)operator(\))operator(;) + operator(}) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(pos)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(pos)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(orig_name=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_orig_name)operator(()ident(IRubyObject) ident(ignored)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(comment=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_comment)operator(()ident(IRubyObject) ident(ignored)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(putc)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(putc)operator(()ident(IRubyObject) ident(p1)operator(\)) directive(throws) type(IOException) operator({) + ident(io)operator(.)ident(write)operator(()ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(p1)operator(\))operator(\))operator(;) + keyword(return) ident(p1)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(puts)delimiter(")>operator(,) ident(rest) operator(=) keyword(true)operator(\)) + directive(public) ident(IRubyObject) ident(puts)operator(()ident(ThreadContext) ident(context)operator(,) ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(IOException) operator({) + ident(RubyStringIO) ident(sio) operator(=) operator(()ident(RubyStringIO)operator(\))ident(getRuntime)operator(()operator(\))operator(.)ident(fastGetClass)operator(()string<delimiter(")content(StringIO)delimiter(")>operator(\))operator(.)ident(newInstance)operator(()ident(context)operator(,) keyword(new) ident(IRubyObject)operator([)integer(0)operator(])operator(,) ident(Block)operator(.)ident(NULL_BLOCK)operator(\))operator(;) + ident(sio)operator(.)ident(puts)operator(()ident(context)operator(,) ident(args)operator(\))operator(;) + ident(write)operator(()ident(sio)operator(.)ident(string)operator(()operator(\))operator(\))operator(;) + + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + directive(public) ident(IRubyObject) ident(finish)operator(()operator(\)) directive(throws) type(IOException) operator({) + keyword(if) operator(()operator(!)ident(finished)operator(\)) operator({) + ident(io)operator(.)ident(finish)operator(()operator(\))operator(;) + operator(}) + ident(finished) operator(=) keyword(true)operator(;) + keyword(return) ident(realIo)operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(flush)delimiter(")>operator(,) ident(optional) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(flush)operator(()ident(IRubyObject)type([]) ident(args)operator(\)) directive(throws) type(IOException) operator({) + keyword(if) operator(()ident(args)operator(.)ident(length) operator(==) integer(0) operator(||) ident(args)operator([)integer(0)operator(])operator(.)ident(isNil)operator(()operator(\)) operator(||) ident(RubyNumeric)operator(.)ident(fix2int)operator(()ident(args)operator([)integer(0)operator(])operator(\)) operator(!=) integer(0)operator(\)) operator({) comment(// Zlib::NO_FLUSH) + ident(io)operator(.)ident(flush)operator(()operator(\))operator(;) + operator(}) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(mtime=)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(set_mtime)operator(()ident(IRubyObject) ident(ignored)operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(tell)delimiter(")>operator(\)) + directive(public) ident(IRubyObject) ident(tell)operator(()operator(\)) operator({) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(getNil)operator(()operator(\))operator(;) + operator(}) + + annotation(@JRubyMethod)operator(()ident(name) operator(=) string<delimiter(")content(write)delimiter(")>operator(,) ident(required) operator(=) integer(1)operator(\)) + directive(public) ident(IRubyObject) ident(write)operator(()ident(IRubyObject) ident(p1)operator(\)) directive(throws) type(IOException) operator({) + ident(ByteList) ident(bytes) operator(=) ident(p1)operator(.)ident(convertToString)operator(()operator(\))operator(.)ident(getByteList)operator(()operator(\))operator(;) + ident(io)operator(.)ident(write)operator(()ident(bytes)operator(.)ident(unsafeBytes)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(begin)operator(()operator(\))operator(,) ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + keyword(return) ident(getRuntime)operator(()operator(\))operator(.)ident(newFixnum)operator(()ident(bytes)operator(.)ident(length)operator(()operator(\))operator(\))operator(;) + operator(}) + operator(}) +operator(}) +comment(/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"\); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C\) 2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C\) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C\) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C\) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"\), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"\), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/) +keyword(package) ident(org)operator(.)ident(jruby)operator(;) + +keyword(import) include(org.jruby.runtime.Arity)operator(;) +keyword(import) include(org.jruby.runtime.Block)operator(;) +keyword(import) include(org.jruby.runtime.builtin.IRubyObject)operator(;) +keyword(import) include(org.jruby.runtime.callback.Callback)operator(;) + +comment(/** + * + * @author jpetersen + */) +directive(public) directive(final) type(class) class(TopSelfFactory) operator({) + + comment(/** + * Constructor for TopSelfFactory. + */) + directive(private) ident(TopSelfFactory)operator(()operator(\)) operator({) + local_variable(super)operator(()operator(\))operator(;) + operator(}) + + directive(public) directive(static) ident(IRubyObject) ident(createTopSelf)operator(()directive(final) ident(Ruby) ident(runtime)operator(\)) operator({) + ident(IRubyObject) ident(topSelf) operator(=) keyword(new) ident(RubyObject)operator(()ident(runtime)operator(,) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(\))operator(;) + + ident(topSelf)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineFastMethod)operator(()string<delimiter(")content(to_s)delimiter(")>operator(,) keyword(new) type(Callback)operator(()operator(\)) operator({) + comment(/** + * @see org.jruby.runtime.callback.Callback#execute(IRubyObject, IRubyObject[]\) + */) + directive(public) ident(IRubyObject) ident(execute)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(newString)operator(()string<delimiter(")content(main)delimiter(")>operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.callback.Callback#getArity(\) + */) + directive(public) ident(Arity) ident(getArity)operator(()operator(\)) operator({) + keyword(return) ident(Arity)operator(.)ident(noArguments)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + comment(// The following three methods must be defined fast, since they expect to modify the current frame) + comment(// (i.e. they expect no frame will be allocated for them\). JRUBY-1185.) + ident(topSelf)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineFastPrivateMethod)operator(()string<delimiter(")content(include)delimiter(")>operator(,) keyword(new) type(Callback)operator(()operator(\)) operator({) + comment(/** + * @see org.jruby.runtime.callback.Callback#execute(IRubyObject, IRubyObject[]\) + */) + directive(public) ident(IRubyObject) ident(execute)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(block)operator(\)) operator({) + ident(runtime)operator(.)ident(secure)operator(()integer(4)operator(\))operator(;) + keyword(return) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(include)operator(()ident(args)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.callback.Callback#getArity(\) + */) + directive(public) ident(Arity) ident(getArity)operator(()operator(\)) operator({) + keyword(return) ident(Arity)operator(.)ident(optional)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + ident(topSelf)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineFastPrivateMethod)operator(()string<delimiter(")content(public)delimiter(")>operator(,) keyword(new) type(Callback)operator(()operator(\)) operator({) + comment(/** + * @see org.jruby.runtime.callback.Callback#execute(IRubyObject, IRubyObject[]\) + */) + directive(public) ident(IRubyObject) ident(execute)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(rbPublic)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.callback.Callback#getArity(\) + */) + directive(public) ident(Arity) ident(getArity)operator(()operator(\)) operator({) + keyword(return) ident(Arity)operator(.)ident(optional)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + ident(topSelf)operator(.)ident(getSingletonClass)operator(()operator(\))operator(.)ident(defineFastPrivateMethod)operator(()string<delimiter(")content(private)delimiter(")>operator(,) keyword(new) type(Callback)operator(()operator(\)) operator({) + comment(/** + * @see org.jruby.runtime.callback.Callback#execute(IRubyObject, IRubyObject[]\) + */) + directive(public) ident(IRubyObject) ident(execute)operator(()ident(IRubyObject) ident(recv)operator(,) ident(IRubyObject)type([]) ident(args)operator(,) ident(Block) ident(unusedBlock)operator(\)) operator({) + keyword(return) ident(runtime)operator(.)ident(getObject)operator(()operator(\))operator(.)ident(rbPrivate)operator(()ident(recv)operator(.)ident(getRuntime)operator(()operator(\))operator(.)ident(getCurrentContext)operator(()operator(\))operator(,) ident(args)operator(\))operator(;) + operator(}) + + comment(/** + * @see org.jruby.runtime.callback.Callback#getArity(\) + */) + directive(public) ident(Arity) ident(getArity)operator(()operator(\)) operator({) + keyword(return) ident(Arity)operator(.)ident(optional)operator(()operator(\))operator(;) + operator(}) + operator(})operator(\))operator(;) + + keyword(return) ident(topSelf)operator(;) + operator(}) +operator(}) diff --git a/test/scanners/java/jruby.in.java b/test/scanners/java/jruby.in.java new file mode 100644 index 0000000..538abfa --- /dev/null +++ b/test/scanners/java/jruby.in.java @@ -0,0 +1,51193 @@ +package org.jruby; + +public enum CompatVersion { + + RUBY1_8, RUBY1_9, BOTH; + + public static CompatVersion getVersionFromString(String compatString) { + if (compatString.equalsIgnoreCase("RUBY1_8")) { + return CompatVersion.RUBY1_8; + } else if (compatString.equalsIgnoreCase("RUBY1_9")) { + return CompatVersion.RUBY1_9; + } else { + return null; + } + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Damian Steer <pldms@mac.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +/** + * An almost entirely useless interface for those objects that we _really_ want + * to finalise. + * + * @author pldms + * + */ +public interface Finalizable { + public void finalize(); +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; +/** + * Error numbers. + * @fixme + * this interface is a big hack defining a bunch of arbitrary valor as system call error numbers + * this is actually because I need them but will probably need to be changed to something smarter + * sooner or later. + * The purpose of this class it to help implement the Errno module which in turn in needed by rubicon. + * @author Benoit Cerrina + **/ +public interface IErrno +{ + int EPERM = 1; + int ENOENT = 2; + int ESRCH = 3; + int EINTR = 4; + int EIO = 5; + int ENXIO = 6; + int E2BIG = 7; + int ENOEXEC = 8; + int EBADF = 9; + int ECHILD = 10; + int EDEADLK = 11; + int ENOMEM = 12; + int EACCES = 13; + int EFAULT = 14; + int ENOTBLK = 15; + int EBUSY = 16; + int EEXIST = 17; + int EXDEV = 18; + int ENODEV = 19; + int ENOTDIR = 20; + int EISDIR = 21; + int EINVAL = 22; + int ENFILE = 23; + int EMFILE = 24; + int ENOTTY = 25; + int ETXTBSY = 26; + int EFBIG = 27; + int ENOSPC = 28; + int ESPIPE = 29; + int EROFS = 30; + int EMLINK = 31; + int EPIPE = 32; + int EDOM = 33; + int ERANGE = 34; + int EWOULDBLOCK = 35; + int EAGAIN = 35; + int EINPROGRESS = 36; + int EALREADY = 37; + int ENOTSOCK = 38; + int EDESTADDRREQ = 39; + int EMSGSIZE = 40; + int EPROTOTYPE = 41; + int ENOPROTOOPT = 42; + int EPROTONOSUPPORT = 43; + int ESOCKTNOSUPPORT = 44; + int EOPNOTSUPP = 45; + int EPFNOSUPPORT = 46; + int EAFNOSUPPORT = 47; + int EADDRINUSE = 48; + int EADDRNOTAVAIL = 49; + int ENETDOWN = 50; + int ENETUNREACH = 51; + int ENETRESET = 52; + int ECONNABORTED = 53; + int ECONNRESET = 54; + int ENOBUFS = 55; + int EISCONN = 56; + int ENOTCONN = 57; + int ESHUTDOWN = 58; + int ETOOMANYREFS = 59; + int ETIMEDOUT = 60; + int ECONNREFUSED = 61; + int ELOOP = 62; + int ENAMETOOLONG = 63; + int EHOSTDOWN = 64; + int EHOSTUNREACH = 65; + int ENOTEMPTY = 66; + int EUSERS = 68; + int EDQUOT = 69; + int ESTALE = 70; + int EREMOTE = 71; + int ENOLCK = 77; + int ENOSYS = 78; + int EOVERFLOW = 84; + int EIDRM = 90; + int ENOMSG = 91; + int EILSEQ = 92; + int EBADMSG = 94; + int EMULTIHOP = 95; + int ENODATA = 96; + int ENOLINK = 97; + int ENOSR = 98; + int ENOSTR = 99; + int EPROTO = 100; + int ETIME = 101; + int EOPNOTSUPP_DARWIN = 102; +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.util.List; +import java.util.Map; + +import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.builtin.Variable; + +/** + * This class is used to provide an intermediate superclass for modules and classes that include + * other modules. It inserts itself as the immediate superClass of the includer, but defers all + * module methods to the actual superclass. Multiple of these intermediate superclasses can be + * added for multiple included modules. + * + * This allows the normal superclass-based searches (searchMethod, getConstant, etc) to traverse + * the superclass ancestors as normal while the included modules do not actually show up in + * direct inheritance traversal. + * + * @see org.jruby.RubyModule + */ +public final class IncludedModuleWrapper extends RubyClass { + private final RubyModule delegate; + + public IncludedModuleWrapper(Ruby runtime, RubyClass superClass, RubyModule delegate) { + super(runtime, superClass, false); + this.delegate = delegate; + this.metaClass = delegate.metaClass; + } + + /** + * Overridden newIncludeClass implementation to allow attaching future includes to the correct module + * (i.e. the one to which this is attached) + * + * @see org.jruby.RubyModule#newIncludeClass(RubyClass) + */ + @Override + public IncludedModuleWrapper newIncludeClass(RubyClass superClass) { + IncludedModuleWrapper includedModule = new IncludedModuleWrapper(getRuntime(), superClass, getNonIncludedClass()); + + // include its parent (and in turn that module's parents) + if (getSuperClass() != null) { + includedModule.includeModule(getSuperClass()); + } + + return includedModule; + } + + @Override + public boolean isModule() { + return false; + } + + @Override + public boolean isClass() { + return false; + } + + @Override + public boolean isIncluded() { + return true; + } + + @Override + public boolean isImmediate() { + return true; + } + + @Override + public void setMetaClass(RubyClass newRubyClass) { + throw new UnsupportedOperationException("An included class is only a wrapper for a module"); + } + + @Override + public Map<String, DynamicMethod> getMethods() { + return delegate.getMethods(); + } + + @Override + public void addMethod(String name, DynamicMethod method) { + throw new UnsupportedOperationException("An included class is only a wrapper for a module"); + } + + public void setMethods(Map newMethods) { + throw new UnsupportedOperationException("An included class is only a wrapper for a module"); + } + + @Override + public String getName() { + return delegate.getName(); + } + + @Override + public RubyModule getNonIncludedClass() { + return delegate; + } + + @Override + public RubyClass getRealClass() { + return getSuperClass().getRealClass(); + } + + @Override + protected boolean isSame(RubyModule module) { + return delegate.isSame(module); + } + + /** + * We don't want to reveal ourselves to Ruby code, so delegate this + * operation. + */ + @Override + public IRubyObject id() { + return delegate.id(); + } + + // + // VARIABLE TABLE METHODS - pass to delegate + // + + @Override + protected boolean variableTableContains(String name) { + return delegate.variableTableContains(name); + } + + @Override + protected boolean variableTableFastContains(String internedName) { + return delegate.variableTableFastContains(internedName); + } + + @Override + protected IRubyObject variableTableFetch(String name) { + return delegate.variableTableFetch(name); + } + + @Override + protected IRubyObject variableTableFastFetch(String internedName) { + return delegate.variableTableFastFetch(internedName); + } + + @Override + protected IRubyObject variableTableStore(String name, IRubyObject value) { + return delegate.variableTableStore(name, value); + } + + @Override + protected IRubyObject variableTableFastStore(String internedName, IRubyObject value) { + return delegate.variableTableFastStore(internedName, value); + } + + @Override + protected IRubyObject variableTableRemove(String name) { + return delegate.variableTableRemove(name); + } + + @Override + protected VariableTableEntry[] variableTableGetTable() { + return delegate.variableTableGetTable(); + } + + @Override + protected int variableTableGetSize() { + return delegate.variableTableGetSize(); + } + + @Override + protected void variableTableSync(List<Variable<IRubyObject>> vars) { + delegate.variableTableSync(vars); + } + + @Override + protected IRubyObject variableTableReadLocked(VariableTableEntry entry) { + return delegate.variableTableReadLocked(entry); + } + + /** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */ + @SuppressWarnings("unchecked") + @Override + @Deprecated // born deprecated + protected Map variableTableGetMap() { + return delegate.variableTableGetMap(); + } + + /** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */ + @SuppressWarnings("unchecked") + @Override + @Deprecated // born deprecated + protected Map variableTableGetMap(Map map) { + return delegate.variableTableGetMap(map); + } + + // + // CONSTANT TABLE METHODS - pass to delegate + // + + @Override + protected boolean constantTableContains(String name) { + return delegate.constantTableContains(name); + } + + @Override + protected boolean constantTableFastContains(String internedName) { + return delegate.constantTableFastContains(internedName); + } + + @Override + protected IRubyObject constantTableFetch(String name) { + return delegate.constantTableFetch(name); + } + + @Override + protected IRubyObject constantTableFastFetch(String internedName) { + return delegate.constantTableFastFetch(internedName); + } + + @Override + protected IRubyObject constantTableStore(String name, IRubyObject value) { + // FIXME: legal here? may want UnsupportedOperationException + return delegate.constantTableStore(name, value); + } + + @Override + protected IRubyObject constantTableFastStore(String internedName, IRubyObject value) { + // FIXME: legal here? may want UnsupportedOperationException + return delegate.constantTableFastStore(internedName, value); + } + + @Override + protected IRubyObject constantTableRemove(String name) { + // this _is_ legal (when removing an undef) + return delegate.constantTableRemove(name); + } + + @Override + protected ConstantTableEntry[] constantTableGetTable() { + return delegate.constantTableGetTable(); + } + + @Override + protected int constantTableGetSize() { + return delegate.constantTableGetSize(); + } + + @Override + protected void constantTableSync(List<Variable<IRubyObject>> vars) { + // FIXME: legal here? may want UnsupportedOperationException + delegate.constantTableSync(vars); + } + + /** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */ + @SuppressWarnings("unchecked") + @Override + @Deprecated // born deprecated + protected Map constantTableGetMap() { + return delegate.constantTableGetMap(); + } + + /** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */ + @SuppressWarnings("unchecked") + @Override + @Deprecated // born deprecated + protected Map constantTableGetMap(Map map) { + return delegate.constantTableGetMap(map); + } + +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Charles Nutter <charles.o.nutter@sun.com> + * Copyright (C) 2008 MenTaLguY <mental@rydia.net> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.applet.Applet; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Container; +import java.awt.EventQueue; +import java.awt.Font; +import java.awt.Insets; +import java.awt.Graphics; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.awt.image.VolatileImage; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.net.URL; +import java.util.Arrays; + +import java.lang.reflect.InvocationTargetException; + +import org.jruby.anno.JRubyMethod; +import org.jruby.demo.TextAreaReadline; +import org.jruby.javasupport.JavaUtil; +import org.jruby.runtime.Block; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import javax.swing.JScrollPane; +import javax.swing.JTextPane; + +/** + * @author <a href="mailto:mental@rydia.net">MenTaLguY</a> + * + * The JRubyApplet class provides a simple way to write Java applets using + * JRuby without needing to create a custom Java applet class. At applet + * initialization time, JRubyApplet starts up a JRuby runtime, then evaluates + * the scriptlet given as the "eval" applet parameter. + * + * The Java applet instance is available to the Ruby script as + * JRUBY_APPLET; the script can define callbacks for applet start, stop, + * and destroy by passing blocks to JRUBY_APPLET.on_start, + * JRUBY_APPLET.on_stop, and JRUBY_APPLET.on_destroy, respectively. + * + * Ruby code can install a custom paint callback using JRUBY_APPLET.on_paint + * (the Graphics2D object is passed as an argument to the callback). By + * default, JRubyApplet painting is double-buffered, but you can select + * single-buffered painting via JRUBY_APPLET.double_buffered = false. + * + * The applet's background color can be set via JRUBY_APPLET.background_color=. + * You may want to set it to nil if you're not using double-buffering, so that + * no background color will be drawn (your own paint code is then responsible + * for filling the area). + * + * Beyond these things, you should be able to use JRuby's Java integration + * to do whatever you would do in Java with the applet instance. + * + */ +public class JRubyApplet extends Applet { + private Ruby runtime; + private boolean doubleBuffered = true; + private Color backgroundColor = Color.WHITE; + private RubyProc startProc; + private RubyProc stopProc; + private RubyProc destroyProc; + private RubyProc paintProc; + private Graphics priorGraphics; + private IRubyObject wrappedGraphics; + private VolatileImage backBuffer; + private Graphics backBufferGraphics; + private Facade facade; + + private interface Facade { + public InputStream getInputStream(); + public PrintStream getOutputStream(); + public PrintStream getErrorStream(); + public void attach(Ruby runtime, Applet applet); + public void destroy(); + } + + private static RubyProc blockToProc(Ruby runtime, Block block) { + if (block.isGiven()) { + RubyProc proc = block.getProcObject(); + if (proc == null) { + proc = RubyProc.newProc(runtime, block, block.type); + } + return proc; + } else { + return null; + } + } + + private boolean getBooleanParameter(String name, boolean defaultValue) { + String value = getParameter(name); + if ( value != null ) { + return value.equals("true"); + } else { + return defaultValue; + } + } + + private InputStream getCodeResourceAsStream(String name) { + if (name == null) { + return null; + } + try { + final URL directURL = new URL(getCodeBase(), name); + return directURL.openStream(); + } catch (IOException e) { + } + return JRubyApplet.class.getClassLoader().getResourceAsStream(name); + } + + private static void safeInvokeAndWait(Runnable runnable) throws InvocationTargetException, InterruptedException { + if (EventQueue.isDispatchThread()) { + try { + runnable.run(); + } catch (Exception e) { + throw new InvocationTargetException(e); + } + } else { + EventQueue.invokeAndWait(runnable); + } + } + + public static class RubyMethods { + @JRubyMethod + public static IRubyObject on_start(IRubyObject recv, Block block) { + JRubyApplet applet = (JRubyApplet)recv.dataGetStruct(); + synchronized (applet) { + applet.startProc = blockToProc(applet.runtime, block); + } + return recv; + } + + @JRubyMethod + public static IRubyObject on_stop(IRubyObject recv, Block block) { + JRubyApplet applet = (JRubyApplet)recv.dataGetStruct(); + synchronized (applet) { + applet.stopProc = blockToProc(applet.runtime, block); + } + return recv; + } + + @JRubyMethod + public static IRubyObject on_destroy(IRubyObject recv, Block block) { + JRubyApplet applet = (JRubyApplet)recv.dataGetStruct(); + synchronized (applet) { + applet.destroyProc = blockToProc(applet.runtime, block); + } + return recv; + } + + @JRubyMethod + public static IRubyObject on_paint(IRubyObject recv, Block block) { + JRubyApplet applet = (JRubyApplet)recv.dataGetStruct(); + synchronized (applet) { + applet.paintProc = blockToProc(applet.runtime, block); + applet.repaint(); + } + return recv; + } + } + + @Override + public void init() { + super.init(); + + if (getBooleanParameter("jruby.console", false)) { + facade = new ConsoleFacade(getParameter("jruby.banner")); + } else { + facade = new TrivialFacade(); + } + + synchronized (this) { + if (runtime != null) { + return; + } + + final RubyInstanceConfig config = new RubyInstanceConfig() {{ + setInput(facade.getInputStream()); + setOutput(facade.getOutputStream()); + setError(facade.getErrorStream()); + setObjectSpaceEnabled(getBooleanParameter("jruby.objectspace", false)); + }}; + Ruby.setSecurityRestricted(true); + runtime = Ruby.newInstance(config); + } + + final String scriptName = getParameter("jruby.script"); + final InputStream scriptStream = getCodeResourceAsStream(scriptName); + final String evalString = getParameter("jruby.eval"); + + try { + final JRubyApplet applet = this; + safeInvokeAndWait(new Runnable() { + public void run() { + applet.setLayout(new BorderLayout()); + applet.facade.attach(applet.runtime, applet); + if (scriptStream != null) { + applet.runtime.runFromMain(scriptStream, scriptName); + } + if (evalString != null) { + applet.runtime.evalScriptlet(evalString); + } + } + }); + } catch (InterruptedException e) { + } catch (InvocationTargetException e) { + throw new RuntimeException("Error running script", e.getCause()); + } + } + + private void invokeCallback(final RubyProc proc, final IRubyObject[] args) { + if (proc == null) { + return; + } + final Ruby runtime = this.runtime; + try { + safeInvokeAndWait(new Runnable() { + public void run() { + ThreadContext context = runtime.getCurrentContext(); + proc.call(context, args); + } + }); + } catch (InterruptedException e) { + } catch (InvocationTargetException e) { + throw new RuntimeException("Ruby callback failed", e.getCause()); + } + } + + public synchronized void setBackgroundColor(Color color) { + backgroundColor = color; + repaint(); + } + + public synchronized Color getBackgroundColor() { + return backgroundColor; + } + + public synchronized boolean isDoubleBuffered() { + return doubleBuffered; + } + + public synchronized void setDoubleBuffered(boolean shouldBuffer) { + doubleBuffered = shouldBuffer; + repaint(); + } + + @Override + public synchronized void start() { + super.start(); + invokeCallback(startProc, new IRubyObject[] {}); + } + + @Override + public synchronized void stop() { + invokeCallback(stopProc, new IRubyObject[] {}); + super.stop(); + } + + @Override + public synchronized void destroy() { + try { + invokeCallback(destroyProc, new IRubyObject[] {}); + } finally { + facade.destroy(); + final Ruby runtime = this.runtime; + this.runtime = null; + startProc = null; + stopProc = null; + destroyProc = null; + paintProc = null; + priorGraphics = null; + wrappedGraphics = null; + runtime.tearDown(); + super.destroy(); + } + } + + @Override + public void update(Graphics g) { + paint(g); + } + + @Override + public synchronized void paint(Graphics g) { + if (doubleBuffered) { + paintBuffered(g); + } else { + paintUnbuffered(g); + } + } + + private synchronized void paintBuffered(Graphics g) { + do { + GraphicsConfiguration config = getGraphicsConfiguration(); + int width = getWidth(); + int height = getHeight(); + if (backBuffer == null || width != backBuffer.getWidth() || height != backBuffer.getHeight() || backBuffer.validate(config) == VolatileImage.IMAGE_INCOMPATIBLE) { + if (backBuffer != null) { + backBufferGraphics.dispose(); + backBufferGraphics = null; + backBuffer.flush(); + backBuffer = null; + } + backBuffer = config.createCompatibleVolatileImage(width, height); + backBufferGraphics = backBuffer.createGraphics(); + } + backBufferGraphics.setClip(g.getClip()); + paintUnbuffered(backBufferGraphics); + g.drawImage(backBuffer, 0, 0, this); + } while (backBuffer.contentsLost()); + } + + private synchronized void paintUnbuffered(Graphics g) { + if (backgroundColor != null) { + g.setColor(backgroundColor); + g.fillRect(0, 0, getWidth(), getHeight()); + } + if (paintProc != null) { + if (priorGraphics != g) { + wrappedGraphics = JavaUtil.convertJavaToUsableRubyObject(runtime, g); + priorGraphics = g; + } + ThreadContext context = runtime.getCurrentContext(); + paintProc.call(context, new IRubyObject[] {wrappedGraphics}); + } + super.paint(g); + } + + private static class TrivialFacade implements Facade { + public TrivialFacade() {} + public InputStream getInputStream() { return System.in; } + public PrintStream getOutputStream() { return System.out; } + public PrintStream getErrorStream() { return System.err; } + public void attach(Ruby runtime, Applet applet) { + final IRubyObject wrappedApplet = JavaUtil.convertJavaToUsableRubyObject(runtime, applet); + wrappedApplet.dataWrapStruct(applet); + runtime.defineGlobalConstant("JRUBY_APPLET", wrappedApplet); + wrappedApplet.getMetaClass().defineAnnotatedMethods(RubyMethods.class); + } + public void destroy() {} + } + + private static class ConsoleFacade implements Facade { + private JTextPane textPane; + private JScrollPane scrollPane; + private TextAreaReadline adaptor; + private InputStream inputStream; + private PrintStream outputStream; + private PrintStream errorStream; + + public ConsoleFacade(String bannerText) { + textPane = new JTextPane(); + textPane.setMargin(new Insets(4, 4, 0, 4)); + textPane.setCaretColor(new Color(0xa4, 0x00, 0x00)); + textPane.setBackground(new Color(0xf2, 0xf2, 0xf2)); + textPane.setForeground(new Color(0xa4, 0x00, 0x00)); + + Font font = findFont("Monospaced", Font.PLAIN, 14, + new String[] {"Monaco", "Andale Mono"}); + + textPane.setFont(font); + + scrollPane = new JScrollPane(textPane); + scrollPane.setDoubleBuffered(true); + if ( bannerText != null ) { + bannerText = " " + bannerText + " \n\n"; + } + adaptor = new TextAreaReadline(textPane, bannerText); + inputStream = adaptor.getInputStream(); + outputStream = new PrintStream(adaptor.getOutputStream()); + errorStream = new PrintStream(adaptor.getOutputStream()); + } + + public InputStream getInputStream() { return inputStream; } + public PrintStream getOutputStream() { return outputStream; } + public PrintStream getErrorStream() { return errorStream; } + + public void attach(Ruby runtime, Applet applet) { + adaptor.hookIntoRuntime(runtime); + applet.add(scrollPane); + applet.validate(); + } + + public void destroy() { + Container parent = scrollPane.getParent(); + adaptor.shutdown(); + if (parent != null) { + parent.remove(scrollPane); + } + } + + private Font findFont(String otherwise, int style, int size, String[] families) { + String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); + Arrays.sort(fonts); + for (int i = 0; i < families.length; i++) { + if (Arrays.binarySearch(fonts, families[i]) >= 0) { + return new Font(families[i], style, size); + } + } + return new Font(otherwise, style, size); + } + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.BufferedWriter; +import java.io.OutputStreamWriter; + +import java.net.InetAddress; +import java.net.Socket; + +/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +public class JRubyClient extends JRubyService { + public JRubyClient(String[] args) throws Exception { + Configuration conf = new Configuration(args[0]); + if(conf.isDebug()) { + System.err.println("Starting client with port " + conf.getPort() + ", key " + conf.getKey() + " and command " + conf.getCommand()); + } + Socket socket = new Socket(InetAddress.getLocalHost(), conf.getPort()); + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + if(conf.terminate()) { + writer.write(CMD_TERM + " " + conf.getKey() + "\n"); + } else if(conf.noMore()) { + writer.write(CMD_NO_MORE + " " + conf.getKey() + "\n"); + } else { + writer.write(CMD_START + " " + conf.getKey() + " " + conf.getCommand() + "\n"); + } + writer.flush(); + writer.close(); + socket.close(); + } + + public static void main(String[] args) throws Exception { + new JRubyClient(args); + } +}// JRubyClient +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; + +import java.util.List; +import java.util.ArrayList; + +/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +public class JRubyServer extends JRubyService { + private Configuration conf; + + private boolean stillStarting = true; + + private JRubyServer(String[] args) throws Exception { + conf = new Configuration(args[0]); + if(conf.isDebug()) { + System.err.println("Starting server with port " + conf.getPort() + " and key " + conf.getKey()); + } + ServerSocket server = new ServerSocket(); + server.bind(new InetSocketAddress(InetAddress.getLocalHost(),conf.getPort())); + while(true) { + Thread t1 = new Thread(new Handler(server.accept())); + t1.setDaemon(true); + t1.start(); + } + } + + private class Handler implements Runnable { + private Socket socket; + + public Handler(Socket socket) { + this.socket = socket; + } + + public void run() { + try { + BufferedReader rr = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); + String command = rr.readLine(); + rr.close(); + this.socket.close(); + this.socket = null; + if(conf.isDebug()) { + System.err.println("Got command: " + command); + } + String[] cmds = command.split(" ", 3); + if(cmds[1].equals(conf.getKey())) { + if(cmds[0].equals(CMD_TERM)) { + if(conf.isDebug()) { + System.err.println("Terminating hard"); + } + System.exit(0); + } else if(cmds[0].equals(CMD_NO_MORE)) { + if(conf.isDebug()) { + System.err.println("Accepting no more START"); + } + stillStarting = false; + } else if(cmds[0].equals(CMD_START)) { + if(stillStarting) { + if(conf.isDebug()) { + System.err.println("Doing START on command " + cmds[2]); + } + new Main().run(intoCommandArguments(cmds[2].trim())); + } else { + if(conf.isDebug()) { + System.err.println("Not doing START anymore, invalid command"); + } + } + } else { + if(conf.isDebug()) { + System.err.println("Unrecognized command"); + } + } + } else { + if(conf.isDebug()) { + System.err.println("Invalid key"); + } + } + } catch(Exception e) {} + } + } + + protected static String[] intoCommandArguments(String str) { + List<String> args = new ArrayList<String>(); + boolean inSingle = false; + int contentStart = -1; + + for(int i=0,j=str.length();i<j;i++) { + if(str.charAt(i) == ' ' && !inSingle && contentStart != -1) { + args.add(str.substring(contentStart,i)); + contentStart = -1; + continue; + } + if(str.charAt(i) == ' ') { + continue; + } + if(str.charAt(i) == '\'' && !inSingle) { + inSingle = true; + contentStart = i+1; + continue; + } + if(str.charAt(i) == '\'') { + inSingle = false; + args.add(str.substring(contentStart,i)); + contentStart = -1; + continue; + } + if(contentStart == -1) { + contentStart = i; + } + } + if(contentStart != -1) { + args.add(str.substring(contentStart)); + } + return (String[])args.toArray(new String[0]); + } + + public static void main(String[] args) throws Exception { + new JRubyServer(args); + } +}// JRubyServer +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +public abstract class JRubyService { + protected static class Configuration { + private final static int DEFAULT_PORT = 19222; + + private String key; + private int port = DEFAULT_PORT; + private boolean terminate; + private boolean noMore; + private boolean debug; + private String command; + + public Configuration(String args) { + int i=0; + int stop; + loop: for(int j=args.length();i<j;i++) { + if(args.charAt(i) == '-' && i+1 < j) { + switch(args.charAt(++i)) { + case 'k': + stop = args.indexOf(" ", (++i) + 1); + if(stop == -1) { + stop = args.length(); + } + key = args.substring(i, stop).trim(); + i = stop; + break; + case 'p': + stop = args.indexOf(" ", (++i) + 1); + if(stop == -1) { + stop = args.length(); + } + port = Integer.parseInt(args.substring(i, stop).trim()); + i = stop; + break; + case 't': + terminate = true; + i++; + break; + case 'n': + noMore = true; + i++; + break; + case 'd': + debug = true; + i++; + break; + case '-': // handle everything after -- as arguments to the jruby process + i++; + break loop; + default: + i--; + break loop; + } + } else if(args.charAt(i) != ' ') { + break loop; + } + } + if(i<args.length()) { + command = args.substring(i).trim(); + } + } + + public String getKey() { + return key; + } + + public int getPort() { + return port; + } + + public boolean terminate() { + return terminate; + } + + public boolean noMore() { + return noMore; + } + + public boolean isDebug() { + return debug; + } + + public String getCommand() { + return command; + } + } + + public static final String CMD_START = "START"; + public static final String CMD_NO_MORE = "NO_MORE"; + public static final String CMD_TERM = "TERM"; +}// JRubyService +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2006 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Kiel Hodges <jruby-devel@selfsosoft.com> + * Copyright (C) 2005 Jason Voegele <jason@jvoegele.com> + * Copyright (C) 2005 Tim Azzopardi <tim@tigerfive.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.InputStream; +import java.io.PrintStream; + +import org.jruby.exceptions.MainExitException; +import org.jruby.exceptions.RaiseException; +import org.jruby.exceptions.ThreadKill; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.SafePropertyAccessor; +import org.jruby.util.SimpleSampler; + +/** + * Class used to launch the interpreter. + * This is the main class as defined in the jruby.mf manifest. + * It is very basic and does not support yet the same array of switches + * as the C interpreter. + * Usage: java -jar jruby.jar [switches] [rubyfile.rb] [arguments] + * -e 'command' one line of script. Several -e's allowed. Omit [programfile] + * @author jpetersen + */ +public class Main { + private boolean hasPrintedUsage = false; + private final RubyInstanceConfig config; + + public Main(RubyInstanceConfig config) { + this.config = config; + } + + public Main(final InputStream in, final PrintStream out, final PrintStream err) { + this(new RubyInstanceConfig(){{ + setInput(in); + setOutput(out); + setError(err); + }}); + } + + public Main() { + this(new RubyInstanceConfig()); + } + + public static void main(String[] args) { + Main main = new Main(); + + try { + int status = main.run(args); + if (status != 0) { + System.exit(status); + } + } catch (RaiseException re) { + throw re; + } catch (Throwable t) { + // print out as a nice Ruby backtrace + System.err.println(ThreadContext.createRawBacktraceStringFromThrowable(t)); + System.exit(1); + } + } + + public int run(String[] args) { + try { + config.processArguments(args); + return run(); + } catch (MainExitException mee) { + if (!mee.isAborted()) { + config.getOutput().println(mee.getMessage()); + if (mee.isUsageError()) { + printUsage(); + } + } + return mee.getStatus(); + } catch (OutOfMemoryError oome) { + // produce a nicer error since Rubyists aren't used to seeing this + System.gc(); + + String memoryMax = SafePropertyAccessor.getProperty("jruby.memory.max"); + String message = ""; + if (memoryMax != null) { + message = " of " + memoryMax; + } + System.err.println("Error: Your application used more memory than the safety cap" + message + "."); + System.err.println("Specify -J-Xmx####m to increase it (#### = cap size in MB)."); + + if (config.getVerbose()) { + System.err.println("Exception trace follows:"); + oome.printStackTrace(); + } else { + System.err.println("Specify -w for full OutOfMemoryError stack trace"); + } + return 1; + } catch (StackOverflowError soe) { + // produce a nicer error since Rubyists aren't used to seeing this + System.gc(); + + String stackMax = SafePropertyAccessor.getProperty("jruby.stack.max"); + String message = ""; + if (stackMax != null) { + message = " of " + stackMax; + } + System.err.println("Error: Your application used more stack memory than the safety cap" + message + "."); + System.err.println("Specify -J-Xss####k to increase it (#### = cap size in KB)."); + + if (config.getVerbose()) { + System.err.println("Exception trace follows:"); + soe.printStackTrace(); + } else { + System.err.println("Specify -w for full StackOverflowError stack trace"); + } + return 1; + } catch (UnsupportedClassVersionError ucve) { + System.err.println("Error: Some library (perhaps JRuby) was built with a later JVM version."); + System.err.println("Please use libraries built with the version you intend to use or an earlier one."); + + if (config.getVerbose()) { + System.err.println("Exception trace follows:"); + ucve.printStackTrace(); + } else { + System.err.println("Specify -w for full UnsupportedClassVersionError stack trace"); + } + return 1; + } catch (ThreadKill kill) { + return 0; + } + } + + public int run() { + if (config.isShowVersion()) { + showVersion(); + } + + if (config.isShowCopyright()) { + showCopyright(); + } + + if (!config.shouldRunInterpreter() ) { + if (config.shouldPrintUsage()) { + printUsage(); + } + if (config.shouldPrintProperties()) { + printProperties(); + } + return 0; + } + + InputStream in = config.getScriptSource(); + String filename = config.displayedFileName(); + Ruby runtime = Ruby.newInstance(config); + + // set thread context JRuby classloader here, for the main thread + try { + Thread.currentThread().setContextClassLoader(runtime.getJRubyClassLoader()); + } catch (SecurityException se) { + // can't set TC classloader + if (runtime.getInstanceConfig().isVerbose()) { + System.err.println("WARNING: Security restrictions disallowed setting context classloader for main thread."); + } + } + + if (in == null) { + // no script to run, return success below + } else if (config.isShouldCheckSyntax()) { + runtime.parseFromMain(in, filename); + config.getOutput().println("Syntax OK"); + } else { + long now = -1; + + try { + if (config.isBenchmarking()) { + now = System.currentTimeMillis(); + } + + if (config.isSamplingEnabled()) { + SimpleSampler.startSampleThread(); + } + + try { + runtime.runFromMain(in, filename); + } finally { + runtime.tearDown(); + + if (config.isBenchmarking()) { + config.getOutput().println("Runtime: " + (System.currentTimeMillis() - now) + " ms"); + } + + if (config.isSamplingEnabled()) { + org.jruby.util.SimpleSampler.report(); + } + } + } catch (RaiseException rj) { + RubyException raisedException = rj.getException(); + if (runtime.getSystemExit().isInstance(raisedException)) { + IRubyObject status = raisedException.callMethod(runtime.getCurrentContext(), "status"); + + if (status != null && !status.isNil()) { + return RubyNumeric.fix2int(status); + } + } else { + runtime.printError(raisedException); + return 1; + } + } + } + return 0; + } + + private void showVersion() { + config.getOutput().print(config.getVersionString()); + } + + private void showCopyright() { + config.getOutput().print(config.getCopyrightString()); + } + + public void printUsage() { + if (!hasPrintedUsage) { + config.getOutput().print(config.getBasicUsageHelp()); + hasPrintedUsage = true; + } + } + + public void printProperties() { + config.getOutput().print(config.getPropertyHelp()); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.lang.ref.SoftReference; + +import org.jruby.runtime.builtin.IRubyObject; + +public final class MetaClass extends RubyClass { + + private SoftReference<IRubyObject> attached = new SoftReference<IRubyObject>(null); + + /** NEWOBJ (in RubyObject#getSingletonClassClone()) + * + */ + public MetaClass(Ruby runtime) { + super(runtime, null, false); + } + + /** rb_class_boot (for MetaClasses) (in makeMetaClass(RubyClass)) + * + */ + public MetaClass(Ruby runtime, RubyClass superClass) { + super(runtime, superClass, false); + index = superClass.index; // use same ClassIndex as metaclass, since we're technically still of that type + } + + public boolean isSingleton() { + return true; + } + + /** + * If an object uses an anonymous class 'class << obj', then this grabs the original + * metaclass and not the one that get injected as a result of 'class << obj'. + */ + public RubyClass getRealClass() { + return superClass.getRealClass(); + } + + public final IRubyObject allocate(){ + throw getRuntime().newTypeError("can't create instance of virtual class"); + } + + public IRubyObject getAttached() { + return attached.get(); + } + + public void setAttached(IRubyObject attached) { + this.attached = new SoftReference<IRubyObject>(attached); + } + +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2005 David Corbin <dcorbin@users.sourceforge.net> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.PrintStream; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.javasupport.Java; +import org.jruby.javasupport.JavaObject; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.builtin.IRubyObject; + +@JRubyClass(name = "NativeException", parent = "RuntimeError") +public class NativeException extends RubyException { + + private final Throwable cause; + public static final String CLASS_NAME = "NativeException"; + private final Ruby runtime; + + public NativeException(Ruby runtime, RubyClass rubyClass, Throwable cause) { + super(runtime, rubyClass, cause.getClass().getName() + ": " + cause.getMessage()); + this.runtime = runtime; + this.cause = cause; + } + + public static RubyClass createClass(Ruby runtime, RubyClass baseClass) { + // FIXME: If NativeException is expected to be used from Ruby code, it should provide + // a real allocator to be used. Otherwise Class.new will fail, as will marshalling. JRUBY-415 + RubyClass exceptionClass = runtime.defineClass(CLASS_NAME, baseClass, ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + + exceptionClass.defineAnnotatedMethods(NativeException.class); + + return exceptionClass; + } + + @JRubyMethod(frame = true) + public IRubyObject cause(Block unusedBlock) { + return Java.wrap(getRuntime(), JavaObject.wrap(getRuntime(), cause)); + } + + public IRubyObject backtrace() { + IRubyObject rubyTrace = super.backtrace(); + if (rubyTrace.isNil()) { + return rubyTrace; + } + RubyArray array = (RubyArray) rubyTrace.dup(); + StackTraceElement[] stackTrace = cause.getStackTrace(); + for (int i = stackTrace.length - 1; i >= 0; i--) { + StackTraceElement element = stackTrace[i]; + String className = element.getClassName(); + String line = null; + if (element.getFileName() == null) { + line = className + ":" + element.getLineNumber() + ":in `" + element.getMethodName() + "'"; + } else { + int index = className.lastIndexOf("."); + String packageName = null; + if (index == -1) { + packageName = ""; + } else { + packageName = className.substring(0, index) + "/"; + } + line = packageName.replace(".", "/") + element.getFileName() + ":" + element.getLineNumber() + ":in `" + element.getMethodName() + "'"; + } + RubyString string = runtime.newString(line); + array.unshift(string); + } + return array; + } + + public void printBacktrace(PrintStream errorStream) { + super.printBacktrace(errorStream); + errorStream.println("Complete Java stackTrace"); + cause.printStackTrace(errorStream); + } + + public Throwable getCause() { + return cause; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +public interface Profile { + Profile ALL = new Profile() { + public boolean allowBuiltin(String name) { return true; } + public boolean allowClass(String name) { return true; } + public boolean allowModule(String name) { return true; } + public boolean allowLoad(String name) { return true; } + public boolean allowRequire(String name) { return true; } + }; + Profile DEBUG_ALLOW = new Profile() { + public boolean allowBuiltin(String name) { System.err.println("allowBuiltin("+name+")"); return true; } + public boolean allowClass(String name) { System.err.println("allowClass("+name+")"); return true; } + public boolean allowModule(String name) { System.err.println("allowModule("+name+")"); return true; } + public boolean allowLoad(String name) { System.err.println("allowLoad("+name+")"); return true; } + public boolean allowRequire(String name) { System.err.println("allowRequire("+name+")"); return true; } + }; + Profile NO_FILE_CLASS = new Profile() { + public boolean allowBuiltin(String name) { return true; } + public boolean allowClass(String name) { return !name.equals("File"); } + public boolean allowModule(String name) { return true; } + public boolean allowLoad(String name) { return true; } + public boolean allowRequire(String name) { return true; } + }; + Profile ANY = ALL; + Profile DEFAULT = ALL; + + boolean allowBuiltin(String name); + boolean allowClass(String name); + boolean allowModule(String name); + boolean allowLoad(String name); + boolean allowRequire(String name); +}// Profile +/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2006 Michael Studman <codehaus@michaelstudman.com> + * Copyright (C) 2006 Ola Bini <ola@ologix.com> + * Copyright (C) 2007 Nick Sieger <nicksieger@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileDescriptor; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.Stack; +import java.util.Vector; +import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import org.joda.time.DateTimeZone; +import org.jruby.ast.Node; +import org.jruby.ast.executable.RubiniusRunner; +import org.jruby.ast.executable.Script; +import org.jruby.ast.executable.YARVCompiledRunner; +import org.jruby.common.RubyWarnings; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.compiler.ASTCompiler; +import org.jruby.compiler.ASTInspector; +import org.jruby.compiler.JITCompiler; +import org.jruby.compiler.NotCompilableException; +import org.jruby.compiler.impl.StandardASMCompiler; +import org.jruby.compiler.yarv.StandardYARVCompiler; +import org.jruby.exceptions.JumpException; +import org.jruby.exceptions.RaiseException; +import org.jruby.ext.JRubyPOSIXHandler; +import org.jruby.ext.LateLoadingLibrary; +import org.jruby.ext.posix.POSIX; +import org.jruby.ext.posix.POSIXFactory; +import org.jruby.internal.runtime.GlobalVariables; +import org.jruby.internal.runtime.ThreadService; +import org.jruby.internal.runtime.ValueAccessor; +import org.jruby.javasupport.JavaSupport; +import org.jruby.management.BeanManager; +import org.jruby.management.ClassCache; +import org.jruby.management.Config; +import org.jruby.parser.Parser; +import org.jruby.parser.ParserConfiguration; +import org.jruby.runtime.Binding; +import org.jruby.runtime.Block; +import org.jruby.runtime.CacheMap; +import org.jruby.runtime.CallSite; +import org.jruby.runtime.CallbackFactory; +import org.jruby.runtime.DynamicScope; +import org.jruby.runtime.EventHook; +import org.jruby.runtime.GlobalVariable; +import org.jruby.runtime.IAccessor; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ObjectSpace; +import org.jruby.runtime.RubyEvent; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; +import org.jruby.runtime.load.LoadService; +import org.jruby.util.BuiltinScript; +import org.jruby.util.ByteList; +import org.jruby.util.IOInputStream; +import org.jruby.util.IOOutputStream; +import org.jruby.util.JRubyClassLoader; +import org.jruby.util.JavaNameMangler; +import org.jruby.util.KCode; +import org.jruby.util.SafePropertyAccessor; +import org.jruby.util.collections.WeakHashSet; +import org.jruby.util.io.ChannelDescriptor; + +/** + * The Ruby object represents the top-level of a JRuby "instance" in a given VM. + * JRuby supports spawning multiple instances in the same JVM. Generally, objects + * created under these instances are tied to a given runtime, for such details + * as identity and type, because multiple Ruby instances means there are + * multiple instances of each class. This means that in multi-runtime mode + * (or really, multi-VM mode, where each JRuby instance is a ruby "VM"), objects + * generally can't be transported across runtimes without marshaling. + * + * This class roots everything that makes the JRuby runtime function, and + * provides a number of utility methods for constructing global types and + * accessing global runtime structures. + */ +public final class Ruby { + /** + * Returns a new instance of the JRuby runtime configured with defaults. + * + * @return the JRuby runtime + * @see org.jruby.RubyInstanceConfig + */ + public static Ruby newInstance() { + return newInstance(new RubyInstanceConfig()); + } + + /** + * Returns a new instance of the JRuby runtime configured as specified. + * + * @param config The instance configuration + * @return The JRuby runtime + * @see org.jruby.RubyInstanceConfig + */ + public static Ruby newInstance(RubyInstanceConfig config) { + Ruby ruby = new Ruby(config); + ruby.init(); + return ruby; + } + + /** + * Returns a new instance of the JRuby runtime configured with the given + * input, output and error streams and otherwise default configuration + * (except where specified system properties alter defaults). + * + * @param in the custom input stream + * @param out the custom output stream + * @param err the custom error stream + * @return the JRuby runtime + * @see org.jruby.RubyInstanceConfig + */ + public static Ruby newInstance(InputStream in, PrintStream out, PrintStream err) { + RubyInstanceConfig config = new RubyInstanceConfig(); + config.setInput(in); + config.setOutput(out); + config.setError(err); + return newInstance(config); + } + + /** + * Create and initialize a new JRuby runtime. The properties of the + * specified RubyInstanceConfig will be used to determine various JRuby + * runtime characteristics. + * + * @param config The configuration to use for the new instance + * @see org.jruby.RubyInstanceConfig + */ + private Ruby(RubyInstanceConfig config) { + this.config = config; + this.threadService = new ThreadService(this); + if(config.isSamplingEnabled()) { + org.jruby.util.SimpleSampler.registerThreadContext(threadService.getCurrentContext()); + } + + this.in = config.getInput(); + this.out = config.getOutput(); + this.err = config.getError(); + this.objectSpaceEnabled = config.isObjectSpaceEnabled(); + this.profile = config.getProfile(); + this.currentDirectory = config.getCurrentDirectory(); + this.kcode = config.getKCode(); + this.beanManager = new BeanManager(this, config.isManagementEnabled()); + this.jitCompiler = new JITCompiler(this); + + this.beanManager.register(new Config(this)); + this.beanManager.register(new ClassCache(this)); + + this.cacheMap = new CacheMap(this); + } + + /** + * Evaluates a script under the current scope (perhaps the top-level + * scope) and returns the result (generally the last value calculated). + * This version goes straight into the interpreter, bypassing compilation + * and runtime preparation typical to normal script runs. + * + * @param script The scriptlet to run + * @returns The result of the eval + */ + public IRubyObject evalScriptlet(String script) { + ThreadContext context = getCurrentContext(); + Node node = parseEval(script, "<script>", context.getCurrentScope(), 0); + + try { + return node.interpret(this, context, context.getFrameSelf(), Block.NULL_BLOCK); + } catch (JumpException.ReturnJump rj) { + throw newLocalJumpError("return", (IRubyObject)rj.getValue(), "unexpected return"); + } catch (JumpException.BreakJump bj) { + throw newLocalJumpError("break", (IRubyObject)bj.getValue(), "unexpected break"); + } catch (JumpException.RedoJump rj) { + throw newLocalJumpError("redo", (IRubyObject)rj.getValue(), "unexpected redo"); + } + } + + /** + * Parse and execute the specified script + * This differs from the other methods in that it accepts a string-based script and + * parses and runs it as though it were loaded at a command-line. This is the preferred + * way to start up a new script when calling directly into the Ruby object (which is + * generally *dis*couraged. + * + * @param script The contents of the script to run as a normal, root script + * @return The last value of the script + */ + public IRubyObject executeScript(String script, String filename) { + byte[] bytes; + + try { + bytes = script.getBytes(KCode.NONE.getKCode()); + } catch (UnsupportedEncodingException e) { + bytes = script.getBytes(); + } + + Node node = parseInline(new ByteArrayInputStream(bytes), filename, null); + ThreadContext context = getCurrentContext(); + + String oldFile = context.getFile(); + int oldLine = context.getLine(); + try { + context.setFile(node.getPosition().getFile()); + context.setLine(node.getPosition().getStartLine()); + return runNormally(node, false); + } finally { + context.setFile(oldFile); + context.setLine(oldLine); + } + } + + /** + * Run the script contained in the specified input stream, using the + * specified filename as the name of the script being executed. The stream + * will be read fully before being parsed and executed. The given filename + * will be used for the ruby $PROGRAM_NAME and $0 global variables in this + * runtime. + * + * This method is intended to be called once per runtime, generally from + * Main or from main-like top-level entry points. + * + * As part of executing the script loaded from the input stream, various + * RubyInstanceConfig properties will be used to determine whether to + * compile the script before execution or run with various wrappers (for + * looping, printing, and so on, see jruby -help). + * + * @param inputStream The InputStream from which to read the script contents + * @param filename The filename to use when parsing, and for $PROGRAM_NAME + * and $0 ruby global variables. + */ + public void runFromMain(InputStream inputStream, String filename) { + IAccessor d = new ValueAccessor(newString(filename)); + getGlobalVariables().define("$PROGRAM_NAME", d); + getGlobalVariables().define("$0", d); + + for (Iterator i = config.getOptionGlobals().entrySet().iterator(); i.hasNext();) { + Map.Entry entry = (Map.Entry) i.next(); + Object value = entry.getValue(); + IRubyObject varvalue; + if (value != null) { + varvalue = newString(value.toString()); + } else { + varvalue = getTrue(); + } + getGlobalVariables().set("$" + entry.getKey().toString(), varvalue); + } + + + if(config.isYARVEnabled()) { + if (config.isShowBytecode()) System.err.print("error: bytecode printing only works with JVM bytecode"); + new YARVCompiledRunner(this, inputStream, filename).run(); + } else if(config.isRubiniusEnabled()) { + if (config.isShowBytecode()) System.err.print("error: bytecode printing only works with JVM bytecode"); + new RubiniusRunner(this, inputStream, filename).run(); + } else { + Node scriptNode = parseFromMain(inputStream, filename); + ThreadContext context = getCurrentContext(); + + String oldFile = context.getFile(); + int oldLine = context.getLine(); + try { + context.setFile(scriptNode.getPosition().getFile()); + context.setLine(scriptNode.getPosition().getStartLine()); + + if (config.isAssumePrinting() || config.isAssumeLoop()) { + runWithGetsLoop(scriptNode, config.isAssumePrinting(), config.isProcessLineEnds(), + config.isSplit(), config.isYARVCompileEnabled()); + } else { + runNormally(scriptNode, config.isYARVCompileEnabled()); + } + } finally { + context.setFile(oldFile); + context.setLine(oldLine); + } + } + } + + /** + * Parse the script contained in the given input stream, using the given + * filename as the name of the script, and return the root Node. This + * is used to verify that the script syntax is valid, for jruby -c. The + * current scope (generally the top-level scope) is used as the parent + * scope for parsing. + * + * @param inputStream The input stream from which to read the script + * @param filename The filename to use for parsing + * @returns The root node of the parsed script + */ + public Node parseFromMain(InputStream inputStream, String filename) { + if (config.isInlineScript()) { + return parseInline(inputStream, filename, getCurrentContext().getCurrentScope()); + } else { + return parseFile(inputStream, filename, getCurrentContext().getCurrentScope()); + } + } + + /** + * Run the given script with a "while gets; end" loop wrapped around it. + * This is primarily used for the -n command-line flag, to allow writing + * a short script that processes input lines using the specified code. + * + * @param scriptNode The root node of the script to execute + * @param printing Whether $_ should be printed after each loop (as in the + * -p command-line flag) + * @param processLineEnds Whether line endings should be processed by + * setting $\ to $/ and <code>chop!</code>ing every line read + * @param split Whether to split each line read using <code>String#split</code> + * @param yarvCompile Whether to compile the target script to YARV (Ruby 1.9) + * bytecode before executing. + * @return The result of executing the specified script + */ + public IRubyObject runWithGetsLoop(Node scriptNode, boolean printing, boolean processLineEnds, boolean split, boolean yarvCompile) { + ThreadContext context = getCurrentContext(); + + Script script = null; + YARVCompiledRunner runner = null; + boolean compile = getInstanceConfig().getCompileMode().shouldPrecompileCLI(); + if (compile || !yarvCompile) { + script = tryCompile(scriptNode); + if (compile && script == null) { + // terminate; tryCompile will have printed out an error and we're done + return getNil(); + } + } else if (yarvCompile) { + runner = tryCompileYarv(scriptNode); + } + + if (processLineEnds) { + getGlobalVariables().set("$\\", getGlobalVariables().get("$/")); + } + + while (RubyKernel.gets(context, getTopSelf(), IRubyObject.NULL_ARRAY).isTrue()) { + loop: while (true) { // Used for the 'redo' command + try { + if (processLineEnds) { + getGlobalVariables().get("$_").callMethod(context, "chop!"); + } + + if (split) { + getGlobalVariables().set("$F", getGlobalVariables().get("$_").callMethod(context, "split")); + } + + if (script != null) { + runScript(script); + } else if (runner != null) { + runYarv(runner); + } else { + runInterpreter(scriptNode); + } + + if (printing) RubyKernel.print(context, getKernel(), new IRubyObject[] {getGlobalVariables().get("$_")}); + break loop; + } catch (JumpException.RedoJump rj) { + // do nothing, this iteration restarts + } catch (JumpException.NextJump nj) { + // recheck condition + break loop; + } catch (JumpException.BreakJump bj) { + // end loop + return (IRubyObject) bj.getValue(); + } + } + } + + return getNil(); + } + + /** + * Run the specified script without any of the loop-processing wrapper + * code. + * + * @param scriptNode The root node of the script to be executed + * @param yarvCompile Whether to compile the script to YARV (Ruby 1.9) + * bytecode before execution + * @return The result of executing the script + */ + public IRubyObject runNormally(Node scriptNode, boolean yarvCompile) { + Script script = null; + YARVCompiledRunner runner = null; + boolean compile = getInstanceConfig().getCompileMode().shouldPrecompileCLI(); + boolean forceCompile = getInstanceConfig().getCompileMode().shouldPrecompileAll(); + if (yarvCompile) { + runner = tryCompileYarv(scriptNode); + } else if (compile) { + script = tryCompile(scriptNode); + if (forceCompile && script == null) { + System.err.println("Error, could not compile; pass -J-Djruby.jit.logging.verbose=true for more details"); + return getNil(); + } + } + + if (script != null) { + if (config.isShowBytecode()) { + return nilObject; + } else { + return runScript(script); + } + } else if (runner != null) { + return runYarv(runner); + } else { + if (config.isShowBytecode()) System.err.print("error: bytecode printing only works with JVM bytecode"); + return runInterpreter(scriptNode); + } + } + + private Script tryCompile(Node node) { + return tryCompile(node, new JRubyClassLoader(getJRubyClassLoader())); + } + + private Script tryCompile(Node node, JRubyClassLoader classLoader) { + Script script = null; + try { + String filename = node.getPosition().getFile(); + String classname = JavaNameMangler.mangledFilenameForStartupClasspath(filename); + + ASTInspector inspector = new ASTInspector(); + inspector.inspect(node); + + StandardASMCompiler asmCompiler = new StandardASMCompiler(classname, filename); + ASTCompiler compiler = new ASTCompiler(); + if (config.isShowBytecode()) { + compiler.compileRoot(node, asmCompiler, inspector, false, false); + asmCompiler.dumpClass(System.out); + } else { + compiler.compileRoot(node, asmCompiler, inspector, true, false); + } + script = (Script)asmCompiler.loadClass(classLoader).newInstance(); + + if (config.isJitLogging()) { + System.err.println("compiled: " + node.getPosition().getFile()); + } + } catch (NotCompilableException nce) { + if (config.isJitLoggingVerbose()) { + System.err.println("Error -- Not compileable: " + nce.getMessage()); + nce.printStackTrace(); + } + } catch (ClassNotFoundException e) { + if (config.isJitLoggingVerbose()) { + System.err.println("Error -- Not compileable: " + e.getMessage()); + e.printStackTrace(); + } + } catch (InstantiationException e) { + if (config.isJitLoggingVerbose()) { + System.err.println("Error -- Not compileable: " + e.getMessage()); + e.printStackTrace(); + } + } catch (IllegalAccessException e) { + if (config.isJitLoggingVerbose()) { + System.err.println("Error -- Not compileable: " + e.getMessage()); + e.printStackTrace(); + } + } catch (Throwable t) { + if (config.isJitLoggingVerbose()) { + System.err.println("could not compile: " + node.getPosition().getFile() + " because of: \"" + t.getMessage() + "\""); + t.printStackTrace(); + } + } + + return script; + } + + private YARVCompiledRunner tryCompileYarv(Node node) { + try { + StandardYARVCompiler compiler = new StandardYARVCompiler(this); + ASTCompiler.getYARVCompiler().compile(node, compiler); + org.jruby.lexer.yacc.ISourcePosition p = node.getPosition(); + if(p == null && node instanceof org.jruby.ast.RootNode) { + p = ((org.jruby.ast.RootNode)node).getBodyNode().getPosition(); + } + return new YARVCompiledRunner(this,compiler.getInstructionSequence("<main>",p.getFile(),"toplevel")); + } catch (NotCompilableException nce) { + System.err.println("Error -- Not compileable: " + nce.getMessage()); + return null; + } catch (JumpException.ReturnJump rj) { + return null; + } + } + + private IRubyObject runScript(Script script) { + ThreadContext context = getCurrentContext(); + + try { + return script.load(context, context.getFrameSelf(), IRubyObject.NULL_ARRAY, Block.NULL_BLOCK); + } catch (JumpException.ReturnJump rj) { + return (IRubyObject) rj.getValue(); + } + } + + private IRubyObject runYarv(YARVCompiledRunner runner) { + try { + return runner.run(); + } catch (JumpException.ReturnJump rj) { + return (IRubyObject) rj.getValue(); + } + } + + private IRubyObject runInterpreter(Node scriptNode) { + ThreadContext context = getCurrentContext(); + + assert scriptNode != null : "scriptNode is not null"; + + try { + return scriptNode.interpret(this, context, getTopSelf(), Block.NULL_BLOCK); + } catch (JumpException.ReturnJump rj) { + return (IRubyObject) rj.getValue(); + } + } + + public BeanManager getBeanManager() { + return beanManager; + } + + public JITCompiler getJITCompiler() { + return jitCompiler; + } + + /** + * @deprecated use #newInstance() + */ + public static Ruby getDefaultInstance() { + return newInstance(); + } + + @Deprecated + public static Ruby getCurrentInstance() { + return null; + } + + @Deprecated + public static void setCurrentInstance(Ruby runtime) { + } + + public int allocSymbolId() { + return symbolLastId.incrementAndGet(); + } + public int allocModuleId() { + return moduleLastId.incrementAndGet(); + } + + /** + * Retrieve the module with the given name from the Object namespace. + * + * @param name The name of the module + * @return The module or null if not found + */ + public RubyModule getModule(String name) { + return (RubyModule) objectClass.getConstantAt(name); + } + + /** + * Retrieve the module with the given name from the Object namespace. The + * module name must be an interned string, but this method will be faster + * than the non-interned version. + * + * @param internedName The name of the module; <em>must</em> be an interned String + * @return The module or null if not found + */ + public RubyModule fastGetModule(String internedName) { + return (RubyModule) objectClass.fastGetConstantAt(internedName); + } + + /** + * Retrieve the class with the given name from the Object namespace. + * + * @param name The name of the class + * @return The class + */ + public RubyClass getClass(String name) { + return objectClass.getClass(name); + } + + /** + * Retrieve the class with the given name from the Object namespace. The + * module name must be an interned string, but this method will be faster + * than the non-interned version. + * + * @param internedName the name of the class; <em>must</em> be an interned String! + * @return + */ + public RubyClass fastGetClass(String internedName) { + return objectClass.fastGetClass(internedName); + } + + /** + * Define a new class under the Object namespace. Roughly equivalent to + * rb_define_class in MRI. + * + * @param name The name for the new class + * @param superClass The super class for the new class + * @param allocator An ObjectAllocator instance that can construct + * instances of the new class. + * @return The new class + */ + public RubyClass defineClass(String name, RubyClass superClass, ObjectAllocator allocator) { + return defineClassUnder(name, superClass, allocator, objectClass); + } + + /** + * A variation of defineClass that allows passing in an array of subplementary + * call sites for improving dynamic invocation performance. + * + * @param name The name for the new class + * @param superClass The super class for the new class + * @param allocator An ObjectAllocator instance that can construct + * instances of the new class. + * @return The new class + */ + public RubyClass defineClass(String name, RubyClass superClass, ObjectAllocator allocator, CallSite[] callSites) { + return defineClassUnder(name, superClass, allocator, objectClass, callSites); + } + + /** + * Define a new class with the given name under the given module or class + * namespace. Roughly equivalent to rb_define_class_under in MRI. + * + * If the name specified is already bound, its value will be returned if: + * * It is a class + * * No new superclass is being defined + * + * @param name The name for the new class + * @param superClass The super class for the new class + * @param allocator An ObjectAllocator instance that can construct + * instances of the new class. + * @param parent The namespace under which to define the new class + * @return The new class + */ + public RubyClass defineClassUnder(String name, RubyClass superClass, ObjectAllocator allocator, RubyModule parent) { + return defineClassUnder(name, superClass, allocator, parent, null); + } + + /** + * A variation of defineClassUnder that allows passing in an array of + * supplementary call sites to improve dynamic invocation. + * + * @param name The name for the new class + * @param superClass The super class for the new class + * @param allocator An ObjectAllocator instance that can construct + * instances of the new class. + * @param parent The namespace under which to define the new class + * @param callSites The array of call sites to add + * @return The new class + */ + public RubyClass defineClassUnder(String name, RubyClass superClass, ObjectAllocator allocator, RubyModule parent, CallSite[] callSites) { + IRubyObject classObj = parent.getConstantAt(name); + + if (classObj != null) { + if (!(classObj instanceof RubyClass)) throw newTypeError(name + " is not a class"); + RubyClass klazz = (RubyClass)classObj; + if (klazz.getSuperClass().getRealClass() != superClass) { + throw newNameError(name + " is already defined", name); + } + // If we define a class in Ruby, but later want to allow it to be defined in Java, + // the allocator needs to be updated + if (klazz.getAllocator() != allocator) { + klazz.setAllocator(allocator); + } + return klazz; + } + + boolean parentIsObject = parent == objectClass; + + if (superClass == null) { + String className = parentIsObject ? name : parent.getName() + "::" + name; + warnings.warn(ID.NO_SUPER_CLASS, "no super class for `" + className + "', Object assumed", className); + + superClass = objectClass; + } + + return RubyClass.newClass(this, superClass, name, allocator, parent, !parentIsObject, callSites); + } + + /** + * Define a new module under the Object namespace. Roughly equivalent to + * rb_define_module in MRI. + * + * @param name The name of the new module + * @returns The new module + */ + public RubyModule defineModule(String name) { + return defineModuleUnder(name, objectClass); + } + + /** + * Define a new module with the given name under the given module or + * class namespace. Roughly equivalent to rb_define_module_under in MRI. + * + * @param name The name of the new module + * @param parent The class or module namespace under which to define the + * module + * @returns The new module + */ + public RubyModule defineModuleUnder(String name, RubyModule parent) { + IRubyObject moduleObj = parent.getConstantAt(name); + + boolean parentIsObject = parent == objectClass; + + if (moduleObj != null ) { + if (moduleObj.isModule()) return (RubyModule)moduleObj; + + if (parentIsObject) { + throw newTypeError(moduleObj.getMetaClass().getName() + " is not a module"); + } else { + throw newTypeError(parent.getName() + "::" + moduleObj.getMetaClass().getName() + " is not a module"); + } + } + + return RubyModule.newModule(this, name, parent, !parentIsObject); + } + + /** + * From Object, retrieve the named module. If it doesn't exist a + * new module is created. + * + * @param name The name of the module + * @returns The existing or new module + */ + public RubyModule getOrCreateModule(String name) { + IRubyObject module = objectClass.getConstantAt(name); + if (module == null) { + module = defineModule(name); + } else if (getSafeLevel() >= 4) { + throw newSecurityError("Extending module prohibited."); + } else if (!module.isModule()) { + throw newTypeError(name + " is not a Module"); + } + + return (RubyModule) module; + } + + + /** + * Retrieve the current safe level. + * + * @see org.jruby.Ruby#setSaveLevel + */ + public int getSafeLevel() { + return this.safeLevel; + } + + + /** + * Set the current safe level: + * + * 0 - strings from streams/environment/ARGV are tainted (default) + * 1 - no dangerous operation by tainted value + * 2 - process/file operations prohibited + * 3 - all generated objects are tainted + * 4 - no global (non-tainted) variable modification/no direct output + * + * The safe level is set using $SAFE in Ruby code. It is not particularly + * well supported in JRuby. + */ + public void setSafeLevel(int safeLevel) { + this.safeLevel = safeLevel; + } + + public KCode getKCode() { + return kcode; + } + + public void setKCode(KCode kcode) { + this.kcode = kcode; + } + + public void secure(int level) { + if (level <= safeLevel) { + throw newSecurityError("Insecure operation '" + getCurrentContext().getFrameName() + "' at level " + safeLevel); + } + } + + // FIXME moved this here to get what's obviously a utility method out of IRubyObject. + // perhaps security methods should find their own centralized home at some point. + public void checkSafeString(IRubyObject object) { + if (getSafeLevel() > 0 && object.isTaint()) { + ThreadContext tc = getCurrentContext(); + if (tc.getFrameName() != null) { + throw newSecurityError("Insecure operation - " + tc.getFrameName()); + } + throw newSecurityError("Insecure operation: -r"); + } + secure(4); + if (!(object instanceof RubyString)) { + throw newTypeError( + "wrong argument type " + object.getMetaClass().getName() + " (expected String)"); + } + } + + /** rb_define_global_const + * + */ + public void defineGlobalConstant(String name, IRubyObject value) { + objectClass.defineConstant(name, value); + } + + public boolean isClassDefined(String name) { + return getModule(name) != null; + } + + /** + * A ThreadFactory for when we're using pooled threads; we want to create + * the threads with daemon = true so they don't keep us from shutting down. + */ + public static class DaemonThreadFactory implements ThreadFactory { + public Thread newThread(Runnable runnable) { + Thread thread = new Thread(runnable); + thread.setDaemon(true); + + return thread; + } + } + + /** + * This method is called immediately after constructing the Ruby instance. + * The main thread is prepared for execution, all core classes and libraries + * are initialized, and any libraries required on the command line are + * loaded. + */ + private void init() { + // Get the main threadcontext (gets constructed for us) + ThreadContext tc = getCurrentContext(); + + safeLevel = config.getSafeLevel(); + + // Construct key services + loadService = config.createLoadService(this); + posix = POSIXFactory.getPOSIX(new JRubyPOSIXHandler(this), RubyInstanceConfig.nativeEnabled); + javaSupport = new JavaSupport(this); + + if (RubyInstanceConfig.POOLING_ENABLED) { + Executors.newCachedThreadPool(); + executor = new ThreadPoolExecutor( + RubyInstanceConfig.POOL_MIN, + RubyInstanceConfig.POOL_MAX, + RubyInstanceConfig.POOL_TTL, + TimeUnit.SECONDS, + new SynchronousQueue<Runnable>(), + new DaemonThreadFactory()); + } + + // initialize the root of the class hierarchy completely + initRoot(tc); + + // Construct the top-level execution frame and scope for the main thread + tc.prepareTopLevel(objectClass, topSelf); + + // Initialize all the core classes + bootstrap(); + + // Create global constants and variables + RubyGlobal.createGlobals(tc, this); + + // Prepare LoadService and load path + getLoadService().init(config.loadPaths()); + + // initialize builtin libraries + initBuiltins(); + + // Require in all libraries specified on command line + for (String scriptName : config.requiredLibraries()) { + RubyKernel.require(getTopSelf(), newString(scriptName), Block.NULL_BLOCK); + } + } + + private void bootstrap() { + initCore(); + initExceptions(); + } + + private void initRoot(ThreadContext context) { + // Bootstrap the top of the hierarchy + objectClass = RubyClass.createBootstrapClass(this, "Object", null, RubyObject.OBJECT_ALLOCATOR); + moduleClass = RubyClass.createBootstrapClass(this, "Module", objectClass, RubyModule.MODULE_ALLOCATOR); + classClass = RubyClass.createBootstrapClass(this, "Class", moduleClass, RubyClass.CLASS_ALLOCATOR); + + objectClass.setMetaClass(classClass); + moduleClass.setMetaClass(classClass); + classClass.setMetaClass(classClass); + + RubyClass metaClass; + metaClass = objectClass.makeMetaClass(classClass); + metaClass = moduleClass.makeMetaClass(metaClass); + metaClass = classClass.makeMetaClass(metaClass); + + RubyObject.createObjectClass(this, objectClass); + RubyModule.createModuleClass(this, moduleClass); + RubyClass.createClassClass(this, classClass); + + // set constants now that they're initialized + objectClass.setConstant("Object", objectClass); + objectClass.setConstant("Class", classClass); + objectClass.setConstant("Module", moduleClass); + + // Initialize Kernel and include into Object + RubyKernel.createKernelModule(this); + objectClass.includeModule(kernelModule); + + // Initialize the "dummy" class used as a marker + dummyClass = new RubyClass(this); + dummyClass.freeze(context); + + // Object is ready, create top self + topSelf = TopSelfFactory.createTopSelf(this); + } + + private void initCore() { + // Pre-create all the core classes potentially referenced during startup + RubyNil.createNilClass(this); + RubyBoolean.createFalseClass(this); + RubyBoolean.createTrueClass(this); + + nilObject = new RubyNil(this); + falseObject = new RubyBoolean(this, false); + trueObject = new RubyBoolean(this, true); + + RubyComparable.createComparable(this); + RubyEnumerable.createEnumerableModule(this); + RubyString.createStringClass(this); + RubySymbol.createSymbolClass(this); + + if (profile.allowClass("ThreadGroup")) { + RubyThreadGroup.createThreadGroupClass(this); + } + if (profile.allowClass("Thread")) { + RubyThread.createThreadClass(this); + } + if (profile.allowClass("Exception")) { + RubyException.createExceptionClass(this); + } + if (profile.allowModule("Precision")) { + RubyPrecision.createPrecisionModule(this); + } + if (profile.allowClass("Numeric")) { + RubyNumeric.createNumericClass(this); + } + if (profile.allowClass("Integer")) { + RubyInteger.createIntegerClass(this); + } + if (profile.allowClass("Fixnum")) { + RubyFixnum.createFixnumClass(this); + } + + if (config.getCompatVersion() == CompatVersion.RUBY1_9) { + if (profile.allowClass("Complex")) { + RubyComplex.createComplexClass(this); + } + if (profile.allowClass("Rational")) { + RubyRational.createRationalClass(this); + } + } + + if (profile.allowClass("Hash")) { + RubyHash.createHashClass(this); + } + if (profile.allowClass("Array")) { + RubyArray.createArrayClass(this); + } + if (profile.allowClass("Float")) { + RubyFloat.createFloatClass(this); + } + if (profile.allowClass("Bignum")) { + RubyBignum.createBignumClass(this); + } + ioClass = RubyIO.createIOClass(this); + + if (profile.allowClass("Struct")) { + RubyStruct.createStructClass(this); + } + if (profile.allowClass("Tms")) { + tmsStruct = RubyStruct.newInstance(structClass, new IRubyObject[]{newString("Tms"), newSymbol("utime"), newSymbol("stime"), newSymbol("cutime"), newSymbol("cstime")}, Block.NULL_BLOCK); + } + + if (profile.allowClass("Binding")) { + RubyBinding.createBindingClass(this); + } + // Math depends on all numeric types + if (profile.allowModule("Math")) { + RubyMath.createMathModule(this); + } + if (profile.allowClass("Regexp")) { + RubyRegexp.createRegexpClass(this); + } + if (profile.allowClass("Range")) { + RubyRange.createRangeClass(this); + } + if (profile.allowModule("ObjectSpace")) { + RubyObjectSpace.createObjectSpaceModule(this); + } + if (profile.allowModule("GC")) { + RubyGC.createGCModule(this); + } + if (profile.allowClass("Proc")) { + RubyProc.createProcClass(this); + } + if (profile.allowClass("Method")) { + RubyMethod.createMethodClass(this); + } + if (profile.allowClass("MatchData")) { + RubyMatchData.createMatchDataClass(this); + } + if (profile.allowModule("Marshal")) { + RubyMarshal.createMarshalModule(this); + } + if (profile.allowClass("Dir")) { + RubyDir.createDirClass(this); + } + if (profile.allowModule("FileTest")) { + RubyFileTest.createFileTestModule(this); + } + // depends on IO, FileTest + if (profile.allowClass("File")) { + RubyFile.createFileClass(this); + } + if (profile.allowClass("File::Stat")) { + RubyFileStat.createFileStatClass(this); + } + if (profile.allowModule("Process")) { + RubyProcess.createProcessModule(this); + } + if (profile.allowClass("Time")) { + RubyTime.createTimeClass(this); + } + if (profile.allowClass("UnboundMethod")) { + RubyUnboundMethod.defineUnboundMethodClass(this); + } + if (profile.allowClass("Data")) { + defineClass("Data", objectClass, objectClass.getAllocator()); + } + if (!isSecurityRestricted()) { + // Signal uses sun.misc.* classes, this is not allowed + // in the security-sensitive environments + if (profile.allowModule("Signal")) { + RubySignal.createSignal(this); + } + } + if (profile.allowClass("Continuation")) { + RubyContinuation.createContinuation(this); + } + } + + private void initExceptions() { + standardError = defineClassIfAllowed("StandardError", exceptionClass); + runtimeError = defineClassIfAllowed("RuntimeError", standardError); + ioError = defineClassIfAllowed("IOError", standardError); + scriptError = defineClassIfAllowed("ScriptError", exceptionClass); + rangeError = defineClassIfAllowed("RangeError", standardError); + signalException = defineClassIfAllowed("SignalException", exceptionClass); + + if (profile.allowClass("NameError")) { + nameError = RubyNameError.createNameErrorClass(this, standardError); + nameErrorMessage = RubyNameError.createNameErrorMessageClass(this, nameError); + } + if (profile.allowClass("NoMethodError")) { + noMethodError = RubyNoMethodError.createNoMethodErrorClass(this, nameError); + } + if (profile.allowClass("SystemExit")) { + systemExit = RubySystemExit.createSystemExitClass(this, exceptionClass); + } + if (profile.allowClass("LocalJumpError")) { + localJumpError = RubyLocalJumpError.createLocalJumpErrorClass(this, standardError); + } + if (profile.allowClass("NativeException")) { + nativeException = NativeException.createClass(this, runtimeError); + } + if (profile.allowClass("SystemCallError")) { + systemCallError = RubySystemCallError.createSystemCallErrorClass(this, standardError); + } + + fatal = defineClassIfAllowed("Fatal", exceptionClass); + interrupt = defineClassIfAllowed("Interrupt", signalException); + typeError = defineClassIfAllowed("TypeError", standardError); + argumentError = defineClassIfAllowed("ArgumentError", standardError); + indexError = defineClassIfAllowed("IndexError", standardError); + syntaxError = defineClassIfAllowed("SyntaxError", scriptError); + loadError = defineClassIfAllowed("LoadError", scriptError); + notImplementedError = defineClassIfAllowed("NotImplementedError", scriptError); + securityError = defineClassIfAllowed("SecurityError", standardError); + noMemoryError = defineClassIfAllowed("NoMemoryError", exceptionClass); + regexpError = defineClassIfAllowed("RegexpError", standardError); + eofError = defineClassIfAllowed("EOFError", ioError); + threadError = defineClassIfAllowed("ThreadError", standardError); + concurrencyError = defineClassIfAllowed("ConcurrencyError", threadError); + systemStackError = defineClassIfAllowed("SystemStackError", standardError); + zeroDivisionError = defineClassIfAllowed("ZeroDivisionError", standardError); + floatDomainError = defineClassIfAllowed("FloatDomainError", rangeError); + + initErrno(); + } + + private RubyClass defineClassIfAllowed(String name, RubyClass superClass) { + // TODO: should probably apply the null object pattern for a + // non-allowed class, rather than null + if (superClass != null && profile.allowClass(name)) { + return defineClass(name, superClass, superClass.getAllocator()); + } + return null; + } + + private Map<Integer, RubyClass> errnos = new HashMap<Integer, RubyClass>(); + + public RubyClass getErrno(int n) { + return errnos.get(n); + } + + /** + * Create module Errno's Variables. We have this method since Errno does not have it's + * own java class. + */ + private void initErrno() { + if (profile.allowModule("Errno")) { + errnoModule = defineModule("Errno"); + + Field[] fields = IErrno.class.getFields(); + + for (int i = 0; i < fields.length; i++) { + try { + createSysErr(fields[i].getInt(IErrno.class), fields[i].getName()); + } catch (IllegalAccessException e) { + throw new RuntimeException("Someone defined a non-public constant in IErrno.java", e); + } + } + } + } + + /** + * Creates a system error. + * @param i the error code (will probably use a java exception instead) + * @param name of the error to define. + **/ + private void createSysErr(int i, String name) { + if(profile.allowClass(name)) { + RubyClass errno = getErrno().defineClassUnder(name, systemCallError, systemCallError.getAllocator()); + errnos.put(i, errno); + errno.defineConstant("Errno", newFixnum(i)); + } + } + + private void initBuiltins() { + addLazyBuiltin("java.rb", "java", "org.jruby.javasupport.Java"); + addLazyBuiltin("jruby.rb", "jruby", "org.jruby.libraries.JRubyLibrary"); + + addLazyBuiltin("minijava.rb", "minijava", "org.jruby.java.MiniJava"); + + addLazyBuiltin("jruby/ext.rb", "jruby/ext", "org.jruby.RubyJRuby$ExtLibrary"); + addLazyBuiltin("jruby/type.rb", "jruby/type", "org.jruby.RubyJRuby$TypeLibrary"); + addLazyBuiltin("iconv.so", "iconv", "org.jruby.libraries.IConvLibrary"); + addLazyBuiltin("nkf.so", "nkf", "org.jruby.libraries.NKFLibrary"); + addLazyBuiltin("stringio.so", "stringio", "org.jruby.libraries.StringIOLibrary"); + addLazyBuiltin("strscan.so", "strscan", "org.jruby.libraries.StringScannerLibrary"); + addLazyBuiltin("zlib.so", "zlib", "org.jruby.libraries.ZlibLibrary"); + addLazyBuiltin("yaml_internal.rb", "yaml_internal", "org.jruby.libraries.YamlLibrary"); + addLazyBuiltin("enumerator.so", "enumerator", "org.jruby.libraries.EnumeratorLibrary"); + addLazyBuiltin("generator_internal.rb", "generator_internal", "org.jruby.ext.Generator$Service"); + addLazyBuiltin("readline.so", "readline", "org.jruby.ext.Readline$Service"); + addLazyBuiltin("thread.so", "thread", "org.jruby.libraries.ThreadLibrary"); + addLazyBuiltin("digest.so", "digest", "org.jruby.libraries.DigestLibrary"); + addLazyBuiltin("digest.rb", "digest", "org.jruby.libraries.DigestLibrary"); + addLazyBuiltin("digest/md5.so", "digest/md5", "org.jruby.libraries.DigestLibrary$MD5"); + addLazyBuiltin("digest/rmd160.so", "digest/rmd160", "org.jruby.libraries.DigestLibrary$RMD160"); + addLazyBuiltin("digest/sha1.so", "digest/sha1", "org.jruby.libraries.DigestLibrary$SHA1"); + addLazyBuiltin("digest/sha2.so", "digest/sha2", "org.jruby.libraries.DigestLibrary$SHA2"); + addLazyBuiltin("bigdecimal.so", "bigdecimal", "org.jruby.libraries.BigDecimalLibrary"); + addLazyBuiltin("io/wait.so", "io/wait", "org.jruby.libraries.IOWaitLibrary"); + addLazyBuiltin("etc.so", "etc", "org.jruby.libraries.EtcLibrary"); + addLazyBuiltin("weakref.rb", "weakref", "org.jruby.ext.WeakRef$WeakRefLibrary"); + addLazyBuiltin("socket.so", "socket", "org.jruby.ext.socket.RubySocket$Service"); + addLazyBuiltin("rbconfig.rb", "rbconfig", "org.jruby.libraries.RbConfigLibrary"); + addLazyBuiltin("jruby/serialization.rb", "serialization", "org.jruby.libraries.JRubySerializationLibrary"); + addLazyBuiltin("ffi.so", "ffi", "org.jruby.ext.ffi.Factory$Service"); + if(RubyInstanceConfig.NATIVE_NET_PROTOCOL) { + addLazyBuiltin("net/protocol.rb", "net/protocol", "org.jruby.libraries.NetProtocolBufferedIOLibrary"); + } + + if (config.getCompatVersion() == CompatVersion.RUBY1_9) { + addLazyBuiltin("fiber.so", "fiber", "org.jruby.libraries.FiberLibrary"); + } + + addBuiltinIfAllowed("openssl.so", new Library() { + public void load(Ruby runtime, boolean wrap) throws IOException { + runtime.getLoadService().require("jruby/openssl/stub"); + } + }); + + String[] builtins = {"fcntl", "yaml", "yaml/syck", "jsignal" }; + for (String library : builtins) { + addBuiltinIfAllowed(library + ".rb", new BuiltinScript(library)); + } + + getLoadService().require("builtin/core_ext/symbol"); + + RubyKernel.autoload(topSelf, newSymbol("Java"), newString("java")); + + getLoadService().require("enumerator"); + } + + private void addLazyBuiltin(String name, String shortName, String className) { + addBuiltinIfAllowed(name, new LateLoadingLibrary(shortName, className, getJRubyClassLoader())); + } + + private void addBuiltinIfAllowed(String name, Library lib) { + if(profile.allowBuiltin(name)) { + loadService.addBuiltinLibrary(name,lib); + } + } + + Object getRespondToMethod() { + return respondToMethod; + } + + void setRespondToMethod(Object rtm) { + this.respondToMethod = rtm; + } + + public Object getObjectToYamlMethod() { + return objectToYamlMethod; + } + + void setObjectToYamlMethod(Object otym) { + this.objectToYamlMethod = otym; + } + + /** + * Retrieve mappings of cached methods to where they have been cached. When a cached + * method needs to be invalidated this map can be used to remove all places it has been + * cached. + * + * @return the mappings of where cached methods have been stored + */ + public CacheMap getCacheMap() { + return cacheMap; + } + + /** Getter for property rubyTopSelf. + * @return Value of property rubyTopSelf. + */ + public IRubyObject getTopSelf() { + return topSelf; + } + + public void setCurrentDirectory(String dir) { + currentDirectory = dir; + } + + public String getCurrentDirectory() { + return currentDirectory; + } + + public RubyModule getEtc() { + return etcModule; + } + + public void setEtc(RubyModule etcModule) { + this.etcModule = etcModule; + } + + public RubyClass getObject() { + return objectClass; + } + + public RubyClass getModule() { + return moduleClass; + } + + public RubyClass getClassClass() { + return classClass; + } + + public RubyModule getKernel() { + return kernelModule; + } + void setKernel(RubyModule kernelModule) { + this.kernelModule = kernelModule; + } + + public RubyClass getDummy() { + return dummyClass; + } + + public RubyModule getComparable() { + return comparableModule; + } + void setComparable(RubyModule comparableModule) { + this.comparableModule = comparableModule; + } + + public RubyClass getNumeric() { + return numericClass; + } + void setNumeric(RubyClass numericClass) { + this.numericClass = numericClass; + } + + public RubyClass getFloat() { + return floatClass; + } + void setFloat(RubyClass floatClass) { + this.floatClass = floatClass; + } + + public RubyClass getInteger() { + return integerClass; + } + void setInteger(RubyClass integerClass) { + this.integerClass = integerClass; + } + + public RubyClass getFixnum() { + return fixnumClass; + } + void setFixnum(RubyClass fixnumClass) { + this.fixnumClass = fixnumClass; + } + + public RubyClass getComplex() { + return complexClass; + } + void setComplex(RubyClass complexClass) { + this.complexClass = complexClass; + } + + public RubyClass getRational() { + return rationalClass; + } + void setRational(RubyClass rationalClass) { + this.rationalClass = rationalClass; + } + + public RubyModule getEnumerable() { + return enumerableModule; + } + void setEnumerable(RubyModule enumerableModule) { + this.enumerableModule = enumerableModule; + } + + public RubyModule getEnumerator() { + return enumeratorClass; + } + void setEnumerator(RubyClass enumeratorClass) { + this.enumeratorClass = enumeratorClass; + } + + public RubyClass getString() { + return stringClass; + } + void setString(RubyClass stringClass) { + this.stringClass = stringClass; + } + + public RubyClass getSymbol() { + return symbolClass; + } + void setSymbol(RubyClass symbolClass) { + this.symbolClass = symbolClass; + } + + public RubyClass getArray() { + return arrayClass; + } + void setArray(RubyClass arrayClass) { + this.arrayClass = arrayClass; + } + + public RubyClass getHash() { + return hashClass; + } + void setHash(RubyClass hashClass) { + this.hashClass = hashClass; + } + + public RubyClass getRange() { + return rangeClass; + } + void setRange(RubyClass rangeClass) { + this.rangeClass = rangeClass; + } + + /** Returns the "true" instance from the instance pool. + * @return The "true" instance. + */ + public RubyBoolean getTrue() { + return trueObject; + } + + /** Returns the "false" instance from the instance pool. + * @return The "false" instance. + */ + public RubyBoolean getFalse() { + return falseObject; + } + + /** Returns the "nil" singleton instance. + * @return "nil" + */ + public IRubyObject getNil() { + return nilObject; + } + + public RubyClass getNilClass() { + return nilClass; + } + void setNilClass(RubyClass nilClass) { + this.nilClass = nilClass; + } + + public RubyClass getTrueClass() { + return trueClass; + } + void setTrueClass(RubyClass trueClass) { + this.trueClass = trueClass; + } + + public RubyClass getFalseClass() { + return falseClass; + } + void setFalseClass(RubyClass falseClass) { + this.falseClass = falseClass; + } + + public RubyClass getProc() { + return procClass; + } + void setProc(RubyClass procClass) { + this.procClass = procClass; + } + + public RubyClass getBinding() { + return bindingClass; + } + void setBinding(RubyClass bindingClass) { + this.bindingClass = bindingClass; + } + + public RubyClass getMethod() { + return methodClass; + } + void setMethod(RubyClass methodClass) { + this.methodClass = methodClass; + } + + public RubyClass getUnboundMethod() { + return unboundMethodClass; + } + void setUnboundMethod(RubyClass unboundMethodClass) { + this.unboundMethodClass = unboundMethodClass; + } + + public RubyClass getMatchData() { + return matchDataClass; + } + void setMatchData(RubyClass matchDataClass) { + this.matchDataClass = matchDataClass; + } + + public RubyClass getRegexp() { + return regexpClass; + } + void setRegexp(RubyClass regexpClass) { + this.regexpClass = regexpClass; + } + + public RubyClass getTime() { + return timeClass; + } + void setTime(RubyClass timeClass) { + this.timeClass = timeClass; + } + + public RubyModule getMath() { + return mathModule; + } + void setMath(RubyModule mathModule) { + this.mathModule = mathModule; + } + + public RubyModule getMarshal() { + return marshalModule; + } + void setMarshal(RubyModule marshalModule) { + this.marshalModule = marshalModule; + } + + public RubyClass getBignum() { + return bignumClass; + } + void setBignum(RubyClass bignumClass) { + this.bignumClass = bignumClass; + } + + public RubyClass getDir() { + return dirClass; + } + void setDir(RubyClass dirClass) { + this.dirClass = dirClass; + } + + public RubyClass getFile() { + return fileClass; + } + void setFile(RubyClass fileClass) { + this.fileClass = fileClass; + } + + public RubyClass getFileStat() { + return fileStatClass; + } + void setFileStat(RubyClass fileStatClass) { + this.fileStatClass = fileStatClass; + } + + public RubyModule getFileTest() { + return fileTestModule; + } + void setFileTest(RubyModule fileTestModule) { + this.fileTestModule = fileTestModule; + } + + public RubyClass getIO() { + return ioClass; + } + void setIO(RubyClass ioClass) { + this.ioClass = ioClass; + } + + public RubyClass getThread() { + return threadClass; + } + void setThread(RubyClass threadClass) { + this.threadClass = threadClass; + } + + public RubyClass getThreadGroup() { + return threadGroupClass; + } + void setThreadGroup(RubyClass threadGroupClass) { + this.threadGroupClass = threadGroupClass; + } + + public RubyThreadGroup getDefaultThreadGroup() { + return defaultThreadGroup; + } + void setDefaultThreadGroup(RubyThreadGroup defaultThreadGroup) { + this.defaultThreadGroup = defaultThreadGroup; + } + + public RubyClass getContinuation() { + return continuationClass; + } + void setContinuation(RubyClass continuationClass) { + this.continuationClass = continuationClass; + } + + public RubyClass getStructClass() { + return structClass; + } + void setStructClass(RubyClass structClass) { + this.structClass = structClass; + } + + public IRubyObject getTmsStruct() { + return tmsStruct; + } + void setTmsStruct(RubyClass tmsStruct) { + this.tmsStruct = tmsStruct; + } + + public IRubyObject getPasswdStruct() { + return passwdStruct; + } + void setPasswdStruct(RubyClass passwdStruct) { + this.passwdStruct = passwdStruct; + } + + public IRubyObject getGroupStruct() { + return groupStruct; + } + void setGroupStruct(RubyClass groupStruct) { + this.groupStruct = groupStruct; + } + + public RubyModule getGC() { + return gcModule; + } + void setGC(RubyModule gcModule) { + this.gcModule = gcModule; + } + + public RubyModule getObjectSpaceModule() { + return objectSpaceModule; + } + void setObjectSpaceModule(RubyModule objectSpaceModule) { + this.objectSpaceModule = objectSpaceModule; + } + + public RubyModule getProcess() { + return processModule; + } + void setProcess(RubyModule processModule) { + this.processModule = processModule; + } + + public RubyClass getProcStatus() { + return procStatusClass; + } + void setProcStatus(RubyClass procStatusClass) { + this.procStatusClass = procStatusClass; + } + + public RubyModule getProcUID() { + return procUIDModule; + } + void setProcUID(RubyModule procUIDModule) { + this.procUIDModule = procUIDModule; + } + + public RubyModule getProcGID() { + return procGIDModule; + } + void setProcGID(RubyModule procGIDModule) { + this.procGIDModule = procGIDModule; + } + + public RubyModule getProcSysModule() { + return procSysModule; + } + void setProcSys(RubyModule procSysModule) { + this.procSysModule = procSysModule; + } + + public RubyModule getPrecision() { + return precisionModule; + } + void setPrecision(RubyModule precisionModule) { + this.precisionModule = precisionModule; + } + + public RubyModule getErrno() { + return errnoModule; + } + + public RubyClass getException() { + return exceptionClass; + } + void setException(RubyClass exceptionClass) { + this.exceptionClass = exceptionClass; + } + + public RubyClass getNameError() { + return nameError; + } + + public RubyClass getNameErrorMessage() { + return nameErrorMessage; + } + + public RubyClass getNoMethodError() { + return noMethodError; + } + + public RubyClass getSignalException() { + return signalException; + } + + public RubyClass getRangeError() { + return rangeError; + } + + public RubyClass getSystemExit() { + return systemExit; + } + + public RubyClass getLocalJumpError() { + return localJumpError; + } + + public RubyClass getNativeException() { + return nativeException; + } + + public RubyClass getSystemCallError() { + return systemCallError; + } + + public RubyClass getFatal() { + return fatal; + } + + public RubyClass getInterrupt() { + return interrupt; + } + + public RubyClass getTypeError() { + return typeError; + } + + public RubyClass getArgumentError() { + return argumentError; + } + + public RubyClass getIndexError() { + return indexError; + } + + public RubyClass getSyntaxError() { + return syntaxError; + } + + public RubyClass getStandardError() { + return standardError; + } + + public RubyClass getRuntimeError() { + return runtimeError; + } + + public RubyClass getIOError() { + return ioError; + } + + public RubyClass getLoadError() { + return loadError; + } + + public RubyClass getNotImplementedError() { + return notImplementedError; + } + + public RubyClass getSecurityError() { + return securityError; + } + + public RubyClass getNoMemoryError() { + return noMemoryError; + } + + public RubyClass getRegexpError() { + return regexpError; + } + + public RubyClass getEOFError() { + return eofError; + } + + public RubyClass getThreadError() { + return threadError; + } + + public RubyClass getConcurrencyError() { + return concurrencyError; + } + + public RubyClass getSystemStackError() { + return systemStackError; + } + + public RubyClass getZeroDivisionError() { + return zeroDivisionError; + } + + public RubyClass getFloatDomainError() { + return floatDomainError; + } + + private RubyHash charsetMap; + public RubyHash getCharsetMap() { + if (charsetMap == null) charsetMap = new RubyHash(this); + return charsetMap; + } + + /** Getter for property isVerbose. + * @return Value of property isVerbose. + */ + public IRubyObject getVerbose() { + return verbose; + } + + /** Setter for property isVerbose. + * @param verbose New value of property isVerbose. + */ + public void setVerbose(IRubyObject verbose) { + this.verbose = verbose; + } + + /** Getter for property isDebug. + * @return Value of property isDebug. + */ + public IRubyObject getDebug() { + return debug; + } + + /** Setter for property isDebug. + * @param debug New value of property isDebug. + */ + public void setDebug(IRubyObject debug) { + this.debug = debug; + } + + public JavaSupport getJavaSupport() { + return javaSupport; + } + + public static ClassLoader getClassLoader() { + // we try to get the classloader that loaded JRuby, falling back on System + ClassLoader loader = Ruby.class.getClassLoader(); + if (loader == null) { + loader = ClassLoader.getSystemClassLoader(); + } + + return loader; + } + + public synchronized JRubyClassLoader getJRubyClassLoader() { + // FIXME: Get rid of laziness and handle restricted access elsewhere + if (!Ruby.isSecurityRestricted() && jrubyClassLoader == null) { + jrubyClassLoader = new JRubyClassLoader(config.getLoader()); + } + + return jrubyClassLoader; + } + + /** Defines a global variable + */ + public void defineVariable(final GlobalVariable variable) { + globalVariables.define(variable.name(), new IAccessor() { + public IRubyObject getValue() { + return variable.get(); + } + + public IRubyObject setValue(IRubyObject newValue) { + return variable.set(newValue); + } + }); + } + + /** defines a readonly global variable + * + */ + public void defineReadonlyVariable(String name, IRubyObject value) { + globalVariables.defineReadonly(name, new ValueAccessor(value)); + } + + public Node parseFile(InputStream in, String file, DynamicScope scope) { + return parser.parse(file, in, scope, new ParserConfiguration(0, false, false, true)); + } + + public Node parseInline(InputStream in, String file, DynamicScope scope) { + return parser.parse(file, in, scope, new ParserConfiguration(0, false, true)); + } + + public Node parseEval(String content, String file, DynamicScope scope, int lineNumber) { + byte[] bytes; + + try { + bytes = content.getBytes(KCode.NONE.getKCode()); + } catch (UnsupportedEncodingException e) { + bytes = content.getBytes(); + } + + return parser.parse(file, new ByteArrayInputStream(bytes), scope, + new ParserConfiguration(lineNumber, false)); + } + + public Node parse(String content, String file, DynamicScope scope, int lineNumber, + boolean extraPositionInformation) { + byte[] bytes; + + try { + bytes = content.getBytes(KCode.NONE.getKCode()); + } catch (UnsupportedEncodingException e) { + bytes = content.getBytes(); + } + + return parser.parse(file, new ByteArrayInputStream(bytes), scope, + new ParserConfiguration(lineNumber, extraPositionInformation, false)); + } + + public Node parseEval(ByteList content, String file, DynamicScope scope, int lineNumber) { + return parser.parse(file, content, scope, new ParserConfiguration(lineNumber, false)); + } + + public Node parse(ByteList content, String file, DynamicScope scope, int lineNumber, + boolean extraPositionInformation) { + return parser.parse(file, content, scope, + new ParserConfiguration(lineNumber, extraPositionInformation, false)); + } + + + public ThreadService getThreadService() { + return threadService; + } + + public ThreadContext getCurrentContext() { + return threadService.getCurrentContext(); + } + + /** + * Returns the loadService. + * @return ILoadService + */ + public LoadService getLoadService() { + return loadService; + } + + public RubyWarnings getWarnings() { + return warnings; + } + + public PrintStream getErrorStream() { + // FIXME: We can't guarantee this will always be a RubyIO...so the old code here is not safe + /*java.io.OutputStream os = ((RubyIO) getGlobalVariables().get("$stderr")).getOutStream(); + if(null != os) { + return new PrintStream(os); + } else { + return new PrintStream(new org.jruby.util.SwallowingOutputStream()); + }*/ + return new PrintStream(new IOOutputStream(getGlobalVariables().get("$stderr"))); + } + + public InputStream getInputStream() { + return new IOInputStream(getGlobalVariables().get("$stdin")); + } + + public PrintStream getOutputStream() { + return new PrintStream(new IOOutputStream(getGlobalVariables().get("$stdout"))); + } + + public RubyModule getClassFromPath(String path) { + RubyModule c = getObject(); + if (path.length() == 0 || path.charAt(0) == '#') { + throw newTypeError("can't retrieve anonymous class " + path); + } + int pbeg = 0, p = 0; + for(int l=path.length(); p<l; ) { + while(p<l && path.charAt(p) != ':') { + p++; + } + String str = path.substring(pbeg, p); + + if(p<l && path.charAt(p) == ':') { + if(p+1 < l && path.charAt(p+1) != ':') { + throw newTypeError("undefined class/module " + path.substring(pbeg,p)); + } + p += 2; + pbeg = p; + } + + IRubyObject cc = c.getConstant(str); + if(!(cc instanceof RubyModule)) { + throw newTypeError("" + path + " does not refer to class/module"); + } + c = (RubyModule)cc; + } + return c; + } + + /** Prints an error with backtrace to the error stream. + * + * MRI: eval.c - error_print() + * + */ + public void printError(RubyException excp) { + if (excp == null || excp.isNil()) { + return; + } + + ThreadContext context = getCurrentContext(); + IRubyObject backtrace = excp.callMethod(context, "backtrace"); + + PrintStream errorStream = getErrorStream(); + if (backtrace.isNil() || !(backtrace instanceof RubyArray)) { + if (context.getFile() != null) { + errorStream.print(context.getFile() + ":" + context.getLine()); + } else { + errorStream.print(context.getLine()); + } + } else if (((RubyArray) backtrace).getLength() == 0) { + printErrorPos(context, errorStream); + } else { + IRubyObject mesg = ((RubyArray) backtrace).first(); + + if (mesg.isNil()) { + printErrorPos(context, errorStream); + } else { + errorStream.print(mesg); + } + } + + RubyClass type = excp.getMetaClass(); + String info = excp.toString(); + + if (type == getRuntimeError() && (info == null || info.length() == 0)) { + errorStream.print(": unhandled exception\n"); + } else { + String path = type.getName(); + + if (info.length() == 0) { + errorStream.print(": " + path + '\n'); + } else { + if (path.startsWith("#")) { + path = null; + } + + String tail = null; + if (info.indexOf("\n") != -1) { + tail = info.substring(info.indexOf("\n") + 1); + info = info.substring(0, info.indexOf("\n")); + } + + errorStream.print(": " + info); + + if (path != null) { + errorStream.print(" (" + path + ")\n"); + } + + if (tail != null) { + errorStream.print(tail + '\n'); + } + } + } + + excp.printBacktrace(errorStream); + } + + private void printErrorPos(ThreadContext context, PrintStream errorStream) { + if (context.getFile() != null) { + if (context.getFrameName() != null) { + errorStream.print(context.getFile() + ":" + context.getLine()); + errorStream.print(":in '" + context.getFrameName() + '\''); + } else if (context.getLine() != 0) { + errorStream.print(context.getFile() + ":" + context.getLine()); + } else { + errorStream.print(context.getFile()); + } + } + } + + public void loadFile(String scriptName, InputStream in, boolean wrap) { + IRubyObject self = wrap ? TopSelfFactory.createTopSelf(this) : getTopSelf(); + ThreadContext context = getCurrentContext(); + String file = context.getFile(); + + try { + secure(4); /* should alter global state */ + + context.setFile(scriptName); + context.preNodeEval(objectClass, self, scriptName); + + parseFile(in, scriptName, null).interpret(this, context, self, Block.NULL_BLOCK); + } catch (JumpException.ReturnJump rj) { + return; + } finally { + context.postNodeEval(); + context.setFile(file); + } + } + + public void compileAndLoadFile(String filename, InputStream in, boolean wrap) { + IRubyObject self = wrap ? TopSelfFactory.createTopSelf(this) : getTopSelf(); + ThreadContext context = getCurrentContext(); + String file = context.getFile(); + + try { + secure(4); /* should alter global state */ + + context.setFile(filename); + context.preNodeEval(objectClass, self, filename); + + Node scriptNode = parseFile(in, filename, null); + + Script script = tryCompile(scriptNode, new JRubyClassLoader(jrubyClassLoader)); + if (script == null) { + System.err.println("Error, could not compile; pass -J-Djruby.jit.logging.verbose=true for more details"); + } + + runScript(script); + } catch (JumpException.ReturnJump rj) { + return; + } finally { + context.postNodeEval(); + context.setFile(file); + } + } + + public void loadScript(Script script) { + IRubyObject self = getTopSelf(); + ThreadContext context = getCurrentContext(); + + try { + secure(4); /* should alter global state */ + + context.preNodeEval(objectClass, self); + + script.load(context, self, IRubyObject.NULL_ARRAY, Block.NULL_BLOCK); + } catch (JumpException.ReturnJump rj) { + return; + } finally { + context.postNodeEval(); + } + } + + public class CallTraceFuncHook extends EventHook { + private RubyProc traceFunc; + + public void setTraceFunc(RubyProc traceFunc) { + this.traceFunc = traceFunc; + } + + public void eventHandler(ThreadContext context, String eventName, String file, int line, String name, IRubyObject type) { + if (!context.isWithinTrace()) { + if (file == null) file = "(ruby)"; + if (type == null) type = getFalse(); + + RubyBinding binding = RubyBinding.newBinding(Ruby.this); + + context.preTrace(); + try { + traceFunc.call(context, new IRubyObject[] { + newString(eventName), // event name + newString(file), // filename + newFixnum(line), // line numbers should be 1-based + name != null ? newSymbol(name) : getNil(), + binding, + type + }); + } finally { + context.postTrace(); + } + } + } + + public boolean isInterestedInEvent(RubyEvent event) { + return true; + } + }; + + private final CallTraceFuncHook callTraceFuncHook = new CallTraceFuncHook(); + + public void addEventHook(EventHook hook) { + eventHooks.add(hook); + hasEventHooks = true; + } + + public void removeEventHook(EventHook hook) { + eventHooks.remove(hook); + hasEventHooks = !eventHooks.isEmpty(); + } + + public void setTraceFunction(RubyProc traceFunction) { + removeEventHook(callTraceFuncHook); + + if (traceFunction == null) { + return; + } + + callTraceFuncHook.setTraceFunc(traceFunction); + addEventHook(callTraceFuncHook); + } + + public void callEventHooks(ThreadContext context, RubyEvent event, String file, int line, String name, IRubyObject type) { + for (EventHook eventHook : eventHooks) { + if (eventHook.isInterestedInEvent(event)) { + eventHook.event(context, event, file, line, name, type); + } + } + } + + public boolean hasEventHooks() { + return hasEventHooks; + } + + public GlobalVariables getGlobalVariables() { + return globalVariables; + } + + // For JSR 223 support: see http://scripting.java.net/ + public void setGlobalVariables(GlobalVariables globalVariables) { + this.globalVariables = globalVariables; + } + + public CallbackFactory callbackFactory(Class<?> type) { + return CallbackFactory.createFactory(this, type); + } + + /** + * Push block onto exit stack. When runtime environment exits + * these blocks will be evaluated. + * + * @return the element that was pushed onto stack + */ + public IRubyObject pushExitBlock(RubyProc proc) { + atExitBlocks.push(proc); + return proc; + } + + // use this for JRuby-internal finalizers + public void addInternalFinalizer(Finalizable finalizer) { + synchronized (internalFinalizersMutex) { + if (internalFinalizers == null) { + internalFinalizers = new WeakHashMap<Finalizable, Object>(); + } + internalFinalizers.put(finalizer, null); + } + } + + // this method is for finalizers registered via ObjectSpace + public void addFinalizer(Finalizable finalizer) { + synchronized (finalizersMutex) { + if (finalizers == null) { + finalizers = new WeakHashMap<Finalizable, Object>(); + } + finalizers.put(finalizer, null); + } + } + + public void removeInternalFinalizer(Finalizable finalizer) { + synchronized (internalFinalizersMutex) { + if (internalFinalizers != null) { + internalFinalizers.remove(finalizer); + } + } + } + + public void removeFinalizer(Finalizable finalizer) { + synchronized (finalizersMutex) { + if (finalizers != null) { + finalizers.remove(finalizer); + } + } + } + + /** + * Make sure Kernel#at_exit procs get invoked on runtime shutdown. + * This method needs to be explicitly called to work properly. + * I thought about using finalize(), but that did not work and I + * am not sure the runtime will be at a state to run procs by the + * time Ruby is going away. This method can contain any other + * things that need to be cleaned up at shutdown. + */ + public void tearDown() { + int status = 0; + + while (!atExitBlocks.empty()) { + RubyProc proc = atExitBlocks.pop(); + try { + proc.call(getCurrentContext(), IRubyObject.NULL_ARRAY); + } catch (RaiseException rj) { + RubyException raisedException = rj.getException(); + if (!getSystemExit().isInstance(raisedException)) { + status = 1; + printError(raisedException); + } else { + IRubyObject statusObj = raisedException.callMethod( + getCurrentContext(), "status"); + if (statusObj != null && !statusObj.isNil()) { + status = RubyNumeric.fix2int(statusObj); + } + } + } + } + + if (finalizers != null) { + synchronized (finalizers) { + for (Iterator<Finalizable> finalIter = new ArrayList<Finalizable>(finalizers.keySet()).iterator(); finalIter.hasNext();) { + finalIter.next().finalize(); + finalIter.remove(); + } + } + } + + synchronized (internalFinalizersMutex) { + if (internalFinalizers != null) { + for (Iterator<Finalizable> finalIter = new ArrayList<Finalizable>( + internalFinalizers.keySet()).iterator(); finalIter.hasNext();) { + finalIter.next().finalize(); + finalIter.remove(); + } + } + } + + getThreadService().disposeCurrentThread(); + + getBeanManager().unregisterCompiler(); + getBeanManager().unregisterConfig(); + getBeanManager().unregisterClassCache(); + getBeanManager().unregisterMethodCache(); + + if (status != 0) { + throw newSystemExit(status); + } + } + + // new factory methods ------------------------------------------------------------------------ + + public RubyArray newEmptyArray() { + return RubyArray.newEmptyArray(this); + } + + public RubyArray newArray() { + return RubyArray.newArray(this); + } + + public RubyArray newArrayLight() { + return RubyArray.newArrayLight(this); + } + + public RubyArray newArray(IRubyObject object) { + return RubyArray.newArray(this, object); + } + + public RubyArray newArray(IRubyObject car, IRubyObject cdr) { + return RubyArray.newArray(this, car, cdr); + } + + public RubyArray newArray(IRubyObject[] objects) { + return RubyArray.newArray(this, objects); + } + + public RubyArray newArrayNoCopy(IRubyObject[] objects) { + return RubyArray.newArrayNoCopy(this, objects); + } + + public RubyArray newArrayNoCopyLight(IRubyObject[] objects) { + return RubyArray.newArrayNoCopyLight(this, objects); + } + + public RubyArray newArray(List<IRubyObject> list) { + return RubyArray.newArray(this, list); + } + + public RubyArray newArray(int size) { + return RubyArray.newArray(this, size); + } + + public RubyBoolean newBoolean(boolean value) { + return RubyBoolean.newBoolean(this, value); + } + + public RubyFileStat newFileStat(String filename, boolean lstat) { + return RubyFileStat.newFileStat(this, filename, lstat); + } + + public RubyFileStat newFileStat(FileDescriptor descriptor) { + return RubyFileStat.newFileStat(this, descriptor); + } + + public RubyFixnum newFixnum(long value) { + return RubyFixnum.newFixnum(this, value); + } + + public RubyFixnum newFixnum(int value) { + return RubyFixnum.newFixnum(this, value); + } + + public RubyFloat newFloat(double value) { + return RubyFloat.newFloat(this, value); + } + + public RubyNumeric newNumeric() { + return RubyNumeric.newNumeric(this); + } + + public RubyProc newProc(Block.Type type, Block block) { + if (type != Block.Type.LAMBDA && block.getProcObject() != null) return block.getProcObject(); + + RubyProc proc = RubyProc.newProc(this, type); + + proc.callInit(IRubyObject.NULL_ARRAY, block); + + return proc; + } + + public RubyProc newBlockPassProc(Block.Type type, Block block) { + if (type != Block.Type.LAMBDA && block.getProcObject() != null) return block.getProcObject(); + + RubyProc proc = RubyProc.newProc(this, type); + proc.initialize(getCurrentContext(), block); + + return proc; + } + + public RubyBinding newBinding() { + return RubyBinding.newBinding(this); + } + + public RubyBinding newBinding(Binding binding) { + return RubyBinding.newBinding(this, binding); + } + + public RubyString newString() { + return RubyString.newString(this, new ByteList()); + } + + public RubyString newString(String string) { + return RubyString.newString(this, string); + } + + public RubyString newString(ByteList byteList) { + return RubyString.newString(this, byteList); + } + + @Deprecated + public RubyString newStringShared(ByteList byteList) { + return RubyString.newStringShared(this, byteList); + } + + public RubySymbol newSymbol(String name) { + return symbolTable.getSymbol(name); + } + + /** + * Faster than {@link #newSymbol(String)} if you already have an interned + * name String. Don't intern your string just to call this version - the + * overhead of interning will more than wipe out any benefit from the faster + * lookup. + * + * @param internedName the symbol name, <em>must</em> be interned! if in + * doubt, call {@link #newSymbol(String)} instead. + * @return the symbol for name + */ + public RubySymbol fastNewSymbol(String internedName) { + assert internedName == internedName.intern() : internedName + " is not interned"; + + return symbolTable.fastGetSymbol(internedName); + } + + public RubyTime newTime(long milliseconds) { + return RubyTime.newTime(this, milliseconds); + } + + public RaiseException newRuntimeError(String message) { + return newRaiseException(getRuntimeError(), message); + } + + public RaiseException newArgumentError(String message) { + return newRaiseException(getArgumentError(), message); + } + + public RaiseException newArgumentError(int got, int expected) { + return newRaiseException(getArgumentError(), "wrong # of arguments(" + got + " for " + expected + ")"); + } + + public RaiseException newErrnoEBADFError() { + return newRaiseException(getErrno().fastGetClass("EBADF"), "Bad file descriptor"); + } + + public RaiseException newErrnoENOPROTOOPTError() { + return newRaiseException(getErrno().fastGetClass("ENOPROTOOPT"), "Protocol not available"); + } + + public RaiseException newErrnoEPIPEError() { + return newRaiseException(getErrno().fastGetClass("EPIPE"), "Broken pipe"); + } + + public RaiseException newErrnoECONNREFUSEDError() { + return newRaiseException(getErrno().fastGetClass("ECONNREFUSED"), "Connection refused"); + } + + public RaiseException newErrnoECONNRESETError() { + return newRaiseException(getErrno().fastGetClass("ECONNRESET"), "Connection reset by peer"); + } + + public RaiseException newErrnoEADDRINUSEError() { + return newRaiseException(getErrno().fastGetClass("EADDRINUSE"), "Address in use"); + } + + public RaiseException newErrnoEINVALError() { + return newRaiseException(getErrno().fastGetClass("EINVAL"), "Invalid file"); + } + + public RaiseException newErrnoENOENTError() { + return newRaiseException(getErrno().fastGetClass("ENOENT"), "File not found"); + } + + public RaiseException newErrnoEACCESError(String message) { + return newRaiseException(getErrno().fastGetClass("EACCES"), message); + } + + public RaiseException newErrnoEAGAINError(String message) { + return newRaiseException(getErrno().fastGetClass("EAGAIN"), message); + } + + public RaiseException newErrnoEISDirError() { + return newRaiseException(getErrno().fastGetClass("EISDIR"), "Is a directory"); + } + + public RaiseException newErrnoESPIPEError() { + return newRaiseException(getErrno().fastGetClass("ESPIPE"), "Illegal seek"); + } + + public RaiseException newErrnoEBADFError(String message) { + return newRaiseException(getErrno().fastGetClass("EBADF"), message); + } + + public RaiseException newErrnoEINVALError(String message) { + return newRaiseException(getErrno().fastGetClass("EINVAL"), message); + } + + public RaiseException newErrnoENOTDIRError(String message) { + return newRaiseException(getErrno().fastGetClass("ENOTDIR"), message); + } + + public RaiseException newErrnoENOTSOCKError(String message) { + return newRaiseException(getErrno().fastGetClass("ENOTSOCK"), message); + } + + public RaiseException newErrnoENOENTError(String message) { + return newRaiseException(getErrno().fastGetClass("ENOENT"), message); + } + + public RaiseException newErrnoESPIPEError(String message) { + return newRaiseException(getErrno().fastGetClass("ESPIPE"), message); + } + + public RaiseException newErrnoEEXISTError(String message) { + return newRaiseException(getErrno().fastGetClass("EEXIST"), message); + } + + public RaiseException newErrnoEDOMError(String message) { + return newRaiseException(getErrno().fastGetClass("EDOM"), "Domain error - " + message); + } + + public RaiseException newErrnoECHILDError() { + return newRaiseException(getErrno().fastGetClass("ECHILD"), "No child processes"); + } + + public RaiseException newIndexError(String message) { + return newRaiseException(getIndexError(), message); + } + + public RaiseException newSecurityError(String message) { + return newRaiseException(getSecurityError(), message); + } + + public RaiseException newSystemCallError(String message) { + return newRaiseException(getSystemCallError(), message); + } + + public RaiseException newTypeError(String message) { + return newRaiseException(getTypeError(), message); + } + + public RaiseException newThreadError(String message) { + return newRaiseException(getThreadError(), message); + } + + public RaiseException newConcurrencyError(String message) { + return newRaiseException(getConcurrencyError(), message); + } + + public RaiseException newSyntaxError(String message) { + return newRaiseException(getSyntaxError(), message); + } + + public RaiseException newRegexpError(String message) { + return newRaiseException(getRegexpError(), message); + } + + public RaiseException newRangeError(String message) { + return newRaiseException(getRangeError(), message); + } + + public RaiseException newNotImplementedError(String message) { + return newRaiseException(getNotImplementedError(), message); + } + + public RaiseException newInvalidEncoding(String message) { + return newRaiseException(fastGetClass("Iconv").fastGetClass("InvalidEncoding"), message); + } + + public RaiseException newNoMethodError(String message, String name, IRubyObject args) { + return new RaiseException(new RubyNoMethodError(this, getNoMethodError(), message, name, args), true); + } + + public RaiseException newNameError(String message, String name) { + return newNameError(message, name, null); + } + + public RaiseException newNameError(String message, String name, Throwable origException) { + return newNameError(message, name, origException, true); + } + + public RaiseException newNameError(String message, String name, Throwable origException, boolean printWhenVerbose) { + if (printWhenVerbose && origException != null && this.getVerbose().isTrue()) { + origException.printStackTrace(getErrorStream()); + } + return new RaiseException(new RubyNameError( + this, getNameError(), message, name), true); + } + + public RaiseException newLocalJumpError(String reason, IRubyObject exitValue, String message) { + return new RaiseException(new RubyLocalJumpError(this, getLocalJumpError(), message, reason, exitValue), true); + } + + public RaiseException newRedoLocalJumpError() { + return new RaiseException(new RubyLocalJumpError(this, getLocalJumpError(), "unexpected redo", "redo", getNil()), true); + } + + public RaiseException newLoadError(String message) { + return newRaiseException(getLoadError(), message); + } + + public RaiseException newFrozenError(String objectType) { + // TODO: Should frozen error have its own distinct class? If not should more share? + return newRaiseException(getTypeError(), "can't modify frozen " + objectType); + } + + public RaiseException newSystemStackError(String message) { + return newRaiseException(getSystemStackError(), message); + } + + public RaiseException newSystemExit(int status) { + return new RaiseException(RubySystemExit.newInstance(this, status)); + } + + public RaiseException newIOError(String message) { + return newRaiseException(getIOError(), message); + } + + public RaiseException newStandardError(String message) { + return newRaiseException(getStandardError(), message); + } + + public RaiseException newIOErrorFromException(IOException ioe) { + // TODO: this is kinda gross + if(ioe.getMessage() != null) { + if (ioe.getMessage().equals("Broken pipe")) { + throw newErrnoEPIPEError(); + } else if (ioe.getMessage().equals("Connection reset by peer")) { + throw newErrnoECONNRESETError(); + } + return newRaiseException(getIOError(), ioe.getMessage()); + } else { + return newRaiseException(getIOError(), "IO Error"); + } + } + + public RaiseException newTypeError(IRubyObject receivedObject, RubyClass expectedType) { + return newRaiseException(getTypeError(), "wrong argument type " + + receivedObject.getMetaClass().getRealClass() + " (expected " + expectedType + ")"); + } + + public RaiseException newEOFError() { + return newRaiseException(getEOFError(), "End of file reached"); + } + + public RaiseException newEOFError(String message) { + return newRaiseException(getEOFError(), message); + } + + public RaiseException newZeroDivisionError() { + return newRaiseException(getZeroDivisionError(), "divided by 0"); + } + + public RaiseException newFloatDomainError(String message){ + return newRaiseException(getFloatDomainError(), message); + } + + /** + * @param exceptionClass + * @param message + * @return + */ + private RaiseException newRaiseException(RubyClass exceptionClass, String message) { + RaiseException re = new RaiseException(this, exceptionClass, message, true); + return re; + } + + + public RubySymbol.SymbolTable getSymbolTable() { + return symbolTable; + } + + public void setStackTraces(int stackTraces) { + this.stackTraces = stackTraces; + } + + public int getStackTraces() { + return stackTraces; + } + + public void setRandomSeed(long randomSeed) { + this.randomSeed = randomSeed; + } + + public long getRandomSeed() { + return randomSeed; + } + + public Random getRandom() { + return random; + } + + public ObjectSpace getObjectSpace() { + return objectSpace; + } + + public Map<Integer, WeakReference<ChannelDescriptor>> getDescriptors() { + return descriptors; + } + + public long incrementRandomSeedSequence() { + return randomSeedSequence++; + } + + public InputStream getIn() { + return in; + } + + public PrintStream getOut() { + return out; + } + + public PrintStream getErr() { + return err; + } + + public boolean isGlobalAbortOnExceptionEnabled() { + return globalAbortOnExceptionEnabled; + } + + public void setGlobalAbortOnExceptionEnabled(boolean enable) { + globalAbortOnExceptionEnabled = enable; + } + + public boolean isDoNotReverseLookupEnabled() { + return doNotReverseLookupEnabled; + } + + public void setDoNotReverseLookupEnabled(boolean b) { + doNotReverseLookupEnabled = b; + } + + private ThreadLocal<Map<Object, Object>> inspect = new ThreadLocal<Map<Object, Object>>(); + public void registerInspecting(Object obj) { + Map<Object, Object> val = inspect.get(); + if (val == null) inspect.set(val = new IdentityHashMap<Object, Object>()); + val.put(obj, null); + } + + public boolean isInspecting(Object obj) { + Map<Object, Object> val = inspect.get(); + return val == null ? false : val.containsKey(obj); + } + + public void unregisterInspecting(Object obj) { + Map<Object, Object> val = inspect.get(); + if (val != null ) val.remove(obj); + } + + public boolean isObjectSpaceEnabled() { + return objectSpaceEnabled; + } + + // The method is intentionally not public, since it typically should + // not be used outside of the core. + /* package-private */ void setObjectSpaceEnabled(boolean objectSpaceEnabled) { + this.objectSpaceEnabled = objectSpaceEnabled; + } + + public long getStartTime() { + return startTime; + } + + public Profile getProfile() { + return profile; + } + + public String getJRubyHome() { + return config.getJRubyHome(); + } + + public void setJRubyHome(String home) { + config.setJRubyHome(home); + } + + public RubyInstanceConfig getInstanceConfig() { + return config; + } + + /** GET_VM_STATE_VERSION */ + public long getGlobalState() { + synchronized(this) { + return globalState; + } + } + + /** INC_VM_STATE_VERSION */ + public void incGlobalState() { + synchronized(this) { + globalState = (globalState+1) & 0x8fffffff; + } + } + + public static boolean isSecurityRestricted() { + return securityRestricted; + } + + public static void setSecurityRestricted(boolean restricted) { + securityRestricted = restricted; + } + + public POSIX getPosix() { + return posix; + } + + public void setRecordSeparatorVar(GlobalVariable recordSeparatorVar) { + this.recordSeparatorVar = recordSeparatorVar; + } + + public GlobalVariable getRecordSeparatorVar() { + return recordSeparatorVar; + } + + public Set<Script> getJittedMethods() { + return jittedMethods; + } + + public ExecutorService getExecutor() { + return executor; + } + + public Map<String, DateTimeZone> getLocalTimezoneCache() { + return localTimeZoneCache; + } + + private final CacheMap cacheMap; + private final ThreadService threadService; + private Hashtable<Object, Object> runtimeInformation; + + private POSIX posix; + + private int stackTraces = 0; + + private ObjectSpace objectSpace = new ObjectSpace(); + + private final RubySymbol.SymbolTable symbolTable = new RubySymbol.SymbolTable(this); + private Map<Integer, WeakReference<ChannelDescriptor>> descriptors = new ConcurrentHashMap<Integer, WeakReference<ChannelDescriptor>>(); + private long randomSeed = 0; + private long randomSeedSequence = 0; + private Random random = new Random(); + + private List<EventHook> eventHooks = new Vector<EventHook>(); + private boolean hasEventHooks; + private boolean globalAbortOnExceptionEnabled = false; + private boolean doNotReverseLookupEnabled = false; + private volatile boolean objectSpaceEnabled; + + private final Set<Script> jittedMethods = Collections.synchronizedSet(new WeakHashSet<Script>()); + + private static ThreadLocal<Ruby> currentRuntime = new ThreadLocal<Ruby>(); + + private long globalState = 1; + + private int safeLevel = -1; + + // Default objects + private IRubyObject topSelf; + private RubyNil nilObject; + private RubyBoolean trueObject; + private RubyBoolean falseObject; + public final RubyFixnum[] fixnumCache = new RubyFixnum[256]; + + private IRubyObject verbose; + private IRubyObject debug; + + private RubyThreadGroup defaultThreadGroup; + + /** + * All the core classes we keep hard references to. These are here largely + * so that if someone redefines String or Array we won't start blowing up + * creating strings and arrays internally. They also provide much faster + * access than going through normal hash lookup on the Object class. + */ + private RubyClass + objectClass, moduleClass, classClass, nilClass, trueClass, + falseClass, numericClass, floatClass, integerClass, fixnumClass, + complexClass, rationalClass, enumeratorClass, + arrayClass, hashClass, rangeClass, stringClass, symbolClass, + procClass, bindingClass, methodClass, unboundMethodClass, + matchDataClass, regexpClass, timeClass, bignumClass, dirClass, + fileClass, fileStatClass, ioClass, threadClass, threadGroupClass, + continuationClass, structClass, tmsStruct, passwdStruct, + groupStruct, procStatusClass, exceptionClass, runtimeError, ioError, + scriptError, nameError, nameErrorMessage, noMethodError, signalException, + rangeError, dummyClass, systemExit, localJumpError, nativeException, + systemCallError, fatal, interrupt, typeError, argumentError, indexError, + syntaxError, standardError, loadError, notImplementedError, securityError, noMemoryError, + regexpError, eofError, threadError, concurrencyError, systemStackError, zeroDivisionError, floatDomainError; + + /** + * All the core modules we keep direct references to, for quick access and + * to ensure they remain available. + */ + private RubyModule + kernelModule, comparableModule, enumerableModule, mathModule, + marshalModule, etcModule, fileTestModule, gcModule, + objectSpaceModule, processModule, procUIDModule, procGIDModule, + procSysModule, precisionModule, errnoModule; + + // record separator var, to speed up io ops that use it + private GlobalVariable recordSeparatorVar; + + // former java.lang.System concepts now internalized for MVM + private String currentDirectory; + + private long startTime = System.currentTimeMillis(); + + private RubyInstanceConfig config; + + private InputStream in; + private PrintStream out; + private PrintStream err; + + // Java support + private JavaSupport javaSupport; + private JRubyClassLoader jrubyClassLoader; + + // Management/monitoring + private BeanManager beanManager; + + // Compilation + private final JITCompiler jitCompiler; + + // Note: this field and the following static initializer + // must be located be in this order! + private volatile static boolean securityRestricted = false; + static { + if (SafePropertyAccessor.isSecurityProtected("jruby.reflection")) { + // can't read non-standard properties + securityRestricted = true; + } else { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + try { + sm.checkCreateClassLoader(); + } catch (SecurityException se) { + // can't create custom classloaders + securityRestricted = true; + } + } + } + } + + private Parser parser = new Parser(this); + + private LoadService loadService; + private GlobalVariables globalVariables = new GlobalVariables(this); + private RubyWarnings warnings = new RubyWarnings(this); + + // Contains a list of all blocks (as Procs) that should be called when + // the runtime environment exits. + private Stack<RubyProc> atExitBlocks = new Stack<RubyProc>(); + + private Profile profile; + + private KCode kcode = KCode.NONE; + + // Atomic integers for symbol and method IDs + private AtomicInteger symbolLastId = new AtomicInteger(128); + private AtomicInteger moduleLastId = new AtomicInteger(0); + + private Object respondToMethod; + private Object objectToYamlMethod; + + private Map<String, DateTimeZone> localTimeZoneCache = new HashMap<String,DateTimeZone>(); + /** + * A list of "external" finalizers (the ones, registered via ObjectSpace), + * weakly referenced, to be executed on tearDown. + */ + private Map<Finalizable, Object> finalizers; + + /** + * A list of JRuby-internal finalizers, weakly referenced, + * to be executed on tearDown. + */ + private Map<Finalizable, Object> internalFinalizers; + + // mutex that controls modifications of user-defined finalizers + private final Object finalizersMutex = new Object(); + + // mutex that controls modifications of internal finalizers + private final Object internalFinalizersMutex = new Object(); + + // A thread pool to use for executing this runtime's Ruby threads + private ExecutorService executor; +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.FrameField; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; + +public class RubyArgsFile { + private static final class ArgsFileData { + private final Ruby runtime; + public ArgsFileData(Ruby runtime) { + this.runtime = runtime; + } + + public IRubyObject currentFile; + public int currentLineNumber; + public boolean startedProcessing = false; + public boolean finishedProcessing = false; + + public boolean nextArgsFile(ThreadContext context) { + if (finishedProcessing) { + return false; + } + + RubyArray args = (RubyArray)runtime.getGlobalVariables().get("$*"); + if (args.getLength() == 0) { + if (!startedProcessing) { + currentFile = runtime.getGlobalVariables().get("$stdin"); + ((RubyString) runtime.getGlobalVariables().get("$FILENAME")).setValue(new ByteList(new byte[]{'-'})); + currentLineNumber = 0; + startedProcessing = true; + return true; + } else { + finishedProcessing = true; + return false; + } + } + + IRubyObject arg = args.shift(); + RubyString filename = (RubyString)((RubyObject)arg).to_s(); + ByteList filenameBytes = filename.getByteList(); + ((RubyString) runtime.getGlobalVariables().get("$FILENAME")).setValue(filenameBytes); + + if (filenameBytes.length() == 1 && filenameBytes.get(0) == '-') { + currentFile = runtime.getGlobalVariables().get("$stdin"); + } else { + currentFile = RubyFile.open(context, runtime.getFile(), + new IRubyObject[] {filename.strDup(context.getRuntime())}, Block.NULL_BLOCK); + } + + startedProcessing = true; + return true; + } + + public static ArgsFileData getDataFrom(IRubyObject recv) { + ArgsFileData data = (ArgsFileData)recv.dataGetStruct(); + if(data == null) { + data = new ArgsFileData(recv.getRuntime()); + recv.dataWrapStruct(data); + } + return data; + } + } + + public static void setCurrentLineNumber(IRubyObject recv, int newLineNumber) { + ArgsFileData.getDataFrom(recv).currentLineNumber = newLineNumber; + } + + public static void initArgsFile(Ruby runtime) { + RubyObject argsFile = new RubyObject(runtime, runtime.getObject()); + + runtime.getEnumerable().extend_object(argsFile); + + runtime.defineReadonlyVariable("$<", argsFile); + runtime.defineGlobalConstant("ARGF", argsFile); + + RubyClass argfClass = argsFile.getMetaClass(); + argfClass.defineAnnotatedMethods(RubyArgsFile.class); + runtime.defineReadonlyVariable("$FILENAME", runtime.newString("-")); + } + + @JRubyMethod(name = {"fileno", "to_i"}) + public static IRubyObject fileno(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + + if (data.currentFile == null && !data.nextArgsFile(context)) { + throw context.getRuntime().newArgumentError("no stream"); + } + return ((RubyIO) data.currentFile).fileno(context); + } + + @JRubyMethod(name = "to_io") + public static IRubyObject to_io(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + + if (data.currentFile == null && !data.nextArgsFile(context)) { + throw context.getRuntime().newArgumentError("no stream"); + } + return data.currentFile; + } + + public static IRubyObject internalGets(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + + if(data.currentFile == null && !data.nextArgsFile(context)) { + return context.getRuntime().getNil(); + } + + IRubyObject line = data.currentFile.callMethod(context, "gets", args); + + while (line instanceof RubyNil) { + data.currentFile.callMethod(context, "close"); + if (!data.nextArgsFile(context)) { + data.currentFile = null; + return line; + } + line = data.currentFile.callMethod(context, "gets", args); + } + + data.currentLineNumber++; + context.getRuntime().getGlobalVariables().set("$.", context.getRuntime().newFixnum(data.currentLineNumber)); + + return line; + } + + // ARGF methods + + /** Read a line. + * + */ + @JRubyMethod(name = "gets", optional = 1, frame = true, writes = FrameField.LASTLINE) + public static IRubyObject gets(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + IRubyObject result = internalGets(context, recv, args); + + if (!result.isNil()) { + context.getCurrentFrame().setLastLine(result); + } + + return result; + } + + /** Read a line. + * + */ + @JRubyMethod(name = "readline", optional = 1, frame = true, writes = FrameField.LASTLINE) + public static IRubyObject readline(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + IRubyObject line = gets(context, recv, args); + + if (line.isNil()) { + throw context.getRuntime().newEOFError(); + } + + return line; + } + + @JRubyMethod(name = "readlines", optional = 1, frame = true) + public static RubyArray readlines(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + IRubyObject[] separatorArgument; + if (args.length > 0) { + if (!context.getRuntime().getNilClass().isInstance(args[0]) && + !context.getRuntime().getString().isInstance(args[0])) { + throw context.getRuntime().newTypeError(args[0], context.getRuntime().getString()); + } + separatorArgument = new IRubyObject[] { args[0] }; + } else { + separatorArgument = IRubyObject.NULL_ARRAY; + } + + RubyArray result = context.getRuntime().newArray(); + IRubyObject line; + while (! (line = internalGets(context, recv, separatorArgument)).isNil()) { + result.append(line); + } + return result; + } + + @JRubyMethod(name = "each_byte", frame = true) + public static IRubyObject each_byte(ThreadContext context, IRubyObject recv, Block block) { + IRubyObject bt; + + while(!(bt = getc(context, recv)).isNil()) { + block.yield(context, bt); + } + + return recv; + } + + /** Invoke a block for each line. + * + */ + @JRubyMethod(name = "each_line", alias = {"each"}, optional = 1, frame = true) + public static IRubyObject each_line(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + IRubyObject nextLine = internalGets(context, recv, args); + + while (!nextLine.isNil()) { + block.yield(context, nextLine); + nextLine = internalGets(context, recv, args); + } + + return recv; + } + + @JRubyMethod(name = "file") + public static IRubyObject file(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + + if(data.currentFile == null && !data.nextArgsFile(context)) { + return context.getRuntime().getNil(); + } + return data.currentFile; + } + + @JRubyMethod(name = "skip") + public static IRubyObject skip(IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + data.currentFile = null; + return recv; + } + + @JRubyMethod(name = "close") + public static IRubyObject close(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if(data.currentFile == null && !data.nextArgsFile(context)) { + return recv; + } + data.currentFile = null; + data.currentLineNumber = 0; + return recv; + } + + @JRubyMethod(name = "closed?") + public static IRubyObject closed_p(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if(data.currentFile == null && !data.nextArgsFile(context)) { + return recv; + } + return ((RubyIO)data.currentFile).closed_p(context); + } + + @JRubyMethod(name = "binmode") + public static IRubyObject binmode(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if(data.currentFile == null && !data.nextArgsFile(context)) { + throw context.getRuntime().newArgumentError("no stream"); + } + + return ((RubyIO)data.currentFile).binmode(); + } + + @JRubyMethod(name = "lineno") + public static IRubyObject lineno(ThreadContext context, IRubyObject recv) { + return context.getRuntime().newFixnum(ArgsFileData.getDataFrom(recv).currentLineNumber); + } + + @JRubyMethod(name = "tell", alias = {"pos"}) + public static IRubyObject tell(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if(data.currentFile == null && !data.nextArgsFile(context)) { + throw context.getRuntime().newArgumentError("no stream to tell"); + } + return ((RubyIO)data.currentFile).pos(context); + } + + @JRubyMethod(name = "rewind") + public static IRubyObject rewind(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if(data.currentFile == null && !data.nextArgsFile(context)) { + throw context.getRuntime().newArgumentError("no stream to rewind"); + } + return ((RubyIO)data.currentFile).rewind(context); + } + + @JRubyMethod(name = {"eof", "eof?"}) + public static IRubyObject eof(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if (data.currentFile == null && !data.nextArgsFile(context)) { + return context.getRuntime().getTrue(); + } + + return ((RubyIO) data.currentFile).eof_p(context); + } + + @JRubyMethod(name = "pos=", required = 1) + public static IRubyObject set_pos(ThreadContext context, IRubyObject recv, IRubyObject offset) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if(data.currentFile == null && !data.nextArgsFile(context)) { + throw context.getRuntime().newArgumentError("no stream to set position"); + } + return ((RubyIO)data.currentFile).pos_set(context, offset); + } + + @JRubyMethod(name = "seek", required = 1, optional = 1) + public static IRubyObject seek(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if(data.currentFile == null && !data.nextArgsFile(context)) { + throw context.getRuntime().newArgumentError("no stream to seek"); + } + return ((RubyIO)data.currentFile).seek(context, args); + } + + @JRubyMethod(name = "lineno=", required = 1) + public static IRubyObject set_lineno(ThreadContext context, IRubyObject recv, IRubyObject line) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + data.currentLineNumber = RubyNumeric.fix2int(line); + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "readchar") + public static IRubyObject readchar(ThreadContext context, IRubyObject recv) { + IRubyObject c = getc(context, recv); + + if(c.isNil()) throw context.getRuntime().newEOFError(); + + return c; + } + + @JRubyMethod(name = "getc") + public static IRubyObject getc(ThreadContext context, IRubyObject recv) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + IRubyObject bt; + while(true) { + if(data.currentFile == null && !data.nextArgsFile(context)) { + return context.getRuntime().getNil(); + } + if(!(data.currentFile instanceof RubyFile)) { + bt = data.currentFile.callMethod(context,"getc"); + } else { + bt = ((RubyIO)data.currentFile).getc(); + } + if(bt.isNil()) { + data.currentFile = null; + continue; + } + return bt; + } + } + + @JRubyMethod(name = "read", optional = 2) + public static IRubyObject read(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + ArgsFileData data = ArgsFileData.getDataFrom(recv); + IRubyObject tmp, str, length; + long len = 0; + if(args.length > 0) { + length = args[0]; + if(args.length > 1) { + str = args[1]; + } else { + str = runtime.getNil(); + } + } else { + length = str = runtime.getNil(); + } + + if(!length.isNil()) { + len = RubyNumeric.num2long(length); + } + if(!str.isNil()) { + str = str.convertToString(); + ((RubyString)str).modify(); + ((RubyString)str).getByteList().length(0); + args[1] = runtime.getNil(); + } + while(true) { + if(data.currentFile == null && !data.nextArgsFile(context)) { + return str; + } + if(!(data.currentFile instanceof RubyIO)) { + tmp = data.currentFile.callMethod(context, "read", args); + } else { + tmp = ((RubyIO)data.currentFile).read(args); + } + if(str.isNil()) { + str = tmp; + } else if(!tmp.isNil()) { + ((RubyString)str).append(tmp); + } + if(tmp.isNil() || length.isNil()) { + data.currentFile = null; + continue; + } else if(args.length >= 1) { + if(((RubyString)str).getByteList().length() < len) { + len -= ((RubyString)str).getByteList().length(); + args[0] = runtime.newFixnum(len); + continue; + } + } + return str; + } + } + + @JRubyMethod(name = "filename", alias = {"path"}) + public static RubyString filename(ThreadContext context, IRubyObject recv) { + return (RubyString) context.getRuntime().getGlobalVariables().get("$FILENAME"); + } + + @JRubyMethod(name = "to_s") + public static IRubyObject to_s(IRubyObject recv) { + return recv.getRuntime().newString("ARGF"); + } +} +/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Ola Bini <Ola.Bini@ki.se> + * Copyright (C) 2006 Daniel Steer <damian.steer@hp.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.lang.reflect.Array; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.javasupport.JavaUtil; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.ByteList; +import org.jruby.util.Pack; + +/** + * The implementation of the built-in class Array in Ruby. + * + * Concurrency: no synchronization is required among readers, but + * all users must synchronize externally with writers. + * + */ +@JRubyClass(name="Array") +public class RubyArray extends RubyObject implements List { + + public static RubyClass createArrayClass(Ruby runtime) { + RubyClass arrayc = runtime.defineClass("Array", runtime.getObject(), ARRAY_ALLOCATOR); + runtime.setArray(arrayc); + arrayc.index = ClassIndex.ARRAY; + arrayc.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyArray; + } + }; + + arrayc.includeModule(runtime.getEnumerable()); + arrayc.defineAnnotatedMethods(RubyArray.class); + + return arrayc; + } + + private static ObjectAllocator ARRAY_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyArray(runtime, klass); + } + }; + + @Override + public int getNativeTypeIndex() { + return ClassIndex.ARRAY; + } + + private final void concurrentModification() { + throw getRuntime().newConcurrencyError("Detected invalid array contents due to unsynchronized modifications with concurrent users"); + } + + /** rb_ary_s_create + * + */ + @JRubyMethod(name = "[]", rest = true, frame = true, meta = true) + public static IRubyObject create(IRubyObject klass, IRubyObject[] args, Block block) { + RubyArray arr = (RubyArray) ((RubyClass) klass).allocate(); + arr.callInit(IRubyObject.NULL_ARRAY, block); + + if (args.length > 0) { + arr.alloc(args.length); + System.arraycopy(args, 0, arr.values, 0, args.length); + arr.realLength = args.length; + } + return arr; + } + + /** rb_ary_new2 + * + */ + public static final RubyArray newArray(final Ruby runtime, final long len) { + return new RubyArray(runtime, len); + } + public static final RubyArray newArrayLight(final Ruby runtime, final long len) { + return new RubyArray(runtime, len, false); + } + + /** rb_ary_new + * + */ + public static final RubyArray newArray(final Ruby runtime) { + return new RubyArray(runtime, ARRAY_DEFAULT_SIZE); + } + + /** rb_ary_new + * + */ + public static final RubyArray newArrayLight(final Ruby runtime) { + /* Ruby arrays default to holding 16 elements, so we create an + * ArrayList of the same size if we're not told otherwise + */ + RubyArray arr = new RubyArray(runtime, false); + arr.alloc(ARRAY_DEFAULT_SIZE); + return arr; + } + + public static RubyArray newArray(Ruby runtime, IRubyObject obj) { + return new RubyArray(runtime, new IRubyObject[] { obj }); + } + + public static RubyArray newArrayLight(Ruby runtime, IRubyObject obj) { + return new RubyArray(runtime, new IRubyObject[] { obj }, false); + } + + /** rb_assoc_new + * + */ + public static RubyArray newArray(Ruby runtime, IRubyObject car, IRubyObject cdr) { + return new RubyArray(runtime, new IRubyObject[] { car, cdr }); + } + + public static RubyArray newEmptyArray(Ruby runtime) { + return new RubyArray(runtime, NULL_ARRAY); + } + + /** rb_ary_new4, rb_ary_new3 + * + */ + public static RubyArray newArray(Ruby runtime, IRubyObject[] args) { + RubyArray arr = new RubyArray(runtime, args.length); + System.arraycopy(args, 0, arr.values, 0, args.length); + arr.realLength = args.length; + return arr; + } + + public static RubyArray newArrayNoCopy(Ruby runtime, IRubyObject[] args) { + return new RubyArray(runtime, args); + } + + public static RubyArray newArrayNoCopy(Ruby runtime, IRubyObject[] args, int begin) { + return new RubyArray(runtime, args, begin); + } + + public static RubyArray newArrayNoCopyLight(Ruby runtime, IRubyObject[] args) { + RubyArray arr = new RubyArray(runtime, false); + arr.values = args; + arr.realLength = args.length; + return arr; + } + + public static RubyArray newArray(Ruby runtime, Collection collection) { + RubyArray arr = new RubyArray(runtime, collection.size()); + collection.toArray(arr.values); + arr.realLength = arr.values.length; + return arr; + } + + public static final int ARRAY_DEFAULT_SIZE = 16; + + // volatile to ensure that initial nil-fill is visible to other threads + private volatile IRubyObject[] values; + + private static final int TMPLOCK_ARR_F = 1 << 9; + private static final int TMPLOCK_OR_FROZEN_ARR_F = TMPLOCK_ARR_F | FROZEN_F; + + private volatile boolean isShared = false; + private int begin = 0; + private int realLength = 0; + + /* + * plain internal array assignment + */ + private RubyArray(Ruby runtime, IRubyObject[] vals) { + super(runtime, runtime.getArray()); + values = vals; + realLength = vals.length; + } + + /* + * plain internal array assignment + */ + private RubyArray(Ruby runtime, IRubyObject[] vals, boolean objectSpace) { + super(runtime, runtime.getArray(), objectSpace); + values = vals; + realLength = vals.length; + } + + /* + * plain internal array assignment + */ + private RubyArray(Ruby runtime, IRubyObject[] vals, int begin) { + super(runtime, runtime.getArray()); + this.values = vals; + this.begin = begin; + this.realLength = vals.length - begin; + this.isShared = true; + } + + /* rb_ary_new2 + * just allocates the internal array + */ + private RubyArray(Ruby runtime, long length) { + super(runtime, runtime.getArray()); + checkLength(length); + alloc((int) length); + } + + private RubyArray(Ruby runtime, long length, boolean objectspace) { + super(runtime, runtime.getArray(), objectspace); + checkLength(length); + alloc((int)length); + } + + /* rb_ary_new3, rb_ary_new4 + * allocates the internal array of size length and copies the 'length' elements + */ + public RubyArray(Ruby runtime, long length, IRubyObject[] vals) { + super(runtime, runtime.getArray()); + checkLength(length); + int ilength = (int) length; + alloc(ilength); + if (ilength > 0 && vals.length > 0) System.arraycopy(vals, 0, values, 0, ilength); + + realLength = ilength; + } + + /* NEWOBJ and OBJSETUP equivalent + * fastest one, for shared arrays, optional objectspace + */ + private RubyArray(Ruby runtime, boolean objectSpace) { + super(runtime, runtime.getArray(), objectSpace); + } + + private RubyArray(Ruby runtime) { + super(runtime, runtime.getArray()); + alloc(ARRAY_DEFAULT_SIZE); + } + + public RubyArray(Ruby runtime, RubyClass klass) { + super(runtime, klass); + alloc(ARRAY_DEFAULT_SIZE); + } + + /* Array constructors taking the MetaClass to fulfil MRI Array subclass behaviour + * + */ + private RubyArray(Ruby runtime, RubyClass klass, int length) { + super(runtime, klass); + alloc(length); + } + + private RubyArray(Ruby runtime, RubyClass klass, long length) { + super(runtime, klass); + checkLength(length); + alloc((int)length); + } + + private RubyArray(Ruby runtime, RubyClass klass, long length, boolean objectspace) { + super(runtime, klass, objectspace); + checkLength(length); + alloc((int)length); + } + + private RubyArray(Ruby runtime, RubyClass klass, boolean objectSpace) { + super(runtime, klass, objectSpace); + } + + private RubyArray(Ruby runtime, RubyClass klass, RubyArray original) { + super(runtime, klass); + realLength = original.realLength; + alloc(realLength); + try { + System.arraycopy(original.values, original.begin, values, 0, realLength); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + } + + private final IRubyObject[] reserve(int length) { + final IRubyObject[] arr = new IRubyObject[length]; + Arrays.fill(arr, getRuntime().getNil()); + return arr; + } + + private final void alloc(int length) { + final IRubyObject[] newValues = new IRubyObject[length]; + Arrays.fill(newValues, getRuntime().getNil()); + values = newValues; + } + + private final void realloc(int newLength) { + IRubyObject[] reallocated = new IRubyObject[newLength]; + Arrays.fill(reallocated, getRuntime().getNil()); + try { + System.arraycopy(values, 0, reallocated, 0, newLength > realLength ? realLength : newLength); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + values = reallocated; + } + + private final void checkLength(long length) { + if (length < 0) { + throw getRuntime().newArgumentError("negative array size (or size too big)"); + } + + if (length >= Integer.MAX_VALUE) { + throw getRuntime().newArgumentError("array size too big"); + } + } + + /** Getter for property list. + * @return Value of property list. + */ + public List getList() { + return Arrays.asList(toJavaArray()); + } + + public int getLength() { + return realLength; + } + + public IRubyObject[] toJavaArray() { + IRubyObject[] copy = reserve(realLength); + try { + System.arraycopy(values, begin, copy, 0, realLength); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + return copy; + } + + public IRubyObject[] toJavaArrayUnsafe() { + return !isShared ? values : toJavaArray(); + } + + public IRubyObject[] toJavaArrayMaybeUnsafe() { + return (!isShared && begin == 0 && values.length == realLength) ? values : toJavaArray(); + } + + /** rb_ary_make_shared + * + */ + private final RubyArray makeShared(int beg, int len, RubyClass klass) { + return makeShared(beg, len, klass, klass.getRuntime().isObjectSpaceEnabled()); + } + + /** rb_ary_make_shared + * + */ + private final RubyArray makeShared(int beg, int len, RubyClass klass, boolean objectSpace) { + RubyArray sharedArray = new RubyArray(getRuntime(), klass, objectSpace); + isShared = true; + sharedArray.values = values; + sharedArray.isShared = true; + sharedArray.begin = beg; + sharedArray.realLength = len; + return sharedArray; + } + + /** rb_ary_modify_check + * + */ + private final void modifyCheck() { + if ((flags & TMPLOCK_OR_FROZEN_ARR_F) != 0) { + if ((flags & FROZEN_F) != 0) throw getRuntime().newFrozenError("array"); + if ((flags & TMPLOCK_ARR_F) != 0) throw getRuntime().newTypeError("can't modify array during iteration"); + } + if (!isTaint() && getRuntime().getSafeLevel() >= 4) { + throw getRuntime().newSecurityError("Insecure: can't modify array"); + } + } + + /** rb_ary_modify + * + */ + private final void modify() { + modifyCheck(); + if (isShared) { + IRubyObject[] vals = reserve(realLength); + isShared = false; + try { + System.arraycopy(values, begin, vals, 0, realLength); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + begin = 0; + values = vals; + } + } + + /* ================ + * Instance Methods + * ================ + */ + + /** rb_ary_initialize + * + */ + @JRubyMethod(name = "initialize", required = 0, optional = 2, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(ThreadContext context, IRubyObject[] args, Block block) { + int argc = args.length; + Ruby runtime = getRuntime(); + + if (argc == 0) { + modifyCheck(); + realLength = 0; + if (block.isGiven()) runtime.getWarnings().warn(ID.BLOCK_UNUSED, "given block not used"); + + return this; + } + + if (argc == 1 && !(args[0] instanceof RubyFixnum)) { + IRubyObject val = args[0].checkArrayType(); + if (!val.isNil()) { + replace(val); + return this; + } + } + + long len = RubyNumeric.num2long(args[0]); + + if (len < 0) throw runtime.newArgumentError("negative array size"); + + if (len >= Integer.MAX_VALUE) throw runtime.newArgumentError("array size too big"); + + int ilen = (int) len; + + modify(); + + if (ilen > values.length) values = reserve(ilen); + + if (block.isGiven()) { + if (argc == 2) { + runtime.getWarnings().warn(ID.BLOCK_BEATS_DEFAULT_VALUE, "block supersedes default value argument"); + } + + for (int i = 0; i < ilen; i++) { + store(i, block.yield(context, new RubyFixnum(runtime, i))); + realLength = i + 1; + } + } else { + try { + Arrays.fill(values, 0, ilen, (argc == 2) ? args[1] : runtime.getNil()); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + realLength = ilen; + } + return this; + } + + /** rb_ary_initialize_copy + * + */ + @JRubyMethod(name = {"initialize_copy"}, required = 1, visibility=Visibility.PRIVATE) + @Override + public IRubyObject initialize_copy(IRubyObject orig) { + return this.replace(orig); + } + + /** rb_ary_replace + * + */ + @JRubyMethod(name = {"replace"}, required = 1) + public IRubyObject replace(IRubyObject orig) { + modifyCheck(); + + RubyArray origArr = orig.convertToArray(); + + if (this == orig) return this; + + origArr.isShared = true; + isShared = true; + values = origArr.values; + realLength = origArr.realLength; + begin = origArr.begin; + + + return this; + } + + /** rb_ary_to_s + * + */ + @JRubyMethod(name = "to_s") + @Override + public IRubyObject to_s() { + if (realLength == 0) return RubyString.newEmptyString(getRuntime()); + + return join(getRuntime().getCurrentContext(), getRuntime().getGlobalVariables().get("$,")); + } + + + public boolean includes(ThreadContext context, IRubyObject item) { + int begin = this.begin; + + for (int i = begin; i < begin + realLength; i++) { + final IRubyObject value; + try { + value = values[i]; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + continue; + } + if (equalInternal(context, value, item)) return true; + } + + return false; + } + + /** rb_ary_hash + * + */ + @JRubyMethod(name = "hash") + public RubyFixnum hash(ThreadContext context) { + int h = realLength; + + Ruby runtime = getRuntime(); + int begin = this.begin; + for (int i = begin; i < begin + realLength; i++) { + h = (h << 1) | (h < 0 ? 1 : 0); + final IRubyObject value; + try { + value = values[i]; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + continue; + } + h ^= RubyNumeric.num2long(value.callMethod(context, MethodIndex.HASH, "hash")); + } + + return runtime.newFixnum(h); + } + + /** rb_ary_store + * + */ + public final IRubyObject store(long index, IRubyObject value) { + if (index < 0) { + index += realLength; + if (index < 0) { + throw getRuntime().newIndexError("index " + (index - realLength) + " out of array"); + } + } + + modify(); + + if (index >= realLength) { + if (index >= values.length) { + long newLength = values.length >> 1; + + if (newLength < ARRAY_DEFAULT_SIZE) newLength = ARRAY_DEFAULT_SIZE; + + newLength += index; + if (index >= Integer.MAX_VALUE || newLength >= Integer.MAX_VALUE) { + throw getRuntime().newArgumentError("index too big"); + } + realloc((int) newLength); + } + + realLength = (int) index + 1; + } + + try { + values[(int) index] = value; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + return value; + } + + /** rb_ary_elt + * + */ + private final IRubyObject elt(long offset) { + if (offset < 0 || offset >= realLength) { + return getRuntime().getNil(); + } + try { + return values[begin + (int)offset]; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + return getRuntime().getNil(); + } + } + + /** rb_ary_entry + * + */ + public final IRubyObject entry(long offset) { + return (offset < 0 ) ? elt(offset + realLength) : elt(offset); + } + + + /** rb_ary_entry + * + */ + public final IRubyObject entry(int offset) { + return (offset < 0 ) ? elt(offset + realLength) : elt(offset); + } + + public final IRubyObject eltInternal(int offset) { + return values[begin + offset]; + } + + public final IRubyObject eltInternalSet(int offset, IRubyObject item) { + return values[begin + offset] = item; + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public IRubyObject fetch(ThreadContext context, IRubyObject[] args, Block block) { + switch (args.length) { + case 1: + return fetch(context, args[0], block); + case 2: + return fetch(context, args[0], args[1], block); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_ary_fetch + * + */ + @JRubyMethod(name = "fetch", frame = true) + public IRubyObject fetch(ThreadContext context, IRubyObject arg0, Block block) { + long index = RubyNumeric.num2long(arg0); + + if (index < 0) index += realLength; + if (index < 0 || index >= realLength) { + if (block.isGiven()) return block.yield(context, arg0); + throw getRuntime().newIndexError("index " + index + " out of array"); + } + + try { + return values[begin + (int) index]; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + return getRuntime().getNil(); + } + } + + /** rb_ary_fetch + * + */ + @JRubyMethod(name = "fetch", frame = true) + public IRubyObject fetch(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + if (block.isGiven()) getRuntime().getWarnings().warn(ID.BLOCK_BEATS_DEFAULT_VALUE, "block supersedes default value argument"); + + long index = RubyNumeric.num2long(arg0); + + if (index < 0) index += realLength; + if (index < 0 || index >= realLength) { + if (block.isGiven()) return block.yield(context, arg0); + return arg1; + } + + try { + return values[begin + (int) index]; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + return getRuntime().getNil(); + } + } + + /** rb_ary_to_ary + * + */ + private static RubyArray aryToAry(IRubyObject obj) { + if (obj instanceof RubyArray) return (RubyArray) obj; + + if (obj.respondsTo("to_ary")) return obj.convertToArray(); + + RubyArray arr = new RubyArray(obj.getRuntime(), false); // possibly should not in object space + arr.alloc(1); + arr.values[0] = obj; + arr.realLength = 1; + return arr; + } + + /** rb_ary_splice + * + */ + private final void splice(long beg, long len, IRubyObject rpl) { + if (len < 0) throw getRuntime().newIndexError("negative length (" + len + ")"); + + if (beg < 0) { + beg += realLength; + if (beg < 0) { + beg -= realLength; + throw getRuntime().newIndexError("index " + beg + " out of array"); + } + } + + final RubyArray rplArr; + final int rlen; + + if (rpl == null || rpl.isNil()) { + rplArr = null; + rlen = 0; + } else { + rplArr = aryToAry(rpl); + rlen = rplArr.realLength; + } + + modify(); + + if (beg >= realLength) { + len = beg + rlen; + + if (len >= values.length) { + int tryNewLength = values.length + (values.length >> 1); + realloc(len > tryNewLength ? (int)len : tryNewLength); + } + + realLength = (int) len; + } else { + if (beg + len > realLength) len = realLength - beg; + + long alen = realLength + rlen - len; + if (alen >= values.length) { + int tryNewLength = values.length + (values.length >> 1); + realloc(alen > tryNewLength ? (int)alen : tryNewLength); + } + + if (len != rlen) { + try { + System.arraycopy(values, (int) (beg + len), values, (int) beg + rlen, realLength - (int) (beg + len)); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + realLength = (int) alen; + } + } + + if (rlen > 0) { + try { + System.arraycopy(rplArr.values, rplArr.begin, values, (int) beg, rlen); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + } + } + + /** rb_ary_splice + * + */ + private final void spliceOne(long beg, long len, IRubyObject rpl) { + if (len < 0) throw getRuntime().newIndexError("negative length (" + len + ")"); + + if (beg < 0) { + beg += realLength; + if (beg < 0) { + beg -= realLength; + throw getRuntime().newIndexError("index " + beg + " out of array"); + } + } + + modify(); + + if (beg >= realLength) { + len = beg + 1; + + if (len >= values.length) { + int tryNewLength = values.length + (values.length >> 1); + realloc(len > tryNewLength ? (int)len : tryNewLength); + } + + realLength = (int) len; + } else { + if (beg + len > realLength) len = realLength - beg; + + int alen = realLength + 1 - (int)len; + if (alen >= values.length) { + int tryNewLength = values.length + (values.length >> 1); + realloc(alen > tryNewLength ? alen : tryNewLength); + } + + if (len != 1) { + try { + System.arraycopy(values, (int) (beg + len), values, (int) beg + 1, realLength - (int) (beg + len)); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + realLength = alen; + } + } + + try { + values[(int)beg] = rpl; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + } + + @JRubyMethod + public IRubyObject insert() { + throw getRuntime().newArgumentError(0, 1); + } + + /** rb_ary_insert + * + */ + @JRubyMethod + public IRubyObject insert(IRubyObject arg) { + return this; + } + + /** rb_ary_insert + * + */ + @JRubyMethod + public IRubyObject insert(IRubyObject arg1, IRubyObject arg2) { + long pos = RubyNumeric.num2long(arg1); + + if (pos == -1) pos = realLength; + if (pos < 0) pos++; + + spliceOne(pos, 0, arg2); // rb_ary_new4 + + return this; + } + + /** rb_ary_insert + * + */ + @JRubyMethod(name = "insert", required = 1, rest = true) + public IRubyObject insert(IRubyObject[] args) { + if (args.length == 1) return this; + + long pos = RubyNumeric.num2long(args[0]); + + if (pos == -1) pos = realLength; + if (pos < 0) pos++; + + RubyArray inserted = new RubyArray(getRuntime(), false); + inserted.values = args; + inserted.begin = 1; + inserted.realLength = args.length - 1; + + splice(pos, 0, inserted); // rb_ary_new4 + + return this; + } + + /** rb_ary_dup + * + */ + public final RubyArray aryDup() { + RubyArray dup = new RubyArray(getRuntime(), getMetaClass(), this); + dup.flags |= flags & TAINTED_F; // from DUP_SETUP + // rb_copy_generic_ivar from DUP_SETUP here ...unlikely.. + return dup; + } + + /** rb_ary_transpose + * + */ + @JRubyMethod(name = "transpose") + public RubyArray transpose() { + RubyArray tmp, result = null; + + int alen = realLength; + if (alen == 0) return aryDup(); + + Ruby runtime = getRuntime(); + int elen = -1; + int end = begin + alen; + for (int i = begin; i < end; i++) { + tmp = elt(i).convertToArray(); + if (elen < 0) { + elen = tmp.realLength; + result = new RubyArray(runtime, elen); + for (int j = 0; j < elen; j++) { + result.store(j, new RubyArray(runtime, alen)); + } + } else if (elen != tmp.realLength) { + throw runtime.newIndexError("element size differs (" + tmp.realLength + + " should be " + elen + ")"); + } + for (int j = 0; j < elen; j++) { + ((RubyArray) result.elt(j)).store(i - begin, tmp.elt(j)); + } + } + return result; + } + + /** rb_values_at (internal) + * + */ + private final IRubyObject values_at(long olen, IRubyObject[] args) { + RubyArray result = new RubyArray(getRuntime(), args.length); + + for (int i = 0; i < args.length; i++) { + if (args[i] instanceof RubyFixnum) { + result.append(entry(((RubyFixnum)args[i]).getLongValue())); + continue; + } + + long beglen[]; + if (!(args[i] instanceof RubyRange)) { + } else if ((beglen = ((RubyRange) args[i]).begLen(olen, 0)) == null) { + continue; + } else { + int beg = (int) beglen[0]; + int len = (int) beglen[1]; + int end = begin + len; + for (int j = begin; j < end; j++) { + result.append(entry(j + beg)); + } + continue; + } + result.append(entry(RubyNumeric.num2long(args[i]))); + } + + return result; + } + + /** rb_values_at + * + */ + @JRubyMethod(name = "values_at", rest = true) + public IRubyObject values_at(IRubyObject[] args) { + return values_at(realLength, args); + } + + /** rb_ary_subseq + * + */ + public IRubyObject subseq(long beg, long len) { + if (beg > realLength || beg < 0 || len < 0) return getRuntime().getNil(); + + if (beg + len > realLength) { + len = realLength - beg; + + if (len < 0) len = 0; + } + + if (len == 0) return new RubyArray(getRuntime(), getMetaClass(), 0); + + return makeShared(begin + (int) beg, (int) len, getMetaClass()); + } + + /** rb_ary_subseq + * + */ + public IRubyObject subseqLight(long beg, long len) { + if (beg > realLength || beg < 0 || len < 0) return getRuntime().getNil(); + + if (beg + len > realLength) { + len = realLength - beg; + + if (len < 0) len = 0; + } + + if (len == 0) return new RubyArray(getRuntime(), getMetaClass(), 0, false); + + return makeShared(begin + (int) beg, (int) len, getMetaClass(), false); + } + + /** rb_ary_length + * + */ + @JRubyMethod(name = "length", alias = "size") + public RubyFixnum length() { + return getRuntime().newFixnum(realLength); + } + + /** rb_ary_push - specialized rb_ary_store + * + */ + @JRubyMethod(name = "<<", required = 1) + public RubyArray append(IRubyObject item) { + modify(); + + if (realLength == values.length) { + if (realLength == Integer.MAX_VALUE) throw getRuntime().newArgumentError("index too big"); + + long newLength = values.length + (values.length >> 1); + if ( newLength > Integer.MAX_VALUE ) { + newLength = Integer.MAX_VALUE; + }else if ( newLength < ARRAY_DEFAULT_SIZE ) { + newLength = ARRAY_DEFAULT_SIZE; + } + + realloc((int) newLength); + } + + try { + values[realLength++] = item; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + return this; + } + + /** rb_ary_push_m + * FIXME: Whis is this named "push_m"? + */ + @JRubyMethod(name = "push", rest = true) + public RubyArray push_m(IRubyObject[] items) { + for (int i = 0; i < items.length; i++) { + append(items[i]); + } + + return this; + } + + /** rb_ary_pop + * + */ + @JRubyMethod(name = "pop") + public IRubyObject pop() { + modifyCheck(); + + if (realLength == 0) return getRuntime().getNil(); + + if (isShared) { + try { + return values[begin + --realLength]; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + return getRuntime().getNil(); + } + } else { + int index = begin + --realLength; + try { + final IRubyObject obj = values[index]; + values[index] = getRuntime().getNil(); + return obj; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + return getRuntime().getNil(); + } + } + } + + /** rb_ary_shift + * + */ + @JRubyMethod(name = "shift") + public IRubyObject shift() { + modify(); + + if (realLength == 0) return getRuntime().getNil(); + + final IRubyObject obj; + try { + obj = values[begin]; + values[begin] = getRuntime().getNil(); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + return getRuntime().getNil(); + } + + isShared = true; + + begin++; + realLength--; + + return obj; + } + + /** rb_ary_unshift + * + */ + public RubyArray unshift(IRubyObject item) { + modify(); + + if (realLength == values.length) { + int newLength = values.length >> 1; + if (newLength < ARRAY_DEFAULT_SIZE) newLength = ARRAY_DEFAULT_SIZE; + + newLength += values.length; + realloc(newLength); + } + try { + System.arraycopy(values, 0, values, 1, realLength); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + + realLength++; + values[0] = item; + + return this; + } + + /** rb_ary_unshift_m + * + */ + @JRubyMethod(name = "unshift", rest = true) + public RubyArray unshift_m(IRubyObject[] items) { + long len = realLength; + + if (items.length == 0) return this; + + store(len + items.length - 1, getRuntime().getNil()); + + try { + // it's safe to use zeroes here since modified by store() + System.arraycopy(values, 0, values, items.length, (int) len); + System.arraycopy(items, 0, values, 0, items.length); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + + return this; + } + + /** rb_ary_includes + * + */ + @JRubyMethod(name = "include?", required = 1) + public RubyBoolean include_p(ThreadContext context, IRubyObject item) { + return context.getRuntime().newBoolean(includes(context, item)); + } + + /** rb_ary_frozen_p + * + */ + @JRubyMethod(name = "frozen?") + @Override + public RubyBoolean frozen_p(ThreadContext context) { + return context.getRuntime().newBoolean(isFrozen() || (flags & TMPLOCK_ARR_F) != 0); + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public IRubyObject aref(IRubyObject[] args) { + switch (args.length) { + case 1: + return aref(args[0]); + case 2: + return aref(args[0], args[1]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_ary_aref + */ + @JRubyMethod(name = {"[]", "slice"}) + public IRubyObject aref(IRubyObject arg0) { + if (arg0 instanceof RubyFixnum) return entry(((RubyFixnum)arg0).getLongValue()); + if (arg0 instanceof RubySymbol) throw getRuntime().newTypeError("Symbol as array index"); + + long[] beglen; + if (!(arg0 instanceof RubyRange)) { + } else if ((beglen = ((RubyRange) arg0).begLen(realLength, 0)) == null) { + return getRuntime().getNil(); + } else { + return subseq(beglen[0], beglen[1]); + } + return entry(RubyNumeric.num2long(arg0)); + } + + /** rb_ary_aref + */ + @JRubyMethod(name = {"[]", "slice"}) + public IRubyObject aref(IRubyObject arg0, IRubyObject arg1) { + if (arg0 instanceof RubySymbol) throw getRuntime().newTypeError("Symbol as array index"); + + long beg = RubyNumeric.num2long(arg0); + if (beg < 0) beg += realLength; + + return subseq(beg, RubyNumeric.num2long(arg1)); + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public IRubyObject aset(IRubyObject[] args) { + switch (args.length) { + case 2: + return aset(args[0], args[1]); + case 3: + return aset(args[0], args[1], args[2]); + default: + throw getRuntime().newArgumentError("wrong number of arguments (" + args.length + " for 2)"); + } + } + + /** rb_ary_aset + * + */ + @JRubyMethod(name = "[]=") + public IRubyObject aset(IRubyObject arg0, IRubyObject arg1) { + if (arg0 instanceof RubyFixnum) { + store(((RubyFixnum)arg0).getLongValue(), arg1); + return arg1; + } + if (arg0 instanceof RubyRange) { + long[] beglen = ((RubyRange) arg0).begLen(realLength, 1); + splice(beglen[0], beglen[1], arg1); + return arg1; + } + if (arg0 instanceof RubySymbol) throw getRuntime().newTypeError("Symbol as array index"); + + store(RubyNumeric.num2long(arg0), arg1); + return arg1; + } + + /** rb_ary_aset + * + */ + @JRubyMethod(name = "[]=") + public IRubyObject aset(IRubyObject arg0, IRubyObject arg1, IRubyObject arg2) { + if (arg0 instanceof RubySymbol) throw getRuntime().newTypeError("Symbol as array index"); + if (arg1 instanceof RubySymbol) throw getRuntime().newTypeError("Symbol as subarray length"); + splice(RubyNumeric.num2long(arg0), RubyNumeric.num2long(arg1), arg2); + return arg2; + } + + /** rb_ary_at + * + */ + @JRubyMethod(name = "at", required = 1) + public IRubyObject at(IRubyObject pos) { + return entry(RubyNumeric.num2long(pos)); + } + + /** rb_ary_concat + * + */ + @JRubyMethod(name = "concat", required = 1) + public RubyArray concat(IRubyObject obj) { + RubyArray ary = obj.convertToArray(); + + if (ary.realLength > 0) splice(realLength, 0, ary); + + return this; + } + + /** inspect_ary + * + */ + private IRubyObject inspectAry(ThreadContext context) { + ByteList buffer = new ByteList(); + buffer.append('['); + boolean tainted = isTaint(); + + for (int i = 0; i < realLength; i++) { + if (i > 0) buffer.append(',').append(' '); + + RubyString str = inspect(context, values[begin + i]); + if (str.isTaint()) tainted = true; + buffer.append(str.getByteList()); + } + buffer.append(']'); + + RubyString str = getRuntime().newString(buffer); + if (tainted) str.setTaint(true); + + return str; + } + + /** rb_ary_inspect + * + */ + @JRubyMethod(name = "inspect") + @Override + public IRubyObject inspect() { + if (realLength == 0) return getRuntime().newString("[]"); + if (getRuntime().isInspecting(this)) return getRuntime().newString("[...]"); + + try { + getRuntime().registerInspecting(this); + return inspectAry(getRuntime().getCurrentContext()); + } finally { + getRuntime().unregisterInspecting(this); + } + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public IRubyObject first(IRubyObject[] args) { + switch (args.length) { + case 0: + return first(); + case 1: + return first(args[0]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 0, 1); + return null; // not reached + } + } + + /** rb_ary_first + * + */ + @JRubyMethod(name = "first") + public IRubyObject first() { + if (realLength == 0) return getRuntime().getNil(); + return values[begin]; + } + + /** rb_ary_first + * + */ + @JRubyMethod(name = "first") + public IRubyObject first(IRubyObject arg0) { + long n = RubyNumeric.num2long(arg0); + if (n > realLength) { + n = realLength; + } else if (n < 0) { + throw getRuntime().newArgumentError("negative array size (or size too big)"); + } + + return makeShared(begin, (int) n, getRuntime().getArray()); + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public IRubyObject last(IRubyObject[] args) { + switch (args.length) { + case 0: + return last(); + case 1: + return last(args[0]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 0, 1); + return null; // not reached + } + } + + /** rb_ary_last + * + */ + @JRubyMethod(name = "last") + public IRubyObject last() { + if (realLength == 0) return getRuntime().getNil(); + return values[begin + realLength - 1]; + } + + /** rb_ary_last + * + */ + @JRubyMethod(name = "last") + public IRubyObject last(IRubyObject arg0) { + long n = RubyNumeric.num2long(arg0); + if (n > realLength) { + n = realLength; + } else if (n < 0) { + throw getRuntime().newArgumentError("negative array size (or size too big)"); + } + + return makeShared(begin + realLength - (int) n, (int) n, getRuntime().getArray()); + } + + /** rb_ary_each + * + */ + @JRubyMethod(name = "each", frame = true) + public IRubyObject each(ThreadContext context, Block block) { + for (int i = 0; i < realLength; i++) { + block.yield(context, values[begin + i]); + } + return this; + } + + /** rb_ary_each_index + * + */ + @JRubyMethod(name = "each_index", frame = true) + public IRubyObject each_index(ThreadContext context, Block block) { + Ruby runtime = getRuntime(); + for (int i = 0; i < realLength; i++) { + block.yield(context, runtime.newFixnum(i)); + } + return this; + } + + /** rb_ary_reverse_each + * + */ + @JRubyMethod(name = "reverse_each", frame = true) + public IRubyObject reverse_each(ThreadContext context, Block block) { + int len = realLength; + + while(len-- > 0) { + block.yield(context, values[begin + len]); + + if (realLength < len) len = realLength; + } + + return this; + } + + private IRubyObject inspectJoin(ThreadContext context, RubyArray tmp, IRubyObject sep) { + Ruby runtime = getRuntime(); + + // If already inspecting, there is no need to register/unregister again. + if (runtime.isInspecting(this)) { + return tmp.join(context, sep); + } + + try { + runtime.registerInspecting(this); + return tmp.join(context, sep); + } finally { + runtime.unregisterInspecting(this); + } + } + + /** rb_ary_join + * + */ + public RubyString join(ThreadContext context, IRubyObject sep) { + final Ruby runtime = getRuntime(); + + if (realLength == 0) return RubyString.newEmptyString(getRuntime()); + + boolean taint = isTaint() || sep.isTaint(); + + long len = 1; + for (int i = begin; i < begin + realLength; i++) { + IRubyObject value; + try { + value = values[i]; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + return runtime.newString(""); + } + IRubyObject tmp = value.checkStringType(); + len += tmp.isNil() ? 10 : ((RubyString) tmp).getByteList().length(); + } + + RubyString strSep = null; + if (!sep.isNil()) { + sep = strSep = sep.convertToString(); + len += strSep.getByteList().length() * (realLength - 1); + } + + ByteList buf = new ByteList((int)len); + for (int i = begin; i < begin + realLength; i++) { + IRubyObject tmp; + try { + tmp = values[i]; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + return runtime.newString(""); + } + if (tmp instanceof RubyString) { + // do nothing + } else if (tmp instanceof RubyArray) { + if (runtime.isInspecting(tmp)) { + tmp = runtime.newString("[...]"); + } else { + tmp = inspectJoin(context, (RubyArray)tmp, sep); + } + } else { + tmp = RubyString.objAsString(context, tmp); + } + + if (i > begin && !sep.isNil()) buf.append(strSep.getByteList()); + + buf.append(tmp.asString().getByteList()); + if (tmp.isTaint()) taint = true; + } + + RubyString result = runtime.newString(buf); + + if (taint) result.setTaint(true); + + return result; + } + + /** rb_ary_join_m + * + */ + @JRubyMethod(name = "join", optional = 1) + public RubyString join_m(ThreadContext context, IRubyObject[] args) { + int argc = args.length; + IRubyObject sep = (argc == 1) ? args[0] : getRuntime().getGlobalVariables().get("$,"); + + return join(context, sep); + } + + /** rb_ary_to_a + * + */ + @JRubyMethod(name = "to_a") + @Override + public RubyArray to_a() { + if(getMetaClass() != getRuntime().getArray()) { + RubyArray dup = new RubyArray(getRuntime(), getRuntime().isObjectSpaceEnabled()); + + isShared = true; + dup.isShared = true; + dup.values = values; + dup.realLength = realLength; + dup.begin = begin; + + return dup; + } + return this; + } + + @JRubyMethod(name = "to_ary") + public IRubyObject to_ary() { + return this; + } + + @Override + public RubyArray convertToArray() { + return this; + } + + @Override + public IRubyObject checkArrayType(){ + return this; + } + + /** rb_ary_equal + * + */ + @JRubyMethod(name = "==", required = 1) + @Override + public IRubyObject op_equal(ThreadContext context, IRubyObject obj) { + if (this == obj) return getRuntime().getTrue(); + + if (!(obj instanceof RubyArray)) { + if (!obj.respondsTo("to_ary")) { + return getRuntime().getFalse(); + } else { + if (equalInternal(context, obj.callMethod(context, "to_ary"), this)) return getRuntime().getTrue(); + return getRuntime().getFalse(); + } + } + + RubyArray ary = (RubyArray) obj; + if (realLength != ary.realLength) return getRuntime().getFalse(); + + Ruby runtime = getRuntime(); + for (long i = 0; i < realLength; i++) { + if (!equalInternal(context, elt(i), ary.elt(i))) return runtime.getFalse(); + } + return runtime.getTrue(); + } + + /** rb_ary_eql + * + */ + @JRubyMethod(name = "eql?", required = 1) + public RubyBoolean eql_p(ThreadContext context, IRubyObject obj) { + if (this == obj) return getRuntime().getTrue(); + if (!(obj instanceof RubyArray)) return getRuntime().getFalse(); + + RubyArray ary = (RubyArray) obj; + + if (realLength != ary.realLength) return getRuntime().getFalse(); + + Ruby runtime = getRuntime(); + for (int i = 0; i < realLength; i++) { + if (!eqlInternal(context, elt(i), ary.elt(i))) return runtime.getFalse(); + } + return runtime.getTrue(); + } + + /** rb_ary_compact_bang + * + */ + @JRubyMethod(name = "compact!") + public IRubyObject compact_bang() { + modify(); + + int p = 0; + int t = 0; + int end = p + realLength; + + while (t < end) { + if (values[t].isNil()) { + t++; + } else { + values[p++] = values[t++]; + } + } + + if (realLength == p) return getRuntime().getNil(); + + realloc(p); + realLength = p; + return this; + } + + /** rb_ary_compact + * + */ + @JRubyMethod(name = "compact") + public IRubyObject compact() { + RubyArray ary = aryDup(); + ary.compact_bang(); + return ary; + } + + /** rb_ary_empty_p + * + */ + @JRubyMethod(name = "empty?") + public IRubyObject empty_p() { + return realLength == 0 ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + /** rb_ary_clear + * + */ + @JRubyMethod(name = "clear") + public IRubyObject rb_clear() { + modifyCheck(); + + if(isShared) { + alloc(ARRAY_DEFAULT_SIZE); + isShared = true; + } else if (values.length > ARRAY_DEFAULT_SIZE << 1){ + alloc(ARRAY_DEFAULT_SIZE << 1); + } else { + final int begin = this.begin; + try { + Arrays.fill(values, begin, begin + realLength, getRuntime().getNil()); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + } + + begin = 0; + realLength = 0; + return this; + } + + /** rb_ary_fill + * + */ + @JRubyMethod(name = "fill", optional = 3, frame = true) + public IRubyObject fill(ThreadContext context, IRubyObject[] args, Block block) { + IRubyObject item = null; + IRubyObject begObj = null; + IRubyObject lenObj = null; + int argc = args.length; + + if (block.isGiven()) { + Arity.checkArgumentCount(getRuntime(), args, 0, 2); + item = null; + begObj = argc > 0 ? args[0] : null; + lenObj = argc > 1 ? args[1] : null; + argc++; + } else { + Arity.checkArgumentCount(getRuntime(), args, 1, 3); + item = args[0]; + begObj = argc > 1 ? args[1] : null; + lenObj = argc > 2 ? args[2] : null; + } + + int beg = 0, end = 0, len = 0; + switch (argc) { + case 1: + beg = 0; + len = realLength; + break; + case 2: + if (begObj instanceof RubyRange) { + long[] beglen = ((RubyRange) begObj).begLen(realLength, 1); + beg = (int) beglen[0]; + len = (int) beglen[1]; + break; + } + /* fall through */ + case 3: + beg = begObj.isNil() ? 0 : RubyNumeric.num2int(begObj); + if (beg < 0) { + beg = realLength + beg; + if (beg < 0) beg = 0; + } + len = (lenObj == null || lenObj.isNil()) ? realLength - beg : RubyNumeric.num2int(lenObj); + // TODO: In MRI 1.9, an explicit check for negative length is + // added here. IndexError is raised when length is negative. + // See [ruby-core:12953] for more details. + // + // New note: This is actually under re-evaluation, + // see [ruby-core:17483]. + break; + } + + modify(); + + // See [ruby-core:17483] + if (len < 0) { + return this; + } + + if (len > Integer.MAX_VALUE - beg) { + throw getRuntime().newArgumentError("argument too big"); + } + + end = beg + len; + if (end > realLength) { + if (end >= values.length) realloc(end); + + realLength = end; + } + + if (block.isGiven()) { + Ruby runtime = getRuntime(); + for (int i = beg; i < end; i++) { + IRubyObject v = block.yield(context, runtime.newFixnum(i)); + if (i >= realLength) break; + try { + values[i] = v; + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + } + } else { + if (len > 0) { + try { + Arrays.fill(values, beg, beg + len, item); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + } + } + + return this; + } + + /** rb_ary_index + * + */ + @JRubyMethod(name = "index", required = 1) + public IRubyObject index(ThreadContext context, IRubyObject obj) { + Ruby runtime = getRuntime(); + for (int i = begin; i < begin + realLength; i++) { + if (equalInternal(context, values[i], obj)) return runtime.newFixnum(i - begin); + } + + return runtime.getNil(); + } + + /** rb_ary_rindex + * + */ + @JRubyMethod(name = "rindex", required = 1) + public IRubyObject rindex(ThreadContext context, IRubyObject obj) { + Ruby runtime = getRuntime(); + int i = realLength; + + while (i-- > 0) { + if (i > realLength) { + i = realLength; + continue; + } + if (equalInternal(context, values[begin + i], obj)) return getRuntime().newFixnum(i); + } + + return runtime.getNil(); + } + + /** rb_ary_indexes + * + */ + @JRubyMethod(name = {"indexes", "indices"}, required = 1, rest = true) + public IRubyObject indexes(IRubyObject[] args) { + getRuntime().getWarnings().warn(ID.DEPRECATED_METHOD, "Array#indexes is deprecated; use Array#values_at", "Array#indexes", "Array#values_at"); + + RubyArray ary = new RubyArray(getRuntime(), args.length); + + IRubyObject[] arefArgs = new IRubyObject[1]; + for (int i = 0; i < args.length; i++) { + arefArgs[0] = args[i]; + ary.append(aref(arefArgs)); + } + + return ary; + } + + /** rb_ary_reverse_bang + * + */ + @JRubyMethod(name = "reverse!") + public IRubyObject reverse_bang() { + modify(); + + final int realLength = this.realLength; + final IRubyObject[] values = this.values; + try { + if (realLength > 1) { + int p1 = 0; + int p2 = p1 + realLength - 1; + + while (p1 < p2) { + final IRubyObject tmp = values[p1]; + values[p1++] = values[p2]; + values[p2--] = tmp; + } + } + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + return this; + } + + /** rb_ary_reverse_m + * + */ + @JRubyMethod(name = "reverse") + public IRubyObject reverse() { + return aryDup().reverse_bang(); + } + + /** rb_ary_collect + * + */ + @JRubyMethod(name = {"collect", "map"}, frame = true) + public RubyArray collect(ThreadContext context, Block block) { + Ruby runtime = getRuntime(); + + if (!block.isGiven()) return new RubyArray(getRuntime(), runtime.getArray(), this); + + RubyArray collect = new RubyArray(runtime, realLength); + + for (int i = begin; i < begin + realLength; i++) { + collect.append(block.yield(context, values[i])); + } + + return collect; + } + + /** rb_ary_collect_bang + * + */ + @JRubyMethod(name = {"collect!", "map!"}, frame = true) + public RubyArray collect_bang(ThreadContext context, Block block) { + modify(); + for (int i = 0, len = realLength; i < len; i++) { + store(i, block.yield(context, values[begin + i])); + } + return this; + } + + /** rb_ary_select + * + */ + @JRubyMethod(name = "select", frame = true) + public RubyArray select(ThreadContext context, Block block) { + Ruby runtime = getRuntime(); + RubyArray result = new RubyArray(runtime, realLength); + + if (isShared) { + for (int i = begin; i < begin + realLength; i++) { + if (block.yield(context, values[i]).isTrue()) result.append(elt(i - begin)); + } + } else { + for (int i = 0; i < realLength; i++) { + if (block.yield(context, values[i]).isTrue()) result.append(elt(i)); + } + } + return result; + } + + /** rb_ary_delete + * + */ + @JRubyMethod(name = "delete", required = 1, frame = true) + public IRubyObject delete(ThreadContext context, IRubyObject item, Block block) { + int i2 = 0; + + Ruby runtime = getRuntime(); + for (int i1 = 0; i1 < realLength; i1++) { + IRubyObject e = values[begin + i1]; + if (equalInternal(context, e, item)) continue; + if (i1 != i2) store(i2, e); + i2++; + } + + if (realLength == i2) { + if (block.isGiven()) return block.yield(context, item); + + return runtime.getNil(); + } + + modify(); + + final int realLength = this.realLength; + final int begin = this.begin; + final IRubyObject[] values = this.values; + if (realLength > i2) { + try { + Arrays.fill(values, begin + i2, begin + realLength, getRuntime().getNil()); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + this.realLength = i2; + if (i2 << 1 < values.length && values.length > ARRAY_DEFAULT_SIZE) realloc(i2 << 1); + } + + return item; + } + + /** rb_ary_delete_at + * + */ + private final IRubyObject delete_at(int pos) { + int len = realLength; + + if (pos >= len) return getRuntime().getNil(); + + if (pos < 0) pos += len; + + if (pos < 0) return getRuntime().getNil(); + + modify(); + + IRubyObject obj = values[pos]; + try { + System.arraycopy(values, pos + 1, values, pos, len - (pos + 1)); + values[realLength-1] = getRuntime().getNil(); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + realLength--; + + return obj; + } + + /** rb_ary_delete_at_m + * + */ + @JRubyMethod(name = "delete_at", required = 1) + public IRubyObject delete_at(IRubyObject obj) { + return delete_at((int) RubyNumeric.num2long(obj)); + } + + /** rb_ary_reject_bang + * + */ + @JRubyMethod(name = "reject", frame = true) + public IRubyObject reject(ThreadContext context, Block block) { + RubyArray ary = aryDup(); + ary.reject_bang(context, block); + return ary; + } + + /** rb_ary_reject_bang + * + */ + @JRubyMethod(name = "reject!", frame = true) + public IRubyObject reject_bang(ThreadContext context, Block block) { + int i2 = 0; + modify(); + + for (int i1 = 0; i1 < realLength; i1++) { + IRubyObject v = values[i1]; + if (block.yield(context, v).isTrue()) continue; + + if (i1 != i2) store(i2, v); + i2++; + } + if (realLength == i2) return getRuntime().getNil(); + + if (i2 < realLength) { + try { + Arrays.fill(values, i2, realLength, getRuntime().getNil()); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + realLength = i2; + } + + return this; + } + + /** rb_ary_delete_if + * + */ + @JRubyMethod(name = "delete_if", frame = true) + public IRubyObject delete_if(ThreadContext context, Block block) { + reject_bang(context, block); + return this; + } + + /** rb_ary_zip + * + */ + @JRubyMethod(name = "zip", optional = 1, rest = true, frame = true) + public IRubyObject zip(ThreadContext context, IRubyObject[] args, Block block) { + for (int i = 0; i < args.length; i++) { + args[i] = args[i].convertToArray(); + } + + Ruby runtime = getRuntime(); + if (block.isGiven()) { + for (int i = 0; i < realLength; i++) { + RubyArray tmp = new RubyArray(runtime, args.length + 1); + tmp.append(elt(i)); + for (int j = 0; j < args.length; j++) { + tmp.append(((RubyArray) args[j]).elt(i)); + } + block.yield(context, tmp); + } + return runtime.getNil(); + } + + int len = realLength; + RubyArray result = new RubyArray(runtime, len); + for (int i = 0; i < len; i++) { + RubyArray tmp = new RubyArray(runtime, args.length + 1); + tmp.append(elt(i)); + for (int j = 0; j < args.length; j++) { + tmp.append(((RubyArray) args[j]).elt(i)); + } + result.append(tmp); + } + return result; + } + + /** rb_ary_cmp + * + */ + @JRubyMethod(name = "<=>", required = 1) + public IRubyObject op_cmp(ThreadContext context, IRubyObject obj) { + RubyArray ary2 = obj.convertToArray(); + + int len = realLength; + + if (len > ary2.realLength) len = ary2.realLength; + + Ruby runtime = getRuntime(); + for (int i = 0; i < len; i++) { + IRubyObject v = elt(i).callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", ary2.elt(i)); + if (!(v instanceof RubyFixnum) || ((RubyFixnum) v).getLongValue() != 0) return v; + } + len = realLength - ary2.realLength; + + if (len == 0) return RubyFixnum.zero(runtime); + if (len > 0) return RubyFixnum.one(runtime); + + return RubyFixnum.minus_one(runtime); + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public IRubyObject slice_bang(IRubyObject[] args) { + switch (args.length) { + case 1: + return slice_bang(args[0]); + case 2: + return slice_bang(args[0], args[1]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_ary_slice_bang + * + */ + @JRubyMethod(name = "slice!") + public IRubyObject slice_bang(IRubyObject arg0) { + if (arg0 instanceof RubyRange) { + long[] beglen = ((RubyRange) arg0).begLen(realLength, 1); + long pos = beglen[0]; + long len = beglen[1]; + + if (pos < 0) pos = realLength + pos; + + arg0 = subseq(pos, len); + splice(pos, len, null); + return arg0; + } + return delete_at((int) RubyNumeric.num2long(arg0)); + } + + /** rb_ary_slice_bang + * + */ + @JRubyMethod(name = "slice!") + public IRubyObject slice_bang(IRubyObject arg0, IRubyObject arg1) { + long pos = RubyNumeric.num2long(arg0); + long len = RubyNumeric.num2long(arg1); + + if (pos < 0) pos = realLength + pos; + + arg1 = subseq(pos, len); + splice(pos, len, null); + + return arg1; + } + + /** rb_ary_assoc + * + */ + @JRubyMethod(name = "assoc", required = 1) + public IRubyObject assoc(ThreadContext context, IRubyObject key) { + Ruby runtime = getRuntime(); + + for (int i = begin; i < begin + realLength; i++) { + IRubyObject v = values[i]; + if (v instanceof RubyArray) { + RubyArray arr = (RubyArray)v; + if (arr.realLength > 0 && equalInternal(context, arr.values[arr.begin], key)) return arr; + } + } + + return runtime.getNil(); + } + + /** rb_ary_rassoc + * + */ + @JRubyMethod(name = "rassoc", required = 1) + public IRubyObject rassoc(ThreadContext context, IRubyObject value) { + Ruby runtime = getRuntime(); + + for (int i = begin; i < begin + realLength; i++) { + IRubyObject v = values[i]; + if (v instanceof RubyArray) { + RubyArray arr = (RubyArray)v; + if (arr.realLength > 1 && equalInternal(context, arr.values[arr.begin + 1], value)) return arr; + } + } + + return runtime.getNil(); + } + + /** flatten + * + */ + private final int flatten(ThreadContext context, int index, RubyArray ary2, RubyArray memo) { + int i = index; + int n; + int lim = index + ary2.realLength; + + IRubyObject id = ary2.id(); + + if (memo.includes(context, id)) throw getRuntime().newArgumentError("tried to flatten recursive array"); + + memo.append(id); + splice(index, 1, ary2); + while (i < lim) { + IRubyObject tmp = elt(i).checkArrayType(); + if (!tmp.isNil()) { + n = flatten(context, i, (RubyArray) tmp, memo); + i += n; + lim += n; + } + i++; + } + memo.pop(); + return lim - index - 1; /* returns number of increased items */ + } + + /** rb_ary_flatten_bang + * + */ + @JRubyMethod(name = "flatten!") + public IRubyObject flatten_bang(ThreadContext context) { + int i = 0; + RubyArray memo = null; + + while (i < realLength) { + IRubyObject ary2 = values[begin + i]; + IRubyObject tmp = ary2.checkArrayType(); + if (!tmp.isNil()) { + if (memo == null) { + memo = new RubyArray(getRuntime(), false); + memo.values = reserve(ARRAY_DEFAULT_SIZE); + } + + i += flatten(context, i, (RubyArray) tmp, memo); + } + i++; + } + if (memo == null) return getRuntime().getNil(); + + return this; + } + + /** rb_ary_flatten + * + */ + @JRubyMethod(name = "flatten") + public IRubyObject flatten(ThreadContext context) { + RubyArray ary = aryDup(); + ary.flatten_bang(context); + return ary; + } + + /** rb_ary_nitems + * + */ + @JRubyMethod(name = "nitems") + public IRubyObject nitems() { + int n = 0; + + for (int i = begin; i < begin + realLength; i++) { + if (!values[i].isNil()) n++; + } + + return getRuntime().newFixnum(n); + } + + /** rb_ary_plus + * + */ + @JRubyMethod(name = "+", required = 1) + public IRubyObject op_plus(IRubyObject obj) { + RubyArray y = obj.convertToArray(); + int len = realLength + y.realLength; + RubyArray z = new RubyArray(getRuntime(), len); + try { + System.arraycopy(values, begin, z.values, 0, realLength); + System.arraycopy(y.values, y.begin, z.values, realLength, y.realLength); + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + z.realLength = len; + return z; + } + + /** rb_ary_times + * + */ + @JRubyMethod(name = "*", required = 1) + public IRubyObject op_times(ThreadContext context, IRubyObject times) { + IRubyObject tmp = times.checkStringType(); + + if (!tmp.isNil()) return join(context, tmp); + + long len = RubyNumeric.num2long(times); + if (len == 0) return new RubyArray(getRuntime(), getMetaClass(), 0); + if (len < 0) throw getRuntime().newArgumentError("negative argument"); + + if (Long.MAX_VALUE / len < realLength) { + throw getRuntime().newArgumentError("argument too big"); + } + + len *= realLength; + + RubyArray ary2 = new RubyArray(getRuntime(), getMetaClass(), len); + ary2.realLength = (int) len; + + try { + for (int i = 0; i < len; i += realLength) { + System.arraycopy(values, begin, ary2.values, i, realLength); + } + } catch (ArrayIndexOutOfBoundsException e) { + concurrentModification(); + } + + ary2.infectBy(this); + + return ary2; + } + + /** ary_make_hash + * + */ + private final RubyHash makeHash(RubyArray ary2) { + RubyHash hash = new RubyHash(getRuntime(), false); + int begin = this.begin; + for (int i = begin; i < begin + realLength; i++) { + hash.fastASet(values[i], NEVER); + } + + if (ary2 != null) { + begin = ary2.begin; + for (int i = begin; i < begin + ary2.realLength; i++) { + hash.fastASet(ary2.values[i], NEVER); + } + } + return hash; + } + + /** rb_ary_uniq_bang + * + */ + @JRubyMethod(name = "uniq!") + public IRubyObject uniq_bang() { + RubyHash hash = makeHash(null); + + if (realLength == hash.size()) return getRuntime().getNil(); + + int j = 0; + for (int i = 0; i < realLength; i++) { + IRubyObject v = elt(i); + if (hash.fastDelete(v)) store(j++, v); + } + realLength = j; + return this; + } + + /** rb_ary_uniq + * + */ + @JRubyMethod(name = "uniq") + public IRubyObject uniq() { + RubyArray ary = aryDup(); + ary.uniq_bang(); + return ary; + } + + /** rb_ary_diff + * + */ + @JRubyMethod(name = "-", required = 1) + public IRubyObject op_diff(IRubyObject other) { + RubyHash hash = other.convertToArray().makeHash(null); + RubyArray ary3 = new RubyArray(getRuntime()); + + int begin = this.begin; + for (int i = begin; i < begin + realLength; i++) { + if (hash.fastARef(values[i]) != null) continue; + ary3.append(elt(i - begin)); + } + + return ary3; + } + + /** rb_ary_and + * + */ + @JRubyMethod(name = "&", required = 1) + public IRubyObject op_and(IRubyObject other) { + RubyArray ary2 = other.convertToArray(); + RubyHash hash = ary2.makeHash(null); + RubyArray ary3 = new RubyArray(getRuntime(), + realLength < ary2.realLength ? realLength : ary2.realLength); + + for (int i = 0; i < realLength; i++) { + IRubyObject v = elt(i); + if (hash.fastDelete(v)) ary3.append(v); + } + + return ary3; + } + + /** rb_ary_or + * + */ + @JRubyMethod(name = "|", required = 1) + public IRubyObject op_or(IRubyObject other) { + RubyArray ary2 = other.convertToArray(); + RubyHash set = makeHash(ary2); + + RubyArray ary3 = new RubyArray(getRuntime(), realLength + ary2.realLength); + + for (int i = 0; i < realLength; i++) { + IRubyObject v = elt(i); + if (set.fastDelete(v)) ary3.append(v); + } + for (int i = 0; i < ary2.realLength; i++) { + IRubyObject v = ary2.elt(i); + if (set.fastDelete(v)) ary3.append(v); + } + return ary3; + } + + /** rb_ary_sort + * + */ + @JRubyMethod(name = "sort", frame = true) + public RubyArray sort(Block block) { + RubyArray ary = aryDup(); + ary.sort_bang(block); + return ary; + } + + /** rb_ary_sort_bang + * + */ + @JRubyMethod(name = "sort!", frame = true) + public RubyArray sort_bang(Block block) { + modify(); + if (realLength > 1) { + flags |= TMPLOCK_ARR_F; + try { + if (block.isGiven()) { + Arrays.sort(values, 0, realLength, new BlockComparator(block)); + } else { + Arrays.sort(values, 0, realLength, new DefaultComparator()); + } + } finally { + flags &= ~TMPLOCK_ARR_F; + } + } + return this; + } + + final class BlockComparator implements Comparator { + private Block block; + + public BlockComparator(Block block) { + this.block = block; + } + + public int compare(Object o1, Object o2) { + ThreadContext context = getRuntime().getCurrentContext(); + IRubyObject obj1 = (IRubyObject) o1; + IRubyObject obj2 = (IRubyObject) o2; + IRubyObject ret = block.yield(context, getRuntime().newArray(obj1, obj2), null, null, true); + int n = RubyComparable.cmpint(context, ret, obj1, obj2); + //TODO: ary_sort_check should be done here + return n; + } + } + + static final class DefaultComparator implements Comparator { + public int compare(Object o1, Object o2) { + if (o1 instanceof RubyFixnum && o2 instanceof RubyFixnum) { + return compareFixnums(o1, o2); + } + if (o1 instanceof RubyString && o2 instanceof RubyString) { + return ((RubyString) o1).op_cmp((RubyString) o2); + } + //TODO: ary_sort_check should be done here + return compareOthers((IRubyObject)o1, (IRubyObject)o2); + } + + private int compareFixnums(Object o1, Object o2) { + long a = ((RubyFixnum) o1).getLongValue(); + long b = ((RubyFixnum) o2).getLongValue(); + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + return 0; + } + + private int compareOthers(IRubyObject o1, IRubyObject o2) { + ThreadContext context = o1.getRuntime().getCurrentContext(); + IRubyObject ret = o1.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", o2); + int n = RubyComparable.cmpint(context, ret, o1, o2); + //TODO: ary_sort_check should be done here + return n; + } + } + + public static void marshalTo(RubyArray array, MarshalStream output) throws IOException { + output.registerLinkTarget(array); + output.writeInt(array.getList().size()); + for (Iterator iter = array.getList().iterator(); iter.hasNext();) { + output.dumpObject((IRubyObject) iter.next()); + } + } + + public static RubyArray unmarshalFrom(UnmarshalStream input) throws IOException { + RubyArray result = input.getRuntime().newArray(); + input.registerLinkTarget(result); + int size = input.unmarshalInt(); + for (int i = 0; i < size; i++) { + result.append(input.unmarshalObject()); + } + return result; + } + + /** + * @see org.jruby.util.Pack#pack + */ + @JRubyMethod(name = "pack", required = 1) + public RubyString pack(ThreadContext context, IRubyObject obj) { + RubyString iFmt = RubyString.objAsString(context, obj); + return Pack.pack(getRuntime(), this, iFmt.getByteList()); + } + + @Override + public Class getJavaClass() { + return List.class; + } + + // Satisfy java.util.List interface (for Java integration) + public int size() { + return realLength; + } + + public boolean isEmpty() { + return realLength == 0; + } + + public boolean contains(Object element) { + return indexOf(element) != -1; + } + + public Object[] toArray() { + Object[] array = new Object[realLength]; + for (int i = begin; i < realLength; i++) { + array[i - begin] = JavaUtil.convertRubyToJava(values[i]); + } + return array; + } + + public Object[] toArray(final Object[] arg) { + Object[] array = arg; + if (array.length < realLength) { + Class type = array.getClass().getComponentType(); + array = (Object[]) Array.newInstance(type, realLength); + } + int length = realLength - begin; + + for (int i = 0; i < length; i++) { + array[i] = JavaUtil.convertRubyToJava(values[i + begin]); + } + return array; + } + + public boolean add(Object element) { + append(JavaUtil.convertJavaToRuby(getRuntime(), element)); + return true; + } + + public boolean remove(Object element) { + IRubyObject deleted = delete(getRuntime().getCurrentContext(), JavaUtil.convertJavaToRuby(getRuntime(), element), Block.NULL_BLOCK); + return deleted.isNil() ? false : true; // TODO: is this correct ? + } + + public boolean containsAll(Collection c) { + for (Iterator iter = c.iterator(); iter.hasNext();) { + if (indexOf(iter.next()) == -1) { + return false; + } + } + + return true; + } + + public boolean addAll(Collection c) { + for (Iterator iter = c.iterator(); iter.hasNext();) { + add(iter.next()); + } + return !c.isEmpty(); + } + + public boolean addAll(int index, Collection c) { + Iterator iter = c.iterator(); + for (int i = index; iter.hasNext(); i++) { + add(i, iter.next()); + } + return !c.isEmpty(); + } + + public boolean removeAll(Collection c) { + boolean listChanged = false; + for (Iterator iter = c.iterator(); iter.hasNext();) { + if (remove(iter.next())) { + listChanged = true; + } + } + return listChanged; + } + + public boolean retainAll(Collection c) { + boolean listChanged = false; + + for (Iterator iter = iterator(); iter.hasNext();) { + Object element = iter.next(); + if (!c.contains(element)) { + remove(element); + listChanged = true; + } + } + return listChanged; + } + + public Object get(int index) { + return JavaUtil.convertRubyToJava((IRubyObject) elt(index), Object.class); + } + + public Object set(int index, Object element) { + return store(index, JavaUtil.convertJavaToRuby(getRuntime(), element)); + } + + // TODO: make more efficient by not creating IRubyArray[] + public void add(int index, Object element) { + insert(new IRubyObject[]{RubyFixnum.newFixnum(getRuntime(), index), JavaUtil.convertJavaToRuby(getRuntime(), element)}); + } + + public Object remove(int index) { + return JavaUtil.convertRubyToJava(delete_at(index), Object.class); + } + + public int indexOf(Object element) { + int begin = this.begin; + + if (element != null) { + IRubyObject convertedElement = JavaUtil.convertJavaToRuby(getRuntime(), element); + + for (int i = begin; i < begin + realLength; i++) { + if (convertedElement.equals(values[i])) { + return i; + } + } + } + return -1; + } + + public int lastIndexOf(Object element) { + int begin = this.begin; + + if (element != null) { + IRubyObject convertedElement = JavaUtil.convertJavaToRuby(getRuntime(), element); + + for (int i = begin + realLength - 1; i >= begin; i--) { + if (convertedElement.equals(values[i])) { + return i; + } + } + } + + return -1; + } + + public class RubyArrayConversionIterator implements Iterator { + protected int index = 0; + protected int last = -1; + + public boolean hasNext() { + return index < realLength; + } + + public Object next() { + IRubyObject element = elt(index); + last = index++; + return JavaUtil.convertRubyToJava(element, Object.class); + } + + public void remove() { + if (last == -1) throw new IllegalStateException(); + + delete_at(last); + if (last < index) index--; + + last = -1; + + } + } + + public Iterator iterator() { + return new RubyArrayConversionIterator(); + } + + final class RubyArrayConversionListIterator extends RubyArrayConversionIterator implements ListIterator { + public RubyArrayConversionListIterator() { + } + + public RubyArrayConversionListIterator(int index) { + this.index = index; + } + + public boolean hasPrevious() { + return index >= 0; + } + + public Object previous() { + return JavaUtil.convertRubyToJava((IRubyObject) elt(last = --index), Object.class); + } + + public int nextIndex() { + return index; + } + + public int previousIndex() { + return index - 1; + } + + public void set(Object obj) { + if (last == -1) throw new IllegalStateException(); + + store(last, JavaUtil.convertJavaToRuby(getRuntime(), obj)); + } + + public void add(Object obj) { + insert(new IRubyObject[] { RubyFixnum.newFixnum(getRuntime(), index++), JavaUtil.convertJavaToRuby(getRuntime(), obj) }); + last = -1; + } + } + + public ListIterator listIterator() { + return new RubyArrayConversionListIterator(); + } + + public ListIterator listIterator(int index) { + return new RubyArrayConversionListIterator(index); + } + + // TODO: list.subList(from, to).clear() is supposed to clear the sublist from the list. + // How can we support this operation? + public List subList(int fromIndex, int toIndex) { + if (fromIndex < 0 || toIndex > size() || fromIndex > toIndex) { + throw new IndexOutOfBoundsException(); + } + + IRubyObject subList = subseq(fromIndex, toIndex - fromIndex + 1); + + return subList.isNil() ? null : (List) subList; + } + + public void clear() { + rb_clear(); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyConstant; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallbackFactory; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +@JRubyClass(name="BigDecimal", parent="Numeric") +public class RubyBigDecimal extends RubyNumeric { + private static final ObjectAllocator BIGDECIMAL_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyBigDecimal(runtime, klass); + } + }; + + @JRubyConstant + public final static int ROUND_DOWN = BigDecimal.ROUND_DOWN; + @JRubyConstant + public final static int ROUND_CEILING = BigDecimal.ROUND_CEILING; + @JRubyConstant + public final static int ROUND_UP = BigDecimal.ROUND_UP; + @JRubyConstant + public final static int ROUND_HALF_DOWN = BigDecimal.ROUND_HALF_DOWN; + @JRubyConstant + public final static int ROUND_HALF_EVEN = BigDecimal.ROUND_HALF_EVEN; + @JRubyConstant + public final static int ROUND_HALF_UP = BigDecimal.ROUND_HALF_UP; + @JRubyConstant + public final static int ROUND_FLOOR = BigDecimal.ROUND_FLOOR; + + @JRubyConstant + public final static int SIGN_POSITIVE_INFINITE=3; + @JRubyConstant + public final static int EXCEPTION_OVERFLOW=1; + @JRubyConstant + public final static int SIGN_POSITIVE_ZERO=1; + @JRubyConstant + public final static int EXCEPTION_ALL=255; + @JRubyConstant + public final static int SIGN_NEGATIVE_FINITE=-2; + @JRubyConstant + public final static int EXCEPTION_UNDERFLOW=4; + @JRubyConstant + public final static int SIGN_NaN=0; + @JRubyConstant + public final static int BASE=10000; + @JRubyConstant + public final static int ROUND_MODE=256; + @JRubyConstant + public final static int SIGN_POSITIVE_FINITE=2; + @JRubyConstant + public final static int EXCEPTION_INFINITY=1; + @JRubyConstant + public final static int SIGN_NEGATIVE_INFINITE=-3; + @JRubyConstant + public final static int EXCEPTION_ZERODIVIDE=1; + @JRubyConstant + public final static int SIGN_NEGATIVE_ZERO=-1; + @JRubyConstant + public final static int EXCEPTION_NaN=2; + + // Static constants + private static final BigDecimal TWO = new BigDecimal(2); + private static final double SQRT_10 = 3.162277660168379332; + + public static RubyClass createBigDecimal(Ruby runtime) { + RubyClass result = runtime.defineClass("BigDecimal",runtime.getNumeric(), BIGDECIMAL_ALLOCATOR); + + CallbackFactory callbackFactory = runtime.callbackFactory(RubyBigDecimal.class); + + runtime.getKernel().defineAnnotatedMethods(BigDecimalKernelMethods.class); + + result.setInternalModuleVariable("vpPrecLimit", RubyFixnum.zero(runtime)); + result.setInternalModuleVariable("vpExceptionMode", RubyFixnum.zero(runtime)); + result.setInternalModuleVariable("vpRoundingMode", runtime.newFixnum(ROUND_HALF_UP)); + + result.defineAnnotatedMethods(RubyBigDecimal.class); + result.defineAnnotatedConstants(RubyBigDecimal.class); + + return result; + } + + private boolean isNaN = false; + private int infinitySign = 0; + private int zeroSign = 0; + private BigDecimal value; + + public BigDecimal getValue() { + return value; + } + + public RubyBigDecimal(Ruby runtime, RubyClass klass) { + super(runtime, klass); + } + + public RubyBigDecimal(Ruby runtime, BigDecimal value) { + super(runtime, runtime.fastGetClass("BigDecimal")); + this.value = value; + } + + public static class BigDecimalKernelMethods { + @JRubyMethod(name = "BigDecimal", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject newBigDecimal(IRubyObject recv, IRubyObject[] args) { + return RubyBigDecimal.newBigDecimal(recv, args, Block.NULL_BLOCK); + } + } + + public static RubyBigDecimal newBigDecimal(IRubyObject recv, IRubyObject[] args, Block unusedBlock) { + return newInstance(recv.getRuntime().fastGetClass("BigDecimal"), args); + } + + @JRubyMethod(name = "ver", meta = true) + public static IRubyObject ver(IRubyObject recv) { + return recv.getRuntime().newString("1.0.1"); + } + + @JRubyMethod(name = "_dump", optional = 1, frame = true) + public IRubyObject dump(IRubyObject[] args, Block unusedBlock) { + RubyString precision = RubyString.newUnicodeString(args[0].getRuntime(), "0:"); + RubyString str = this.asString(); + return precision.append(str); + } + + @JRubyMethod(name = "_load", required = 1, frame = true, meta = true) + public static RubyBigDecimal load(IRubyObject recv, IRubyObject from, Block block) { + RubyBigDecimal rubyBigDecimal = (RubyBigDecimal) (((RubyClass)recv).allocate()); + String precisionAndValue = from.convertToString().asJavaString(); + String value = precisionAndValue.substring(precisionAndValue.indexOf(":")+1); + rubyBigDecimal.value = new BigDecimal(value); + return rubyBigDecimal; + } + + @JRubyMethod(name = "double_fig", meta = true) + public static IRubyObject double_fig(IRubyObject recv) { + return recv.getRuntime().newFixnum(20); + } + + @JRubyMethod(name = "limit", optional = 1, meta = true) + public static IRubyObject limit(IRubyObject recv, IRubyObject[] args) { + Ruby runtime = recv.getRuntime(); + RubyModule c = (RubyModule)recv; + IRubyObject nCur = c.searchInternalModuleVariable("vpPrecLimit"); + + if (args.length > 0) { + IRubyObject arg = args[0]; + if (!arg.isNil()) { + if (!(arg instanceof RubyFixnum)) { + throw runtime.newTypeError(arg, runtime.getFixnum()); + } + if (0 > ((RubyFixnum)arg).getLongValue()) { + throw runtime.newArgumentError("argument must be positive"); + } + c.setInternalModuleVariable("vpPrecLimit", arg); + } + } + + return nCur; + } + + @JRubyMethod(name = "mode", required = 1, optional = 1, meta = true) + public static IRubyObject mode(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + // FIXME: I doubt any of the constants referenced in this method + // are ever redefined -- should compare to the known values, rather + // than do an expensive constant lookup. + Ruby runtime = recv.getRuntime(); + RubyClass clazz = runtime.fastGetClass("BigDecimal"); + RubyModule c = (RubyModule)recv; + + args = Arity.scanArgs(runtime, args, 1, 1); + + IRubyObject mode = args[0]; + IRubyObject value = args[1]; + + if (!(mode instanceof RubyFixnum)) { + throw runtime.newTypeError("wrong argument type " + mode.getMetaClass() + " (expected Fixnum)"); + } + + long longMode = ((RubyFixnum)mode).getLongValue(); + long EXCEPTION_ALL = ((RubyFixnum)clazz.fastGetConstant("EXCEPTION_ALL")).getLongValue(); + if ((longMode & EXCEPTION_ALL) != 0) { + if (value.isNil()) { + return c.searchInternalModuleVariable("vpExceptionMode"); + } + if (!(value.isNil()) && !(value instanceof RubyBoolean)) { + throw runtime.newTypeError("second argument must be true or false"); + } + + RubyFixnum currentExceptionMode = (RubyFixnum)c.searchInternalModuleVariable("vpExceptionMode"); + RubyFixnum newExceptionMode = new RubyFixnum(runtime, currentExceptionMode.getLongValue()); + + RubyFixnum EXCEPTION_INFINITY = (RubyFixnum)clazz.fastGetConstant("EXCEPTION_INFINITY"); + if ((longMode & EXCEPTION_INFINITY.getLongValue()) != 0) { + newExceptionMode = (value.isTrue()) ? (RubyFixnum)currentExceptionMode.callCoerced(context, "|", EXCEPTION_INFINITY) + : (RubyFixnum)currentExceptionMode.callCoerced(context, "&", new RubyFixnum(runtime, ~(EXCEPTION_INFINITY).getLongValue())); + } + + RubyFixnum EXCEPTION_NaN = (RubyFixnum)clazz.fastGetConstant("EXCEPTION_NaN"); + if ((longMode & EXCEPTION_NaN.getLongValue()) != 0) { + newExceptionMode = (value.isTrue()) ? (RubyFixnum)currentExceptionMode.callCoerced(context, "|", EXCEPTION_NaN) + : (RubyFixnum)currentExceptionMode.callCoerced(context, "&", new RubyFixnum(runtime, ~(EXCEPTION_NaN).getLongValue())); + } + c.setInternalModuleVariable("vpExceptionMode", newExceptionMode); + return newExceptionMode; + } + + long ROUND_MODE = ((RubyFixnum)clazz.fastGetConstant("ROUND_MODE")).getLongValue(); + if (longMode == ROUND_MODE) { + if (value.isNil()) { + return c.searchInternalModuleVariable("vpRoundingMode"); + } + if (!(value instanceof RubyFixnum)) { + throw runtime.newTypeError("wrong argument type " + mode.getMetaClass() + " (expected Fixnum)"); + } + + RubyFixnum roundingMode = (RubyFixnum)value; + if (roundingMode == clazz.fastGetConstant("ROUND_UP") || + roundingMode == clazz.fastGetConstant("ROUND_DOWN") || + roundingMode == clazz.fastGetConstant("ROUND_FLOOR") || + roundingMode == clazz.fastGetConstant("ROUND_CEILING") || + roundingMode == clazz.fastGetConstant("ROUND_HALF_UP") || + roundingMode == clazz.fastGetConstant("ROUND_HALF_DOWN") || + roundingMode == clazz.fastGetConstant("ROUND_HALF_EVEN")) { + c.setInternalModuleVariable("vpRoundingMode", roundingMode); + } else { + throw runtime.newTypeError("invalid rounding mode"); + } + return c.searchInternalModuleVariable("vpRoundingMode"); + } + throw runtime.newTypeError("first argument for BigDecimal#mode invalid"); + } + + private RoundingMode getRoundingMode(Ruby runtime) { + RubyFixnum roundingMode = (RubyFixnum)runtime.fastGetClass("BigDecimal") + .searchInternalModuleVariable("vpRoundingMode"); + return RoundingMode.valueOf((int)roundingMode.getLongValue()); + } + + private RubyBigDecimal getVpValue(IRubyObject v, boolean must) { + if(v instanceof RubyBigDecimal) { + return (RubyBigDecimal)v; + } else if(v instanceof RubyFixnum || v instanceof RubyBignum) { + String s = v.toString(); + return newInstance(getRuntime().fastGetClass("BigDecimal"),new IRubyObject[]{getRuntime().newString(s)}); + } + if(must) { + String err; + if (isImmediate()) { + ThreadContext context = getRuntime().getCurrentContext(); + err = inspect(context, this).toString(); + } else { + err = getMetaClass().getBaseName(); + } + throw getRuntime().newTypeError(err + " can't be coerced into BigDecimal"); + } + return null; + } + + private final static Pattern INFINITY_PATTERN = Pattern.compile("^([+-])?Infinity$"); + private final static Pattern NUMBER_PATTERN + = Pattern.compile("^([+-]?\\d*\\.?\\d*([eE][+-]?)?\\d*).*"); + + @JRubyMethod(name = "new", required = 1, optional = 1, meta = true) + public static RubyBigDecimal newInstance(IRubyObject recv, IRubyObject[] args) { + BigDecimal decimal; + if (args.length == 0) { + decimal = new BigDecimal(0); + } else { + String strValue = args[0].convertToString().toString(); + strValue = strValue.trim(); + if ("NaN".equals(strValue)) { + return newNaN(recv.getRuntime()); + } + + Matcher m = INFINITY_PATTERN.matcher(strValue); + if (m.matches()) { + int sign = 1; + String signGroup = m.group(1); + if ("-".equals(signGroup)) { + sign = -1; + } + return newInfinity(recv.getRuntime(), sign); + } + + // Clean-up string representation so that it could be understood + // by Java's BigDecimal. Not terribly efficient for now. + // 1. MRI allows d and D as exponent separators + strValue = strValue.replaceFirst("[dD]", "E"); + // 2. MRI allows underscores anywhere + strValue = strValue.replaceAll("_", ""); + // 3. MRI ignores the trailing junk + strValue = NUMBER_PATTERN.matcher(strValue).replaceFirst("$1"); + + try { + decimal = new BigDecimal(strValue); + } catch(NumberFormatException e) { + decimal = new BigDecimal(0); + } + if (decimal.signum() == 0) { + // MRI behavior: -0 and +0 are two different things + if (strValue.matches("^\\s*-.*")) { + return newZero(recv.getRuntime(), -1); + } else { + return newZero(recv.getRuntime(), 1); + } + } + } + return new RubyBigDecimal(recv.getRuntime(), decimal); + } + + private static RubyBigDecimal newZero(Ruby runtime, int sign) { + RubyBigDecimal rbd = new RubyBigDecimal(runtime, BigDecimal.ZERO); + if (sign < 0) { + rbd.zeroSign = -1; + } else { + rbd.zeroSign = 1; + } + return rbd; + } + + private static RubyBigDecimal newNaN(Ruby runtime) { + RubyBigDecimal rbd = new RubyBigDecimal(runtime, BigDecimal.ZERO); + rbd.isNaN = true; + return rbd; + } + + private static RubyBigDecimal newInfinity(Ruby runtime, int sign) { + RubyBigDecimal rbd = new RubyBigDecimal(runtime, BigDecimal.ZERO); + if (sign < 0) { + rbd.infinitySign = -1; + } else { + rbd.infinitySign = 1; + } + return rbd; + } + + private RubyBigDecimal setResult() { + return setResult(0); + } + + private RubyBigDecimal setResult(int scale) { + int prec = RubyFixnum.fix2int(getRuntime().fastGetClass("BigDecimal").searchInternalModuleVariable("vpPrecLimit")); + int prec2 = Math.max(scale,prec); + if(prec2 > 0 && this.value.scale() > (prec2-getExponent())) { + this.value = this.value.setScale(prec2-getExponent(),BigDecimal.ROUND_HALF_UP); + } + return this; + } + + @JRubyMethod(name = "hash") + public RubyFixnum hash() { + return getRuntime().newFixnum(value.hashCode()); + } + + @JRubyMethod(name = {"%", "modulo"}, required = 1) + public IRubyObject op_mod(ThreadContext context, IRubyObject arg) { + // TODO: full-precision remainder is 1000x slower than MRI! + Ruby runtime = context.getRuntime(); + if (isInfinity() || isNaN()) { + return newNaN(runtime); + } + RubyBigDecimal val = getVpValue(arg, false); + if (val == null) { + return callCoerced(context, "%", arg, true); + } + if (val.isInfinity() || val.isNaN() || val.isZero()) { + return newNaN(runtime); + } + + // Java and MRI definitions of modulo are different. + BigDecimal modulo = value.remainder(val.value); + if (modulo.signum() * val.value.signum() < 0) { + modulo = modulo.add(val.value); + } + + return new RubyBigDecimal(runtime, modulo).setResult(); + } + + @JRubyMethod(name = "remainder", required = 1) + public IRubyObject remainder(ThreadContext context, IRubyObject arg) { + // TODO: full-precision remainder is 1000x slower than MRI! + Ruby runtime = context.getRuntime(); + if (isInfinity() || isNaN()) { + return newNaN(runtime); + } + RubyBigDecimal val = getVpValue(arg,false); + if (val == null) { + return callCoerced(context, "remainder", arg, true); + } + if (val.isInfinity() || val.isNaN() || val.isZero()) { + return newNaN(runtime); + } + + // Java and MRI definitions of remainder are the same. + return new RubyBigDecimal(runtime, value.remainder(val.value)).setResult(); + } + + @JRubyMethod(name = "*", required = 1) + public IRubyObject op_mul(ThreadContext context, IRubyObject arg) { + return mult2(context, arg, RubyFixnum.zero(context.getRuntime())); + } + + @JRubyMethod(name = "mult", required = 2) + public IRubyObject mult2(ThreadContext context, IRubyObject b, IRubyObject n) { + Ruby runtime = context.getRuntime(); + + RubyBigDecimal val = getVpValue(b,false); + if(val == null) { + // TODO: what about n arg? + return callCoerced(context, "*", b); + } + + int digits = RubyNumeric.fix2int(n); + + if (isNaN() || val.isNaN()) { + return newNaN(runtime); + } + + if ((isInfinity() && val.isZero()) || (isZero() && val.isInfinity())) { + return newNaN(runtime); + } + + if (isZero() || val.isZero()) { + int sign1 = isZero()? zeroSign : value.signum(); + int sign2 = val.isZero() ? val.zeroSign : val.value.signum(); + return newZero(runtime, sign1 * sign2); + } + + if (isInfinity() || val.isInfinity()) { + int sign1 = isInfinity() ? infinitySign : value.signum(); + int sign2 = val.isInfinity() ? val.infinitySign : val.value.signum(); + return newInfinity(runtime, sign1 * sign2); + } + + BigDecimal res = value.multiply(val.value); + if (res.precision() > digits) { + // TODO: rounding mode should not be hard-coded. See #mode. + res = res.round(new MathContext(digits, RoundingMode.HALF_UP)); + } + return new RubyBigDecimal(runtime, res).setResult(); + } + + @JRubyMethod(name = {"**", "power"}, required = 1) + public IRubyObject op_pow(IRubyObject arg) { + if (!(arg instanceof RubyFixnum)) { + throw getRuntime().newTypeError("wrong argument type " + arg.getMetaClass() + " (expected Fixnum)"); + } + + if (isNaN() || isInfinity()) { + return newNaN(getRuntime()); + } + + int times = RubyNumeric.fix2int(arg.convertToInteger()); + + if (times < 0) { + if (isZero()) { + return newInfinity(getRuntime(), value.signum()); + } + + // Note: MRI has a very non-trivial way of calculating the precision, + // so we use very simple approximation here: + int precision = (-times + 4) * (getAllDigits().length() + 4); + + return new RubyBigDecimal(getRuntime(), + value.pow(times, new MathContext(precision, RoundingMode.HALF_UP))); + } else { + return new RubyBigDecimal(getRuntime(), value.pow(times)); + } + } + + @JRubyMethod(name = "+", required = 1, frame=true) + public IRubyObject op_plus(ThreadContext context, IRubyObject b) { + return addInternal(context, b, "add", RubyFixnum.zero(context.getRuntime())); + } + + @JRubyMethod(name = "add", required = 2, frame=true) + public IRubyObject add2(ThreadContext context, IRubyObject b, IRubyObject digits) { + return addInternal(context, b, "add", digits); + } + + private IRubyObject addInternal(ThreadContext context, IRubyObject b, String op, IRubyObject digits) { + Ruby runtime = context.getRuntime(); + int prec = getPositiveInt(context, digits); + + RubyBigDecimal val = getVpValue(b, false); + if (val == null) { + // TODO: + // MRI behavior: Call "+" or "add", depending on the call. + // But this leads to exceptions when Floats are added. See: + // http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/17374 + // return callCoerced(context, op, b, true); -- this is MRI behavior. + // We'll use ours for now, thus providing an ability to add Floats. + return callCoerced(context, "+", b, true); + } + + IRubyObject res = handleAddSpecialValues(val); + if (res != null) { + return res; + } + RoundingMode roundMode = getRoundingMode(runtime); + return new RubyBigDecimal(runtime, value.add( + val.value, new MathContext(prec, roundMode))); // TODO: why this: .setResult(); + } + + private int getPositiveInt(ThreadContext context, IRubyObject arg) { + Ruby runtime = context.getRuntime(); + + if (arg instanceof RubyFixnum) { + int value = RubyNumeric.fix2int(arg); + if (value < 0) { + throw runtime.newArgumentError("argument must be positive"); + } + return value; + } else { + throw runtime.newTypeError(arg, runtime.getFixnum()); + } + } + + private IRubyObject handleAddSpecialValues(RubyBigDecimal val) { + if (isNaN() || val.isNaN) { + return newNaN(getRuntime()); + } + // TODO: don't calculate the same value 3 times + if (infinitySign * val.infinitySign > 0) { + return isInfinity() ? this : val; + } + if (infinitySign * val.infinitySign < 0) { + return newNaN(getRuntime()); + } + if (infinitySign * val.infinitySign == 0) { + int sign = infinitySign + val.infinitySign; + if (sign != 0) { + return newInfinity(getRuntime(), sign); + } + } + return null; + } + + @JRubyMethod(name = "+@") + public IRubyObject op_uplus() { + return this; + } + + @JRubyMethod(name = "-", required = 1) + public IRubyObject op_minus(ThreadContext context, IRubyObject arg) { + RubyBigDecimal val = getVpValue(arg, false); + if(val == null) { + return callCoerced(context, "-", arg); + } + RubyBigDecimal res = handleMinusSpecialValues(val); + if (res != null) { + return res; + } + return new RubyBigDecimal(getRuntime(),value.subtract(val.value)).setResult(); + } + + @JRubyMethod(name = "sub", required = 2) + public IRubyObject sub2(ThreadContext context, IRubyObject b, IRubyObject n) { + RubyBigDecimal val = getVpValue(b, false); + if(val == null) { + return callCoerced(context, "-", b); + } + RubyBigDecimal res = handleMinusSpecialValues(val); + if (res != null) { + return res; + } + + return new RubyBigDecimal(getRuntime(),value.subtract(val.value)).setResult(); + } + + private RubyBigDecimal handleMinusSpecialValues(RubyBigDecimal val) { + if (isNaN() || val.isNaN()) { + return newNaN(getRuntime()); + } + + // TODO: 3 times calculate the same value below + if (infinitySign * val.infinitySign > 0) { + return newNaN(getRuntime()); + } + if (infinitySign * val.infinitySign < 0) { + return this; + } + if (infinitySign * val.infinitySign == 0) { + if (isInfinity()) { + return this; + } + if (val.isInfinity()) { + return newInfinity(getRuntime(), val.infinitySign * -1); + } + int sign = infinitySign + val.infinitySign; + if (sign != 0) { + return newInfinity(getRuntime(), sign); + } + } + return null; + } + + @JRubyMethod(name = "-@") + public IRubyObject op_uminus() { + Ruby runtime = getRuntime(); + if (isNaN()) { + return newNaN(runtime); + } + if (isInfinity()) { + return newInfinity(runtime, -infinitySign); + } + if (isZero()) { + return newZero(runtime, -zeroSign); + } + return new RubyBigDecimal(getRuntime(), value.negate()); + } + + @JRubyMethod(name = {"/", "quo"}) + public IRubyObject op_quo(ThreadContext context, IRubyObject other) { + // regular division with some default precision + // TODO: proper algorithm to set the precision + return op_div(context, other, getRuntime().newFixnum(200)); + } + + @JRubyMethod(name = "div") + public IRubyObject op_div(ThreadContext context, IRubyObject other) { + // integer division + RubyBigDecimal val = getVpValue(other, false); + if (val == null) { + return callCoerced(context, "div", other); + } + + if (isNaN() || val.isZero() || val.isNaN()) { + return newNaN(getRuntime()); + } + + if (isInfinity() || val.isInfinity()) { + return newNaN(getRuntime()); + } + + return new RubyBigDecimal(getRuntime(), + this.value.divideToIntegralValue(val.value)).setResult(); + } + + @JRubyMethod(name = "div") + public IRubyObject op_div(ThreadContext context, IRubyObject other, IRubyObject digits) { + // TODO: take BigDecimal.mode into account. + + int scale = RubyNumeric.fix2int(digits); + + RubyBigDecimal val = getVpValue(other, false); + if (val == null) { + return callCoerced(context, "/", other); + } + + if (isNaN() || (isZero() && val.isZero()) || val.isNaN()) { + return newNaN(getRuntime()); + } + + if (val.isZero()) { + int sign1 = isInfinity() ? infinitySign : value.signum(); + return newInfinity(getRuntime(), sign1 * val.zeroSign); + } + + if (isInfinity() && !val.isInfinity()) { + return newInfinity(getRuntime(), infinitySign * val.value.signum()); + } + + if (!isInfinity() && val.isInfinity()) { + return newZero(getRuntime(), value.signum() * val.infinitySign); + } + + if (isInfinity() && val.isInfinity()) { + return newNaN(getRuntime()); + } + + if (scale == 0) { + // MRI behavior: "If digits is 0, the result is the same as the / operator." + return op_quo(context, other); + } else { + // TODO: better algorithm to set precision needed + int prec = Math.max(200, scale); + return new RubyBigDecimal(getRuntime(), + value.divide(val.value, new MathContext(prec, RoundingMode.HALF_UP))).setResult(scale); + } + } + + private IRubyObject cmp(ThreadContext context, IRubyObject r, char op) { + int e = 0; + RubyBigDecimal rb = getVpValue(r,false); + if(rb == null) { + IRubyObject ee = callCoerced(context, "<=>",r); + if(ee.isNil()) { + return getRuntime().getNil(); + } + e = RubyNumeric.fix2int(ee); + } else { + if (isNaN() | rb.isNaN()) { + return getRuntime().getNil(); + } + if (infinitySign != 0 || rb.infinitySign != 0) { + e = infinitySign - rb.infinitySign; + } else { + e = value.compareTo(rb.value); + } + } + switch(op) { + case '*': return getRuntime().newFixnum(e); + case '=': return (e==0)?getRuntime().getTrue():getRuntime().getFalse(); + case '!': return (e!=0)?getRuntime().getTrue():getRuntime().getFalse(); + case 'G': return (e>=0)?getRuntime().getTrue():getRuntime().getFalse(); + case '>': return (e> 0)?getRuntime().getTrue():getRuntime().getFalse(); + case 'L': return (e<=0)?getRuntime().getTrue():getRuntime().getFalse(); + case '<': return (e< 0)?getRuntime().getTrue():getRuntime().getFalse(); + } + return getRuntime().getNil(); + } + + @JRubyMethod(name = "<=>", required = 1) + public IRubyObject op_cmp(ThreadContext context, IRubyObject arg) { + return cmp(context, arg,'*'); + } + + @JRubyMethod(name = {"eql?", "==", "==="}, required = 1) + public IRubyObject eql_p(ThreadContext context, IRubyObject arg) { + return cmp(context, arg,'='); + } + + @JRubyMethod(name = "<", required = 1) + public IRubyObject op_lt(ThreadContext context, IRubyObject arg) { + return cmp(context, arg,'<'); + } + + @JRubyMethod(name = "<=", required = 1) + public IRubyObject op_le(ThreadContext context, IRubyObject arg) { + return cmp(context, arg,'L'); + } + + @JRubyMethod(name = ">", required = 1) + public IRubyObject op_gt(ThreadContext context, IRubyObject arg) { + return cmp(context, arg,'>'); + } + + @JRubyMethod(name = ">=", required = 1) + public IRubyObject op_ge(ThreadContext context, IRubyObject arg) { + return cmp(context, arg,'G'); + } + + @JRubyMethod(name = "abs") + public IRubyObject abs() { + Ruby runtime = getRuntime(); + if (isNaN) { + return newNaN(runtime); + } + if (isInfinity()) { + return newInfinity(runtime, 1); + } + return new RubyBigDecimal(getRuntime(), value.abs()).setResult(); + } + + @JRubyMethod(name = "ceil", optional = 1) + public IRubyObject ceil(IRubyObject[] args) { + if (isNaN) { + return newNaN(getRuntime()); + } + if (isInfinity()) { + return newInfinity(getRuntime(), infinitySign); + } + + int n = 0; + if (args.length > 0) { + n = RubyNumeric.fix2int(args[0]); + } + + if (value.scale() > n) { // rounding neccessary + return new RubyBigDecimal(getRuntime(), + value.setScale(n, RoundingMode.CEILING)); + } else { + return this; + } + } + + @JRubyMethod(name = "coerce", required = 1) + public IRubyObject coerce(IRubyObject other) { + IRubyObject obj; + if(other instanceof RubyFloat) { + obj = getRuntime().newArray(other,to_f()); + } else { + obj = getRuntime().newArray(getVpValue(other, true),this); + } + return obj; + } + + public double getDoubleValue() { return value.doubleValue(); } + public long getLongValue() { return value.longValue(); } + + public RubyNumeric multiplyWith(ThreadContext context, RubyInteger value) { + return (RubyNumeric)op_mul(context, value); + } + + public RubyNumeric multiplyWith(ThreadContext context, RubyFloat value) { + return (RubyNumeric)op_mul(context, value); + } + + public RubyNumeric multiplyWith(ThreadContext context, RubyBignum value) { + return (RubyNumeric)op_mul(context, value); + } + + @JRubyMethod(name = "divmod", required = 1) + public IRubyObject divmod(ThreadContext context, IRubyObject other) { + // TODO: full-precision divmod is 1000x slower than MRI! + Ruby runtime = context.getRuntime(); + if (isInfinity() || isNaN()) { + return RubyArray.newArray(runtime, newNaN(runtime), newNaN(runtime)); + } + RubyBigDecimal val = getVpValue(other, false); + if (val == null) { + return callCoerced(context, "divmod", other, true); + } + if (val.isInfinity() || val.isNaN() || val.isZero()) { + return RubyArray.newArray(runtime, newNaN(runtime), newNaN(runtime)); + } + + // Java and MRI definitions of divmod are different. + BigDecimal[] divmod = value.divideAndRemainder(val.value); + + BigDecimal div = divmod[0]; + BigDecimal mod = divmod[1]; + + if (mod.signum() * val.value.signum() < 0) { + div = div.subtract(BigDecimal.ONE); + mod = mod.add(val.value); + } + + return RubyArray.newArray(runtime, + new RubyBigDecimal(runtime, div), + new RubyBigDecimal(runtime, mod)); + } + + @JRubyMethod(name = "exponent") + public IRubyObject exponent() { + return getRuntime().newFixnum(getExponent()); + } + + @JRubyMethod(name = "finite?") + public IRubyObject finite_p() { + if (isNaN()) { + return getRuntime().getFalse(); + } + return getRuntime().newBoolean(!isInfinity()); + } + + @JRubyMethod(name = "floor", optional = 1) + public IRubyObject floor(IRubyObject[]args) { + if (isNaN) { + return newNaN(getRuntime()); + } + if (isInfinity()) { + return newInfinity(getRuntime(), infinitySign); + } + + int n = 0; + if (args.length > 0) { + n = RubyNumeric.fix2int(args[0]); + } + + if (value.scale() > n) { // rounding neccessary + return new RubyBigDecimal(getRuntime(), + value.setScale(n, RoundingMode.FLOOR)); + } else { + return this; + } + } + + @JRubyMethod(name = "frac") + public IRubyObject frac() { + if (isNaN) { + return newNaN(getRuntime()); + } + if (isInfinity()) { + return newInfinity(getRuntime(), infinitySign); + } + if (value.scale() > 0 && value.precision() < value.scale()) { + return new RubyBigDecimal(getRuntime(), value); + } + + BigDecimal val = value.subtract(((RubyBigDecimal)fix()).value); + return new RubyBigDecimal(getRuntime(), val); + } + + @JRubyMethod(name = "infinite?") + public IRubyObject infinite_p() { + if (infinitySign == 0) { + return getRuntime().getNil(); + } + return getRuntime().newFixnum(infinitySign); + } + + @JRubyMethod(name = "inspect") + public IRubyObject inspect(ThreadContext context) { + StringBuilder val = new StringBuilder("#<BigDecimal:").append(Integer.toHexString(System.identityHashCode(this))).append(","); + val.append("'").append(this.callMethod(context, MethodIndex.TO_S, "to_s")).append("'").append(","); + + val.append(getSignificantDigits().length()).append("("); + + int len = getAllDigits().length(); + int pow = len / 4; + val.append((pow + 1) * 4).append(")").append(">"); + + return getRuntime().newString(val.toString()); + } + + @JRubyMethod(name = "nan?") + public IRubyObject nan_p() { + return getRuntime().newBoolean(isNaN); + } + + @JRubyMethod(name = "nonzero?") + public IRubyObject nonzero_p() { + return isZero() ? getRuntime().getNil() : this; + } + + @JRubyMethod(name = "precs") + public IRubyObject precs() { + final Ruby runtime = getRuntime(); + final IRubyObject[] array = new IRubyObject[2]; + + array[0] = runtime.newFixnum(getSignificantDigits().length()); + + int len = getAllDigits().length(); + int pow = len / 4; + array[1] = runtime.newFixnum((pow + 1) * 4); + + return RubyArray.newArray(runtime, array); + } + + @JRubyMethod(name = "round", optional = 2) + public IRubyObject round(IRubyObject[] args) { + int scale = args.length > 0 ? num2int(args[0]) : 0; + int mode = (args.length > 1) ? javaRoundingModeFromRubyRoundingMode(args[1]) : BigDecimal.ROUND_HALF_UP; + // JRUBY-914: Java 1.4 BigDecimal does not allow a negative scale, so we have to simulate it + if (scale < 0) { + // shift the decimal point just to the right of the digit to be rounded to (divide by 10**(abs(scale))) + // -1 -> 10's digit, -2 -> 100's digit, etc. + BigDecimal normalized = value.movePointRight(scale); + // ...round to that digit + BigDecimal rounded = normalized.setScale(0,mode); + // ...and shift the result back to the left (multiply by 10**(abs(scale))) + return new RubyBigDecimal(getRuntime(), rounded.movePointLeft(scale)); + } else { + return new RubyBigDecimal(getRuntime(), value.setScale(scale, mode)); + } + } + + //this relies on the Ruby rounding enumerations == Java ones, which they (currently) all are + private int javaRoundingModeFromRubyRoundingMode(IRubyObject arg) { + return num2int(arg); + } + + @JRubyMethod(name = "sign") + public IRubyObject sign() { + if (isNaN()) { + return getMetaClass().fastGetConstant("SIGN_NaN"); + } + + if (isInfinity()) { + if (infinitySign < 0) { + return getMetaClass().fastGetConstant("SIGN_NEGATIVE_INFINITE"); + } else { + return getMetaClass().fastGetConstant("SIGN_POSITIVE_INFINITE"); + } + } + + if (isZero()) { + if (zeroSign < 0) { + return getMetaClass().fastGetConstant("SIGN_NEGATIVE_ZERO"); + } else { + return getMetaClass().fastGetConstant("SIGN_POSITIVE_ZERO"); + } + } + + if (value.signum() < 0) { + return getMetaClass().fastGetConstant("SIGN_NEGATIVE_FINITE"); + } else { + return getMetaClass().fastGetConstant("SIGN_POSITIVE_FINITE"); + } + } + + @JRubyMethod(name = "split") + public RubyArray split() { + final Ruby runtime = getRuntime(); + final IRubyObject[] array = new IRubyObject[4]; + + // sign + final RubyFixnum sign; + if (isNaN) { + sign = RubyFixnum.zero(runtime); + } else if (isInfinity()) { + sign = runtime.newFixnum(infinitySign); + } else if (isZero()){ + sign = runtime.newFixnum(zeroSign); + } else { + sign = runtime.newFixnum(value.signum()); + } + array[0] = sign; + + // significant digits and exponent + final RubyString digits; + final RubyFixnum exp; + if (isNaN()) { + digits = runtime.newString("NaN"); + exp = RubyFixnum.zero(runtime); + } else if (isInfinity()) { + digits = runtime.newString("Infinity"); + exp = RubyFixnum.zero(runtime); + } else if (isZero()){ + digits = runtime.newString("0"); + exp = RubyFixnum.zero(runtime); + } else { + // normalize the value + digits = runtime.newString(getSignificantDigits()); + exp = runtime.newFixnum(getExponent()); + } + array[1] = digits; + array[3] = exp; + + // base + array[2] = runtime.newFixnum(10); + + return RubyArray.newArray(runtime, array); + } + + // it doesn't handle special cases + private String getSignificantDigits() { + // TODO: no need to calculate every time. + BigDecimal val = value.abs().stripTrailingZeros(); + return val.unscaledValue().toString(); + } + + private String getAllDigits() { + // TODO: no need to calculate every time. + BigDecimal val = value.abs(); + return val.unscaledValue().toString(); + } + + // it doesn't handle special cases + private int getExponent() { + // TODO: no need to calculate every time. + if (isZero()) { + return 0; + } + BigDecimal val = value.abs().stripTrailingZeros(); + return val.precision() - val.scale(); + } + + @JRubyMethod(name = "sqrt", required = 1) + public IRubyObject sqrt(IRubyObject arg) { + Ruby runtime = getRuntime(); + if (isNaN()) { + throw runtime.newFloatDomainError("(VpSqrt) SQRT(NaN value)"); + } + if ((isInfinity() && infinitySign < 0) || value.signum() < 0) { + throw runtime.newFloatDomainError("(VpSqrt) SQRT(negative value)"); + } + if (isInfinity() && infinitySign > 0) { + return newInfinity(runtime, 1); + } + + // NOTE: MRI's sqrt precision is limited by 100, + // but we allow values more than 100. + int n = RubyNumeric.fix2int(arg); + if (n < 0) { + throw runtime.newArgumentError("argument must be positive"); + } + + n += 4; // just in case, add a bit of extra precision + + return new RubyBigDecimal(getRuntime(), + bigSqrt(this.value, new MathContext(n, RoundingMode.HALF_UP))).setResult(); + } + + @JRubyMethod(name = "to_f") + public IRubyObject to_f() { + if (isNaN()) { + return RubyFloat.newFloat(getRuntime(), Double.NaN); + } + if (isInfinity()) { + return RubyFloat.newFloat(getRuntime(), + infinitySign < 0 ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY); + } + if (isZero()) { + return RubyFloat.newFloat(getRuntime(), + zeroSign < 0 ? -0.0 : 0.0); + } + return RubyFloat.newFloat(getRuntime(), value.doubleValue()); + } + + @JRubyMethod(name = {"to_i", "to_int"}) + public IRubyObject to_int() { + if (isNaN() || infinitySign != 0) { + return getRuntime().getNil(); + } + try { + return RubyNumeric.int2fix(getRuntime(), value.longValueExact()); + } catch (ArithmeticException ae) { + return RubyBignum.bignorm(getRuntime(), value.toBigInteger()); + } + } + + private String removeTrailingZeroes(String in) { + while(in.length() > 0 && in.charAt(in.length()-1)=='0') { + in = in.substring(0,in.length()-1); + } + return in; + } + + public static boolean formatHasLeadingPlus(String format) { + return format.startsWith("+"); + } + + public static boolean formatHasLeadingSpace(String format) { + return format.startsWith(" "); + } + + public static boolean formatHasFloatingPointNotation(String format) { + return format.endsWith("F"); + } + + public static int formatFractionalDigitGroups(String format) { + int groups = 0; + Pattern p = Pattern.compile("(\\+| )?(\\d+)(E|F)?"); + Matcher m = p.matcher(format); + if (m.matches()) { + groups = Integer.parseInt(m.group(2)); + } + return groups; + } + + private boolean hasArg(IRubyObject[] args) { + return args.length != 0 && !args[0].isNil(); + } + + private String format(IRubyObject[] args) { + return args[0].toString(); + } + + private String firstArgument(IRubyObject[] args) { + if (hasArg(args)) { + return format(args); + } + return null; + } + + private boolean posSpace(String arg) { + if (null != arg) { + return formatHasLeadingSpace(arg); + } + return false; + } + + private boolean posSign(String arg) { + if (null != arg) { + return formatHasLeadingPlus(arg) || posSpace(arg); + } + return false; + } + + private boolean asEngineering(String arg) { + if (null != arg) { + return !formatHasFloatingPointNotation(arg); + } + return true; + } + + private int groups(String arg) { + if (null != arg) { + return formatFractionalDigitGroups(arg); + } + return 0; + } + + private boolean isZero() { + return !isNaN() && !isInfinity() && (value.signum() == 0); + } + + private boolean isNaN() { + return isNaN; + } + + private boolean isInfinity() { + return infinitySign != 0; + } + + private String unscaledValue() { + return value.abs().unscaledValue().toString(); + } + + private IRubyObject engineeringValue(String arg) { + int exponent = getExponent(); + int signum = value.signum(); + StringBuilder build = new StringBuilder(); + build.append(signum == -1 ? "-" : (signum == 1 ? (posSign(arg) ? (posSpace(arg) ? " " : "+") : "") : "")); + build.append("0."); + if (0 == groups(arg)) { + String s = removeTrailingZeroes(unscaledValue()); + if ("".equals(s)) { + build.append("0"); + } else { + build.append(s); + } + } else { + int index = 0; + String sep = ""; + while (index < unscaledValue().length()) { + int next = index + groups(arg); + if (next > unscaledValue().length()) { + next = unscaledValue().length(); + } + build.append(sep).append(unscaledValue().substring(index, next)); + sep = " "; + index += groups(arg); + } + } + build.append("E").append(exponent); + return getRuntime().newString(build.toString()); + } + + private IRubyObject floatingPointValue(String arg) { + String values[] = value.abs().stripTrailingZeros().toPlainString().split("\\."); + String whole = "0"; + if (values.length > 0) { + whole = values[0]; + } + String after = "0"; + if (values.length > 1) { + after = values[1]; + } + int signum = value.signum(); + StringBuilder build = new StringBuilder(); + build.append(signum == -1 ? "-" : (signum == 1 ? (posSign(arg) ? (posSpace(arg) ? " " : "+") : "") : "")); + if (groups(arg) == 0) { + build.append(whole); + if (null != after) { + build.append(".").append(after); + } + } else { + int index = 0; + String sep = ""; + while (index < whole.length()) { + int next = index + groups(arg); + if (next > whole.length()) { + next = whole.length(); + } + build.append(sep).append(whole.substring(index, next)); + sep = " "; + index += groups(arg); + } + if (null != after) { + build.append("."); + index = 0; + sep = ""; + while (index < after.length()) { + int next = index + groups(arg); + if (next > after.length()) { + next = after.length(); + } + build.append(sep).append(after.substring(index, next)); + sep = " "; + index += groups(arg); + } + } + } + return getRuntime().newString(build.toString()); + } + + @JRubyMethod(name = "to_s", optional = 1) + public IRubyObject to_s(IRubyObject[] args) { + String arg = firstArgument(args); + if (isNaN()) { + return getRuntime().newString("NaN"); + } + if (infinitySign != 0) { + if (infinitySign == -1) { + return getRuntime().newString("-Infinity"); + } else { + return getRuntime().newString("Infinity"); + } + } + if (isZero()) { + String zero = "0.0"; + if (zeroSign < 0) { + zero = "-" + zero; + } + return getRuntime().newString(zero); + } + if(asEngineering(arg)) { + return engineeringValue(arg); + } else { + return floatingPointValue(arg); + } + } + + // Note: #fix has only no-arg form, but truncate allows optional parameter. + + @JRubyMethod + public IRubyObject fix() { + return truncate(RubyFixnum.zero(getRuntime())); + } + + @JRubyMethod + public IRubyObject truncate() { + return truncate(RubyFixnum.zero(getRuntime())); + } + + @JRubyMethod + public IRubyObject truncate(IRubyObject arg) { + if (isNaN) { + return newNaN(getRuntime()); + } + if (isInfinity()) { + return newInfinity(getRuntime(), infinitySign); + } + + int n = RubyNumeric.fix2int(arg); + + int precision = value.precision() - value.scale() + n; + + if (precision > 0) { + return new RubyBigDecimal(getRuntime(), + value.round(new MathContext(precision, RoundingMode.DOWN))); + } else { + // TODO: proper sign + return new RubyBigDecimal(getRuntime(), BigDecimal.ZERO); + } + } + + @JRubyMethod(name = "zero?") + public IRubyObject zero_p() { + return getRuntime().newBoolean(isZero()); + } + + /** + * Returns the correctly rounded square root of a positive + * BigDecimal. This method performs the fast <i>Square Root by + * Coupled Newton Iteration</i> algorithm by Timm Ahrendt, from + * the book "Pi, unleashed" by Jörg Arndt in a neat loop. + * <p> + * The code is based on Frans Lelieveld's code , used here with + * permission. + * + * @param squarD The number to get the root from. + * @param rootMC Precision and rounding mode. + * @return the root of the argument number + * @throws ArithmeticException + * if the argument number is negative + * @throws IllegalArgumentException + * if rootMC has precision 0 + */ + public static BigDecimal bigSqrt(BigDecimal squarD, MathContext rootMC) { + // General number and precision checking + int sign = squarD.signum(); + if (sign == -1) { + throw new ArithmeticException("Square root of a negative number: " + squarD); + } else if(sign == 0) { + return squarD.round(rootMC); + } + + int prec = rootMC.getPrecision(); // the requested precision + if (prec == 0) { + throw new IllegalArgumentException("Most roots won't have infinite precision = 0"); + } + + // Initial precision is that of double numbers 2^63/2 ~ 4E18 + int BITS = 62; // 63-1 an even number of number bits + int nInit = 16; // precision seems 16 to 18 digits + MathContext nMC = new MathContext(18, RoundingMode.HALF_DOWN); + + // Iteration variables, for the square root x and the reciprocal v + BigDecimal x = null, e = null; // initial x: x0 ~ sqrt() + BigDecimal v = null, g = null; // initial v: v0 = 1/(2*x) + + // Estimate the square root with the foremost 62 bits of squarD + BigInteger bi = squarD.unscaledValue(); // bi and scale are a tandem + int biLen = bi.bitLength(); + int shift = Math.max(0, biLen - BITS + (biLen%2 == 0 ? 0 : 1)); // even shift.. + bi = bi.shiftRight(shift); // ..floors to 62 or 63 bit BigInteger + + double root = Math.sqrt(bi.doubleValue()); + BigDecimal halfBack = new BigDecimal(BigInteger.ONE.shiftLeft(shift/2)); + + int scale = squarD.scale(); + if (scale % 2 == 1) { + root *= SQRT_10; // 5 -> 2, -5 -> -3 need half a scale more.. + } + scale = (int) Math.floor(scale/2.); // ..where 100 -> 10 shifts the scale + + // Initial x - use double root - multiply by halfBack to unshift - set new scale + x = new BigDecimal(root, nMC); + x = x.multiply(halfBack, nMC); // x0 ~ sqrt() + if (scale != 0) { + x = x.movePointLeft(scale); + } + + if (prec < nInit) { // for prec 15 root x0 must surely be OK + return x.round(rootMC); // return small prec roots without iterations + } + + // Initial v - the reciprocal + v = BigDecimal.ONE.divide(TWO.multiply(x), nMC); // v0 = 1/(2*x) + + // Collect iteration precisions beforehand + List<Integer> nPrecs = new ArrayList<Integer>(); + + assert nInit > 3 : "Never ending loop!"; // assume nInit = 16 <= prec + + // Let m be the exact digits precision in an earlier! loop + for (int m = prec + 1; m > nInit; m = m/2 + (m > 100 ? 1 : 2)) { + nPrecs.add(m); + } + + // The loop of "Square Root by Coupled Newton Iteration" + for (int i = nPrecs.size() - 1; i > -1; i--) { + // Increase precision - next iteration supplies n exact digits + nMC = new MathContext(nPrecs.get(i), (i%2 == 1) ? RoundingMode.HALF_UP : + RoundingMode.HALF_DOWN); + + // Next x // e = d - x^2 + e = squarD.subtract(x.multiply(x, nMC), nMC); + if (i != 0) { + x = x.add(e.multiply(v, nMC)); // x += e*v ~ sqrt() + } else { + x = x.add(e.multiply(v, rootMC), rootMC); // root x is ready! + break; + } + + // Next v // g = 1 - 2*x*v + g = BigDecimal.ONE.subtract(TWO.multiply(x).multiply(v, nMC)); + + v = v.add(g.multiply(v, nMC)); // v += g*v ~ 1/2/sqrt() + } + + return x; // return sqrt(squarD) with precision of rootMC + } +}// RubyBigdecimal +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; + +/** + * + * @author jpetersen + */ +@JRubyClass(name="Bignum", parent="Integer") +public class RubyBignum extends RubyInteger { + public static RubyClass createBignumClass(Ruby runtime) { + RubyClass bignum = runtime.defineClass("Bignum", runtime.getInteger(), + ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setBignum(bignum); + bignum.index = ClassIndex.BIGNUM; + + bignum.defineAnnotatedMethods(RubyBignum.class); + + return bignum; + } + + private static final int BIT_SIZE = 64; + private static final long MAX = (1L << (BIT_SIZE - 1)) - 1; + private static final BigInteger LONG_MAX = BigInteger.valueOf(MAX); + private static final BigInteger LONG_MIN = BigInteger.valueOf(-MAX - 1); + + private final BigInteger value; + + public RubyBignum(Ruby runtime, BigInteger value) { + super(runtime, runtime.getBignum()); + this.value = value; + } + + public int getNativeTypeIndex() { + return ClassIndex.BIGNUM; + } + + public Class<?> getJavaClass() { + return BigInteger.class; + } + + public static RubyBignum newBignum(Ruby runtime, long value) { + return newBignum(runtime, BigInteger.valueOf(value)); + } + + public static RubyBignum newBignum(Ruby runtime, double value) { + return newBignum(runtime, new BigDecimal(value).toBigInteger()); + } + + public static RubyBignum newBignum(Ruby runtime, BigInteger value) { + return new RubyBignum(runtime, value); + } + + public static RubyBignum newBignum(Ruby runtime, String value) { + return new RubyBignum(runtime, new BigInteger(value)); + } + + public double getDoubleValue() { + return big2dbl(this); + } + + public long getLongValue() { + return big2long(this); + } + + /** Getter for property value. + * @return Value of property value. + */ + public BigInteger getValue() { + return value; + } + + /* ================ + * Utility Methods + * ================ + */ + + /* If the value will fit in a Fixnum, return one of those. */ + /** rb_big_norm + * + */ + public static RubyInteger bignorm(Ruby runtime, BigInteger bi) { + if (bi.compareTo(LONG_MIN) < 0 || bi.compareTo(LONG_MAX) > 0) { + return newBignum(runtime, bi); + } + return runtime.newFixnum(bi.longValue()); + } + + /** rb_big2long + * + */ + public static long big2long(RubyBignum value) { + BigInteger big = value.getValue(); + + if (big.compareTo(LONG_MIN) < 0 || big.compareTo(LONG_MAX) > 0) { + throw value.getRuntime().newRangeError("bignum too big to convert into `long'"); + } + return big.longValue(); + } + + /** rb_big2dbl + * + */ + public static double big2dbl(RubyBignum value) { + BigInteger big = value.getValue(); + double dbl = convertToDouble(big); + if (dbl == Double.NEGATIVE_INFINITY || dbl == Double.POSITIVE_INFINITY) { + value.getRuntime().getWarnings().warn(ID.BIGNUM_FROM_FLOAT_RANGE, "Bignum out of Float range"); + } + return dbl; + } + + private IRubyObject checkShiftDown(RubyBignum other) { + if (other.value.signum() == 0) return RubyFixnum.zero(getRuntime()); + if (value.compareTo(LONG_MIN) < 0 || value.compareTo(LONG_MAX) > 0) { + return other.value.signum() >= 0 ? RubyFixnum.zero(getRuntime()) : RubyFixnum.minus_one(getRuntime()); + } + return getRuntime().getNil(); + } + + /** + * BigInteger#doubleValue is _really_ slow currently. + * This is faster, and mostly correct (?) + */ + static double convertToDouble(BigInteger bigint) { + byte[] arr = bigint.toByteArray(); + double res = 0; + double acc = 1; + for (int i = arr.length - 1; i > 0 ; i--) + { + res += (double) (arr[i] & 0xff) * acc; + acc *= 256; + } + res += (double) arr[0] * acc; // final byte sign is significant + return res; + } + + /** rb_int2big + * + */ + public static BigInteger fix2big(RubyFixnum arg) { + return BigInteger.valueOf(arg.getLongValue()); + } + + /* ================ + * Instance Methods + * ================ + */ + + /** rb_big_to_s + * + */ + @JRubyMethod(name = "to_s", optional = 1) + public IRubyObject to_s(IRubyObject[] args) { + int base = args.length == 0 ? 10 : num2int(args[0]); + if (base < 2 || base > 36) { + throw getRuntime().newArgumentError("illegal radix " + base); + } + return getRuntime().newString(getValue().toString(base)); + } + + /** rb_big_coerce + * + */ + @JRubyMethod(name = "coerce", required = 1) + public IRubyObject coerce(IRubyObject other) { + if (other instanceof RubyFixnum) { + return getRuntime().newArray(newBignum(getRuntime(), ((RubyFixnum) other).getLongValue()), this); + } else if (other instanceof RubyBignum) { + return getRuntime().newArray(newBignum(getRuntime(), ((RubyBignum) other).getValue()), this); + } + + throw getRuntime().newTypeError("Can't coerce " + other.getMetaClass().getName() + " to Bignum"); + } + + /** rb_big_uminus + * + */ + @JRubyMethod(name = "-@") + public IRubyObject op_uminus() { + return bignorm(getRuntime(), value.negate()); + } + + /** rb_big_plus + * + */ + @JRubyMethod(name = "+", required = 1) + public IRubyObject op_plus(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return addFixnum((RubyFixnum)other); + } else if (other instanceof RubyBignum) { + return addBignum((RubyBignum)other); + } else if (other instanceof RubyFloat) { + return addFloat((RubyFloat)other); + } + return addOther(context, other); + } + + private IRubyObject addFixnum(RubyFixnum other) { + return bignorm(getRuntime(), value.add(fix2big(other))); + } + + private IRubyObject addBignum(RubyBignum other) { + return bignorm(getRuntime(), value.add(other.value)); + } + + private IRubyObject addFloat(RubyFloat other) { + return RubyFloat.newFloat(getRuntime(), big2dbl(this) + other.getDoubleValue()); + } + + private IRubyObject addOther(ThreadContext context, IRubyObject other) { + return coerceBin(context, "+", other); + } + + /** rb_big_minus + * + */ + @JRubyMethod(name = "-", required = 1) + public IRubyObject op_minus(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return subtractFixnum((RubyFixnum)other); + } else if (other instanceof RubyBignum) { + return subtractBignum((RubyBignum)other); + } else if (other instanceof RubyFloat) { + return subtractFloat((RubyFloat)other); + } + return subtractOther(context, other); + } + + private IRubyObject subtractFixnum(RubyFixnum other) { + return bignorm(getRuntime(), value.subtract(fix2big(((RubyFixnum) other)))); + } + + private IRubyObject subtractBignum(RubyBignum other) { + return bignorm(getRuntime(), value.subtract(((RubyBignum) other).value)); + } + + private IRubyObject subtractFloat(RubyFloat other) { + return RubyFloat.newFloat(getRuntime(), big2dbl(this) - ((RubyFloat) other).getDoubleValue()); + } + + private IRubyObject subtractOther(ThreadContext context, IRubyObject other) { + return coerceBin(context, "-", other); + } + + /** rb_big_mul + * + */ + @JRubyMethod(name = "*", required = 1) + public IRubyObject op_mul(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return bignorm(getRuntime(), value.multiply(fix2big(((RubyFixnum) other)))); + } + if (other instanceof RubyBignum) { + return bignorm(getRuntime(), value.multiply(((RubyBignum) other).value)); + } else if (other instanceof RubyFloat) { + return RubyFloat.newFloat(getRuntime(), big2dbl(this) * ((RubyFloat) other).getDoubleValue()); + } + return coerceBin(context, "*", other); + } + + /** + * rb_big_divide. Shared part for both "/" and "div" operations. + */ + private IRubyObject op_divide(ThreadContext context, IRubyObject other, String op) { + assert ("/".equals(op) || "div".equals(op)); + + final BigInteger otherValue; + if (other instanceof RubyFixnum) { + otherValue = fix2big((RubyFixnum) other); + } else if (other instanceof RubyBignum) { + otherValue = ((RubyBignum) other).value; + } else if (other instanceof RubyFloat) { + double div = big2dbl(this) / ((RubyFloat) other).getDoubleValue(); + if ("/".equals(op)) { + return RubyFloat.newFloat(getRuntime(), + big2dbl(this) / ((RubyFloat) other).getDoubleValue()); + } else { + return RubyNumeric.dbl2num(getRuntime(), div); + } + } else { + return coerceBin(context, op, other); + } + + if (otherValue.equals(BigInteger.ZERO)) { + throw getRuntime().newZeroDivisionError(); + } + + BigInteger[] results = value.divideAndRemainder(otherValue); + + if ((value.signum() * otherValue.signum()) == -1 && results[1].signum() != 0) { + return bignorm(getRuntime(), results[0].subtract(BigInteger.ONE)); + } + return bignorm(getRuntime(), results[0]); + } + + /** rb_big_div + * + */ + @JRubyMethod(name = {"/"}, required = 1) + public IRubyObject op_div(ThreadContext context, IRubyObject other) { + return op_divide(context, other, "/"); + } + + /** rb_big_idiv + * + */ + @JRubyMethod(name = {"div"}, required = 1) + public IRubyObject op_idiv(ThreadContext context, IRubyObject other) { + return op_divide(context, other, "div"); + } + + /** rb_big_divmod + * + */ + @JRubyMethod(name = "divmod", required = 1) + public IRubyObject divmod(ThreadContext context, IRubyObject other) { + final BigInteger otherValue; + if (other instanceof RubyFixnum) { + otherValue = fix2big((RubyFixnum) other); + } else if (other instanceof RubyBignum) { + otherValue = ((RubyBignum) other).value; + } else { + return coerceBin(context, "divmod", other); + } + + if (otherValue.equals(BigInteger.ZERO)) { + throw getRuntime().newZeroDivisionError(); + } + + BigInteger[] results = value.divideAndRemainder(otherValue); + + if ((value.signum() * otherValue.signum()) == -1 && results[1].signum() != 0) { + results[0] = results[0].subtract(BigInteger.ONE); + results[1] = otherValue.add(results[1]); + } + final Ruby runtime = getRuntime(); + return RubyArray.newArray(getRuntime(), bignorm(runtime, results[0]), bignorm(runtime, results[1])); + } + + /** rb_big_modulo + * + */ + @JRubyMethod(name = {"%", "modulo"}, required = 1) + public IRubyObject op_mod(ThreadContext context, IRubyObject other) { + final BigInteger otherValue; + if (other instanceof RubyFixnum) { + otherValue = fix2big((RubyFixnum) other); + } else if (other instanceof RubyBignum) { + otherValue = ((RubyBignum) other).value; + } else { + return coerceBin(context, "%", other); + } + if (otherValue.equals(BigInteger.ZERO)) { + throw getRuntime().newZeroDivisionError(); + } + BigInteger result = value.mod(otherValue.abs()); + if (otherValue.signum() == -1 && result.signum() != 0) { + result = otherValue.add(result); + } + return bignorm(getRuntime(), result); + + } + + /** rb_big_remainder + * + */ + @JRubyMethod(name = "remainder", required = 1) + public IRubyObject remainder(ThreadContext context, IRubyObject other) { + final BigInteger otherValue; + if (other instanceof RubyFixnum) { + otherValue = fix2big(((RubyFixnum) other)); + } else if (other instanceof RubyBignum) { + otherValue = ((RubyBignum) other).value; + } else { + return coerceBin(context, "remainder", other); + } + if (otherValue.equals(BigInteger.ZERO)) { + throw getRuntime().newZeroDivisionError(); + } + return bignorm(getRuntime(), value.remainder(otherValue)); + } + + /** rb_big_quo + + * + */ + @JRubyMethod(name = "quo", required = 1) + public IRubyObject quo(ThreadContext context, IRubyObject other) { + if (other instanceof RubyNumeric) { + return RubyFloat.newFloat(getRuntime(), big2dbl(this) / ((RubyNumeric) other).getDoubleValue()); + } else { + return coerceBin(context, "quo", other); + } + } + + /** rb_big_pow + * + */ + @JRubyMethod(name = {"**", "power"}, required = 1) + public IRubyObject op_pow(ThreadContext context, IRubyObject other) { + double d; + if (other instanceof RubyFixnum) { + RubyFixnum fix = (RubyFixnum) other; + long fixValue = fix.getLongValue(); + // MRI issuses warning here on (RBIGNUM(x)->len * SIZEOF_BDIGITS * yy > 1024*1024) + if (((value.bitLength() + 7) / 8) * 4 * Math.abs(fixValue) > 1024 * 1024) { + getRuntime().getWarnings().warn(ID.MAY_BE_TOO_BIG, "in a**b, b may be too big", fixValue); + } + if (fixValue >= 0) { + return bignorm(getRuntime(), value.pow((int) fixValue)); // num2int is also implemented + } else { + return RubyFloat.newFloat(getRuntime(), Math.pow(big2dbl(this), (double)fixValue)); + } + } else if (other instanceof RubyBignum) { + d = ((RubyBignum) other).getDoubleValue(); + getRuntime().getWarnings().warn(ID.MAY_BE_TOO_BIG, "in a**b, b may be too big", d); + } else if (other instanceof RubyFloat) { + d = ((RubyFloat) other).getDoubleValue(); + } else { + return coerceBin(context, "**", other); + + } + return RubyFloat.newFloat(getRuntime(), Math.pow(big2dbl(this), d)); + } + + /** rb_big_pow + * + */ + @JRubyMethod(name = {"**", "power"}, required = 1, compat = CompatVersion.RUBY1_9) + public IRubyObject op_pow_19(ThreadContext context, IRubyObject other) { + Ruby runtime = context.getRuntime(); + if (other == RubyFixnum.zero(runtime)) return RubyFixnum.one(runtime); + double d; + if (other instanceof RubyFixnum) { + RubyFixnum fix = (RubyFixnum) other; + long fixValue = fix.getLongValue(); + + if (fixValue < 0) { + return RubyRational.newRationalRaw(runtime, this).callMethod(context, "**", other); + } + // MRI issuses warning here on (RBIGNUM(x)->len * SIZEOF_BDIGITS * yy > 1024*1024) + if (((value.bitLength() + 7) / 8) * 4 * Math.abs(fixValue) > 1024 * 1024) { + getRuntime().getWarnings().warn(ID.MAY_BE_TOO_BIG, "in a**b, b may be too big", fixValue); + } + if (fixValue >= 0) { + return bignorm(runtime, value.pow((int) fixValue)); // num2int is also implemented + } else { + return RubyFloat.newFloat(runtime, Math.pow(big2dbl(this), (double)fixValue)); + } + } else if (other instanceof RubyBignum) { + if (other.callMethod(context, "<", RubyFixnum.zero(runtime)).isTrue()) { + return RubyRational.newRationalRaw(runtime, this).callMethod(context, "**", other); + } + d = ((RubyBignum) other).getDoubleValue(); + getRuntime().getWarnings().warn(ID.MAY_BE_TOO_BIG, "in a**b, b may be too big", d); + } else if (other instanceof RubyFloat) { + d = ((RubyFloat) other).getDoubleValue(); + } else { + return coerceBin(context, "**", other); + + } + return RubyNumeric.dbl2num(runtime, Math.pow(big2dbl(this), d)); + } + + /** rb_big_and + * + */ + @JRubyMethod(name = "&", required = 1) + public IRubyObject op_and(ThreadContext context, IRubyObject other) { + other = other.convertToInteger(); + if (other instanceof RubyBignum) { + return bignorm(getRuntime(), value.and(((RubyBignum) other).value)); + } else if(other instanceof RubyFixnum) { + return bignorm(getRuntime(), value.and(fix2big((RubyFixnum)other))); + } + return coerceBin(context, "&", other); + } + + /** rb_big_or + * + */ + @JRubyMethod(name = "|", required = 1) + public IRubyObject op_or(ThreadContext context, IRubyObject other) { + other = other.convertToInteger(); + if (other instanceof RubyBignum) { + return bignorm(getRuntime(), value.or(((RubyBignum) other).value)); + } + if (other instanceof RubyFixnum) { // no bignorm here needed + return bignorm(getRuntime(), value.or(fix2big((RubyFixnum)other))); + } + return coerceBin(context, "|", other); + } + + /** rb_big_xor + * + */ + @JRubyMethod(name = "^", required = 1) + public IRubyObject op_xor(ThreadContext context, IRubyObject other) { + other = other.convertToInteger(); + if (other instanceof RubyBignum) { + return bignorm(getRuntime(), value.xor(((RubyBignum) other).value)); + } + if (other instanceof RubyFixnum) { + return bignorm(getRuntime(), value.xor(BigInteger.valueOf(((RubyFixnum) other).getLongValue()))); + } + return coerceBin(context, "^", other); + } + + /** rb_big_neg + * + */ + @JRubyMethod(name = "~") + public IRubyObject op_neg() { + return RubyBignum.newBignum(getRuntime(), value.not()); + } + + /** rb_big_lshift + * + */ + @JRubyMethod(name = "<<", required = 1) + public IRubyObject op_lshift(IRubyObject other) { + long shift; + boolean neg = false; + + for (;;) { + if (other instanceof RubyFixnum) { + shift = ((RubyFixnum)other).getLongValue(); + if (shift < 0) { + neg = true; + shift = -shift; + } + break; + } else if (other instanceof RubyBignum) { + RubyBignum otherBignum = (RubyBignum)other; + if (otherBignum.value.signum() < 0) { + IRubyObject tmp = otherBignum.checkShiftDown(this); + if (!tmp.isNil()) return tmp; + neg = true; + } + shift = big2long(otherBignum); + break; + } + other = other.convertToInteger(); + } + + return bignorm(getRuntime(), neg ? value.shiftRight((int)shift) : value.shiftLeft((int)shift)); + } + + /** rb_big_rshift + * + */ + @JRubyMethod(name = ">>", required = 1) + public IRubyObject op_rshift(IRubyObject other) { + long shift; + boolean neg = false; + + for (;;) { + if (other instanceof RubyFixnum) { + shift = ((RubyFixnum)other).getLongValue(); + if (shift < 0) { + neg = true; + shift = -shift; + } + break; + } else if (other instanceof RubyBignum) { + RubyBignum otherBignum = (RubyBignum)other; + if (otherBignum.value.signum() >= 0) { + IRubyObject tmp = otherBignum.checkShiftDown(this); + if (!tmp.isNil()) return tmp; + } else { + neg = true; + } + shift = big2long(otherBignum); + break; + } + other = other.convertToInteger(); + } + return bignorm(getRuntime(), neg ? value.shiftLeft((int)shift) : value.shiftRight((int)shift)); + } + + /** rb_big_aref + * + */ + @JRubyMethod(name = "[]", required = 1) + public RubyFixnum op_aref(IRubyObject other) { + if (other instanceof RubyBignum) { + if (((RubyBignum) other).value.signum() >= 0 || value.signum() == -1) { + return RubyFixnum.zero(getRuntime()); + } + return RubyFixnum.one(getRuntime()); + } + long position = num2long(other); + if (position < 0 || position > Integer.MAX_VALUE) { + return RubyFixnum.zero(getRuntime()); + } + + return value.testBit((int)position) ? RubyFixnum.one(getRuntime()) : RubyFixnum.zero(getRuntime()); + } + + /** rb_big_cmp + * + */ + @JRubyMethod(name = "<=>", required = 1) + public IRubyObject op_cmp(ThreadContext context, IRubyObject other) { + final BigInteger otherValue; + if (other instanceof RubyFixnum) { + otherValue = fix2big((RubyFixnum) other); + } else if (other instanceof RubyBignum) { + otherValue = ((RubyBignum) other).value; + } else if (other instanceof RubyFloat) { + return dbl_cmp(getRuntime(), big2dbl(this), ((RubyFloat) other).getDoubleValue()); + } else { + return coerceCmp(context, "<=>", other); + } + + // wow, the only time we can use the java protocol ;) + return RubyFixnum.newFixnum(getRuntime(), value.compareTo(otherValue)); + } + + /** rb_big_eq + * + */ + @JRubyMethod(name = "==", required = 1) + public IRubyObject op_equal(IRubyObject other) { + final BigInteger otherValue; + if (other instanceof RubyFixnum) { + otherValue = fix2big((RubyFixnum) other); + } else if (other instanceof RubyBignum) { + otherValue = ((RubyBignum) other).value; + } else if (other instanceof RubyFloat) { + double a = ((RubyFloat) other).getDoubleValue(); + if (Double.isNaN(a)) { + return getRuntime().getFalse(); + } + return RubyBoolean.newBoolean(getRuntime(), a == big2dbl(this)); + } else { + return other.op_eqq(getRuntime().getCurrentContext(), this); + } + return RubyBoolean.newBoolean(getRuntime(), value.compareTo(otherValue) == 0); + } + + /** rb_big_eql + * + */ + @JRubyMethod(name = {"eql?", "==="}, required = 1) + public IRubyObject eql_p(IRubyObject other) { + if (other instanceof RubyBignum) { + return value.compareTo(((RubyBignum)other).value) == 0 ? getRuntime().getTrue() : getRuntime().getFalse(); + } + return getRuntime().getFalse(); + } + + /** rb_big_hash + * + */ + @JRubyMethod(name = "hash") + public RubyFixnum hash() { + return getRuntime().newFixnum(value.hashCode()); + } + + /** rb_big_to_f + * + */ + @JRubyMethod(name = "to_f") + public IRubyObject to_f() { + return RubyFloat.newFloat(getRuntime(), getDoubleValue()); + } + + /** rb_big_abs + * + */ + @JRubyMethod(name = "abs") + public IRubyObject abs() { + return RubyBignum.newBignum(getRuntime(), value.abs()); + } + + /** rb_big_size + * + */ + @JRubyMethod(name = "size") + public IRubyObject size() { + return getRuntime().newFixnum((value.bitLength() + 7) / 8); + } + + public static void marshalTo(RubyBignum bignum, MarshalStream output) throws IOException { + output.registerLinkTarget(bignum); + + output.write(bignum.value.signum() >= 0 ? '+' : '-'); + + BigInteger absValue = bignum.value.abs(); + + byte[] digits = absValue.toByteArray(); + + boolean oddLengthNonzeroStart = (digits.length % 2 != 0 && digits[0] != 0); + int shortLength = digits.length / 2; + if (oddLengthNonzeroStart) { + shortLength++; + } + output.writeInt(shortLength); + + for (int i = 1; i <= shortLength * 2 && i <= digits.length; i++) { + output.write(digits[digits.length - i]); + } + + if (oddLengthNonzeroStart) { + // Pad with a 0 + output.write(0); + } + } + + public static RubyNumeric unmarshalFrom(UnmarshalStream input) throws IOException { + boolean positive = input.readUnsignedByte() == '+'; + int shortLength = input.unmarshalInt(); + + // BigInteger required a sign byte in incoming array + byte[] digits = new byte[shortLength * 2 + 1]; + + for (int i = digits.length - 1; i >= 1; i--) { + digits[i] = input.readSignedByte(); + } + + BigInteger value = new BigInteger(digits); + if (!positive) { + value = value.negate(); + } + + RubyNumeric result = bignorm(input.getRuntime(), value); + input.registerLinkTarget(result); + return result; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Charles O Nutter <headius@headius.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Binding; +import org.jruby.runtime.Frame; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * @author jpetersen + */ +@JRubyClass(name="Binding") +public class RubyBinding extends RubyObject { + private Binding binding; + + public RubyBinding(Ruby runtime, RubyClass rubyClass, Binding binding) { + super(runtime, rubyClass); + + this.binding = binding; + } + + private RubyBinding(Ruby runtime, RubyClass rubyClass) { + super(runtime, rubyClass); + } + + private static ObjectAllocator BINDING_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + RubyBinding instance = new RubyBinding(runtime, klass); + + return instance; + } + }; + + public static RubyClass createBindingClass(Ruby runtime) { + RubyClass bindingClass = runtime.defineClass("Binding", runtime.getObject(), BINDING_ALLOCATOR); + runtime.setBinding(bindingClass); + + bindingClass.defineAnnotatedMethods(RubyBinding.class); + + return bindingClass; + } + + public Binding getBinding() { + return binding; + } + + // Proc class + + public static RubyBinding newBinding(Ruby runtime, Binding binding) { + return new RubyBinding(runtime, runtime.getBinding(), binding); + } + + public static RubyBinding newBinding(Ruby runtime) { + ThreadContext context = runtime.getCurrentContext(); + + // FIXME: We should be cloning, not reusing: frame, scope, dynvars, and potentially iter/block info + Frame frame = context.getCurrentFrame(); + Binding binding = new Binding(frame, context.getBindingRubyClass(), context.getCurrentScope()); + + return new RubyBinding(runtime, runtime.getBinding(), binding); + } + + /** + * Create a binding appropriate for a bare "eval", by using the previous (caller's) frame and current + * scope. + */ + public static RubyBinding newBindingForEval(ThreadContext context) { + // This requires some explaining. We use Frame values when executing blocks to fill in + // various values in ThreadContext and EvalState.eval like rubyClass, cref, and self. + // Largely, for an eval that is using the logical binding at a place where the eval is + // called we mostly want to use the current frames value for this. Most importantly, + // we need that self (JRUBY-858) at this point. We also need to make sure that returns + // jump to the right place (which happens to be the previous frame). Lastly, we do not + // want the current frames klazz since that will be the klazz represented of self. We + // want the class right before the eval (well we could use cref class for this too I think). + // Once we end up having Frames created earlier I think the logic of stuff like this will + // be better since we won't be worried about setting Frame to setup other variables/stacks + // but just making sure Frame itself is correct... + + Frame previousFrame = context.getPreviousFrame(); + Frame currentFrame = context.getCurrentFrame(); + currentFrame.setKlazz(previousFrame.getKlazz()); + + // Set jump target to whatever the previousTarget thinks is good. +// currentFrame.setJumpTarget(previousFrame.getJumpTarget() != null ? previousFrame.getJumpTarget() : previousFrame); + + Binding binding = new Binding(previousFrame, context.getBindingRubyClass(), context.getCurrentScope()); + Ruby runtime = context.getRuntime(); + + return new RubyBinding(runtime, runtime.getBinding(), binding); + } + + @JRubyMethod(name = "initialize", visibility = Visibility.PRIVATE) + public IRubyObject initialize(ThreadContext context) { + // FIXME: We should be cloning, not reusing: frame, scope, dynvars, and potentially iter/block info + Frame frame = context.getCurrentFrame(); + binding = new Binding(frame, context.getBindingRubyClass(), context.getCurrentScope()); + + return this; + } + + @JRubyMethod(name = "initialize_copy", required = 1, visibility = Visibility.PRIVATE) + @Override + public IRubyObject initialize_copy(IRubyObject other) { + RubyBinding otherBinding = (RubyBinding)other; + + binding = otherBinding.binding; + + return this; + } +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; + +/** + * + * @author jpetersen + */ +@JRubyClass(name={"TrueClass", "FalseClass"}) +public class RubyBoolean extends RubyObject { + + public RubyBoolean(Ruby runtime, boolean value) { + super(runtime, (value ? runtime.getTrueClass() : runtime.getFalseClass()), // Don't initialize with class + false); // Don't put in object space + + if (!value) flags = FALSE_F; + } + + @Override + public int getNativeTypeIndex() { + return (flags & FALSE_F) == 0 ? ClassIndex.TRUE : ClassIndex.FALSE; + } + + @Override + public boolean isImmediate() { + return true; + } + + @Override + public RubyClass getSingletonClass() { + return metaClass; + } + + @Override + public Class<?> getJavaClass() { + return boolean.class; + } + + public static RubyClass createFalseClass(Ruby runtime) { + RubyClass falseClass = runtime.defineClass("FalseClass", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setFalseClass(falseClass); + falseClass.index = ClassIndex.FALSE; + + falseClass.defineAnnotatedMethods(False.class); + + falseClass.getMetaClass().undefineMethod("new"); + + return falseClass; + } + + public static RubyClass createTrueClass(Ruby runtime) { + RubyClass trueClass = runtime.defineClass("TrueClass", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setTrueClass(trueClass); + trueClass.index = ClassIndex.TRUE; + + trueClass.defineAnnotatedMethods(True.class); + + trueClass.getMetaClass().undefineMethod("new"); + + return trueClass; + } + + public static RubyBoolean newBoolean(Ruby runtime, boolean value) { + return value ? runtime.getTrue() : runtime.getFalse(); + } + + public static class False { + @JRubyMethod(name = "&") + public static IRubyObject false_and(IRubyObject f, IRubyObject oth) { + return f; + } + + @JRubyMethod(name = "|") + public static IRubyObject false_or(IRubyObject f, IRubyObject oth) { + return oth.isTrue() ? f.getRuntime().getTrue() : f; + } + + @JRubyMethod(name = "^") + public static IRubyObject false_xor(IRubyObject f, IRubyObject oth) { + return oth.isTrue() ? f.getRuntime().getTrue() : f; + } + + @JRubyMethod(name = "to_s") + public static IRubyObject false_to_s(IRubyObject f) { + return f.getRuntime().newString("false"); + } + } + + public static class True { + @JRubyMethod(name = "&") + public static IRubyObject true_and(IRubyObject t, IRubyObject oth) { + return oth.isTrue() ? t : t.getRuntime().getFalse(); + } + + @JRubyMethod(name = "|") + public static IRubyObject true_or(IRubyObject t, IRubyObject oth) { + return t; + } + + @JRubyMethod(name = "^") + public static IRubyObject true_xor(IRubyObject t, IRubyObject oth) { + return oth.isTrue() ? t.getRuntime().getFalse() : t; + } + + @JRubyMethod(name = "to_s") + public static IRubyObject true_to_s(IRubyObject t) { + return t.getRuntime().newString("true"); + } + } + + @Override + public RubyFixnum id() { + if ((flags & FALSE_F) == 0) { + return RubyFixnum.newFixnum(getRuntime(), 2); + } else { + return RubyFixnum.zero(getRuntime()); + } + } + + @Override + public IRubyObject taint(ThreadContext context) { + return this; + } + + @Override + public IRubyObject freeze(ThreadContext context) { + return this; + } + + public void marshalTo(MarshalStream output) throws java.io.IOException { + output.write(isTrue() ? 'T' : 'F'); + } +} + +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; + +import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.internal.runtime.methods.JavaMethod; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallSite; +import org.jruby.runtime.CallSite.InlineCachingCallSite; +import org.jruby.runtime.CallType; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ObjectMarshal; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.collections.WeakHashSet; + +/** + * + * @author jpetersen + */ +@JRubyClass(name="Class", parent="Module") +public class RubyClass extends RubyModule { + public static final int CS_IDX_INITIALIZE = 0; + public static final String[] CS_NAMES = { + "initialize" + }; + private final CallSite[] baseCallSites = new CallSite[CS_NAMES.length]; + { + for(int i = 0; i < CS_NAMES.length; i++) { + baseCallSites[i] = new InlineCachingCallSite(CS_NAMES[i], CallType.FUNCTIONAL); + } + } + + private CallSite[] extraCallSites; + + public static void createClassClass(Ruby runtime, RubyClass classClass) { + classClass.index = ClassIndex.CLASS; + classClass.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyClass; + } + }; + + classClass.undefineMethod("module_function"); + classClass.undefineMethod("append_features"); + classClass.undefineMethod("extend_object"); + + classClass.defineAnnotatedMethods(RubyClass.class); + + classClass.addMethod("new", new SpecificArityNew(classClass, Visibility.PUBLIC)); + + // This is a non-standard method; have we decided to start extending Ruby? + //classClass.defineFastMethod("subclasses", callbackFactory.getFastOptMethod("subclasses")); + + // FIXME: for some reason this dispatcher causes a VerifyError... + //classClass.dispatcher = callbackFactory.createDispatcher(classClass); + } + + public static final ObjectAllocator CLASS_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + RubyClass clazz = new RubyClass(runtime); + clazz.allocator = ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR; // Class.allocate object is not allocatable before it is initialized + return clazz; + } + }; + + public ObjectAllocator getAllocator() { + return allocator; + } + + public void setAllocator(ObjectAllocator allocator) { + this.allocator = allocator; + } + + @JRubyMethod(name = "allocate") + public IRubyObject allocate() { + if (superClass == null) throw runtime.newTypeError("can't instantiate uninitialized class"); + IRubyObject obj = allocator.allocate(runtime, this); + if (obj.getMetaClass().getRealClass() != getRealClass()) throw runtime.newTypeError("wrong instance allocation"); + return obj; + } + + public CallSite[] getBaseCallSites() { + return baseCallSites; + } + + public CallSite[] getExtraCallSites() { + return extraCallSites; + } + + @Override + public int getNativeTypeIndex() { + return ClassIndex.CLASS; + } + + @Override + public boolean isModule() { + return false; + } + + @Override + public boolean isClass() { + return true; + } + + @Override + public boolean isSingleton() { + return false; + } + + /** boot_defclass + * Create an initial Object meta class before Module and Kernel dependencies have + * squirreled themselves together. + * + * @param runtime we need it + * @return a half-baked meta class for object + */ + public static RubyClass createBootstrapClass(Ruby runtime, String name, RubyClass superClass, ObjectAllocator allocator) { + RubyClass obj; + + if (superClass == null ) { // boot the Object class + obj = new RubyClass(runtime); + obj.marshal = DEFAULT_OBJECT_MARSHAL; + } else { // boot the Module and Class classes + obj = new RubyClass(runtime, superClass); + } + obj.setAllocator(allocator); + obj.setBaseName(name); + return obj; + } + + private final Ruby runtime; + private ObjectAllocator allocator; // the default allocator + protected ObjectMarshal marshal; + private Set<RubyClass> subclasses; + + /** separate path for MetaClass and IncludedModuleWrapper construction + * (rb_class_boot version for MetaClasses) + * no marshal, allocator initialization and addSubclass(this) here! + */ + protected RubyClass(Ruby runtime, RubyClass superClass, boolean objectSpace) { + super(runtime, runtime.getClassClass(), objectSpace); + this.runtime = runtime; + this.superClass = superClass; // this is the only case it might be null here (in MetaClass construction) + } + + /** used by CLASS_ALLOCATOR (any Class' class will be a Class!) + * also used to bootstrap Object class + */ + protected RubyClass(Ruby runtime) { + super(runtime, runtime.getClassClass()); + this.runtime = runtime; + index = ClassIndex.CLASS; + } + + /** rb_class_boot (for plain Classes) + * also used to bootstrap Module and Class classes + */ + protected RubyClass(Ruby runtime, RubyClass superClazz) { + this(runtime); + superClass = superClazz; + marshal = superClazz.marshal; // use parent's marshal + superClazz.addSubclass(this); + + infectBy(superClass); + } + + /** + * A constructor which allows passing in an array of supplementary call sites. + */ + protected RubyClass(Ruby runtime, RubyClass superClazz, CallSite[] extraCallSites) { + this(runtime); + this.superClass = superClazz; + this.marshal = superClazz.marshal; // use parent's marshal + superClazz.addSubclass(this); + + this.extraCallSites = extraCallSites; + + infectBy(superClass); + } + + /** + * Construct a new class with the given name scoped under Object (global) + * and with Object as its immediate superclass. + * Corresponds to rb_class_new in MRI. + */ + public static RubyClass newClass(Ruby runtime, RubyClass superClass) { + if (superClass == runtime.getClassClass()) throw runtime.newTypeError("can't make subclass of Class"); + if (superClass.isSingleton()) throw runtime.newTypeError("can't make subclass of virtual class"); + return new RubyClass(runtime, superClass); + } + + /** + * A variation on newClass that allow passing in an array of supplementary + * call sites to improve dynamic invocation. + */ + public static RubyClass newClass(Ruby runtime, RubyClass superClass, CallSite[] extraCallSites) { + if (superClass == runtime.getClassClass()) throw runtime.newTypeError("can't make subclass of Class"); + if (superClass.isSingleton()) throw runtime.newTypeError("can't make subclass of virtual class"); + return new RubyClass(runtime, superClass, extraCallSites); + } + + /** + * Construct a new class with the given name, allocator, parent class, + * and containing class. If setParent is true, the class's parent will be + * explicitly set to the provided parent (rather than the new class just + * being assigned to a constant in that parent). + * Corresponds to rb_class_new/rb_define_class_id/rb_name_class/rb_set_class_path + * in MRI. + */ + public static RubyClass newClass(Ruby runtime, RubyClass superClass, String name, ObjectAllocator allocator, RubyModule parent, boolean setParent) { + RubyClass clazz = newClass(runtime, superClass); + clazz.setBaseName(name); + clazz.setAllocator(allocator); + clazz.makeMetaClass(superClass.getMetaClass()); + if (setParent) clazz.setParent(parent); + parent.setConstant(name, clazz); + clazz.inherit(superClass); + return clazz; + } + + /** + * A variation on newClass that allows passing in an array of supplementary + * call sites to improve dynamic invocation performance. + */ + public static RubyClass newClass(Ruby runtime, RubyClass superClass, String name, ObjectAllocator allocator, RubyModule parent, boolean setParent, CallSite[] extraCallSites) { + RubyClass clazz = newClass(runtime, superClass, extraCallSites); + clazz.setBaseName(name); + clazz.setAllocator(allocator); + clazz.makeMetaClass(superClass.getMetaClass()); + if (setParent) clazz.setParent(parent); + parent.setConstant(name, clazz); + clazz.inherit(superClass); + return clazz; + } + + /** rb_make_metaclass + * + */ + @Override + public RubyClass makeMetaClass(RubyClass superClass) { + if (isSingleton()) { // could be pulled down to RubyClass in future + MetaClass klass = new MetaClass(getRuntime(), superClass); // rb_class_boot + setMetaClass(klass); + + klass.setAttached(this); + klass.setMetaClass(klass); + klass.setSuperClass(getSuperClass().getRealClass().getMetaClass()); + + return klass; + } else { + return super.makeMetaClass(superClass); + } + } + + @Deprecated + public IRubyObject invoke(ThreadContext context, IRubyObject self, int methodIndex, String name, IRubyObject[] args, CallType callType, Block block) { + return invoke(context, self, name, args, callType, block); + } + + public boolean notVisibleAndNotMethodMissing(DynamicMethod method, String name, IRubyObject caller, CallType callType) { + return !method.isCallableFrom(caller, callType) && !name.equals("method_missing"); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + CallType callType, Block block) { + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, caller, callType, block); + } + return method.call(context, self, this, name, block); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, Block block) { + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, context.getFrameSelf(), CallType.FUNCTIONAL, block); + } + return method.call(context, self, this, name, block); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + IRubyObject[] args, CallType callType, Block block) { + assert args != null; + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, args, caller, callType, block); + } + return method.call(context, self, this, name, args, block); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, + IRubyObject[] args, Block block) { + assert args != null; + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, args, context.getFrameSelf(), CallType.FUNCTIONAL, block); + } + return method.call(context, self, this, name, args, block); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg, CallType callType, Block block) { + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg, caller, callType, block); + } + return method.call(context, self, this, name, arg, block); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg, Block block) { + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg, context.getFrameSelf(), CallType.FUNCTIONAL, block); + } + return method.call(context, self, this, name, arg, block); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg0, IRubyObject arg1, CallType callType, Block block) { + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg0, arg1, caller, callType, block); + } + return method.call(context, self, this, name, arg0, arg1, block); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg0, IRubyObject arg1, Block block) { + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg0, arg1, context.getFrameSelf(), CallType.FUNCTIONAL, block); + } + return method.call(context, self, this, name, arg0, arg1, block); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, CallType callType, Block block) { + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg0, arg1, arg2, caller, callType, block); + } + return method.call(context, self, this, name, arg0, arg1, arg2, block); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) { + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg0, arg1, arg2, context.getFrameSelf(), CallType.FUNCTIONAL, block); + } + return method.call(context, self, this, name, arg0, arg1, arg2, block); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + CallType callType) { + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, caller, callType, Block.NULL_BLOCK); + } + return method.call(context, self, this, name); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name) { + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, context.getFrameSelf(), CallType.FUNCTIONAL, Block.NULL_BLOCK); + } + return method.call(context, self, this, name); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + IRubyObject[] args, CallType callType) { + assert args != null; + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, args, caller, callType, Block.NULL_BLOCK); + } + return method.call(context, self, this, name, args); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, + IRubyObject[] args) { + assert args != null; + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, args, context.getFrameSelf(), CallType.FUNCTIONAL, Block.NULL_BLOCK); + } + return method.call(context, self, this, name, args); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg, CallType callType) { + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg, caller, callType, Block.NULL_BLOCK); + } + return method.call(context, self, this, name, arg); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg) { + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg, context.getFrameSelf(), CallType.FUNCTIONAL, Block.NULL_BLOCK); + } + return method.call(context, self, this, name, arg); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg0, IRubyObject arg1, CallType callType) { + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg0, arg1, caller, callType, Block.NULL_BLOCK); + } + return method.call(context, self, this, name, arg0, arg1); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg0, IRubyObject arg1) { + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg0, arg1, context.getFrameSelf(), CallType.FUNCTIONAL, Block.NULL_BLOCK); + } + return method.call(context, self, this, name, arg0, arg1); + } + + public IRubyObject invoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, CallType callType) { + DynamicMethod method = searchMethod(name); + IRubyObject caller = context.getFrameSelf(); + if (shouldCallMethodMissing(method, name, caller, callType)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg0, arg1, arg2, caller, callType, Block.NULL_BLOCK); + } + return method.call(context, self, this, name, arg0, arg1, arg2); + } + + public IRubyObject finvoke(ThreadContext context, IRubyObject self, String name, + IRubyObject arg0, IRubyObject arg1, IRubyObject arg2) { + DynamicMethod method = searchMethod(name); + if (shouldCallMethodMissing(method)) { + return RuntimeHelpers.callMethodMissing(context, self, method, name, arg0, arg1, arg2, context.getFrameSelf(), CallType.FUNCTIONAL, Block.NULL_BLOCK); + } + return method.call(context, self, this, name, arg0, arg1, arg2); + } + + private boolean shouldCallMethodMissing(DynamicMethod method) { + return method.isUndefined(); + } + private boolean shouldCallMethodMissing(DynamicMethod method, String name, IRubyObject caller, CallType callType) { + return method.isUndefined() || notVisibleAndNotMethodMissing(method, name, caller, callType); + } + + public IRubyObject invokeInherited(ThreadContext context, IRubyObject self, IRubyObject subclass) { + DynamicMethod method = getMetaClass().searchMethod("inherited"); + + if (method.isUndefined()) { + return RuntimeHelpers.callMethodMissing(context, self, method, "inherited", subclass, context.getFrameSelf(), CallType.FUNCTIONAL, Block.NULL_BLOCK); + } + + return method.call(context, self, getMetaClass(), "inherited", subclass, Block.NULL_BLOCK); + } + + /** rb_class_new_instance + * + */ + public IRubyObject newInstance(ThreadContext context, IRubyObject[] args, Block block) { + IRubyObject obj = allocate(); + baseCallSites[CS_IDX_INITIALIZE].call(context, obj, args, block); + return obj; + } + + // TODO: replace this with a smarter generated invoker that can handle 0-N args + public static class SpecificArityNew extends JavaMethod { + public SpecificArityNew(RubyModule implClass, Visibility visibility) { + super(implClass, visibility); + } + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject[] args, Block block) { + RubyClass cls = (RubyClass)self; + IRubyObject obj = cls.allocate(); + cls.baseCallSites[CS_IDX_INITIALIZE].call(context, obj, args, block); + return obj; + } + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, Block block) { + RubyClass cls = (RubyClass)self; + IRubyObject obj = cls.allocate(); + cls.baseCallSites[CS_IDX_INITIALIZE].call(context, obj, block); + return obj; + } + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject arg0, Block block) { + RubyClass cls = (RubyClass)self; + IRubyObject obj = cls.allocate(); + cls.baseCallSites[CS_IDX_INITIALIZE].call(context, obj, arg0, block); + return obj; + } + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject arg0, IRubyObject arg1, Block block) { + RubyClass cls = (RubyClass)self; + IRubyObject obj = cls.allocate(); + cls.baseCallSites[CS_IDX_INITIALIZE].call(context, obj, arg0, arg1, block); + return obj; + } + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) { + RubyClass cls = (RubyClass)self; + IRubyObject obj = cls.allocate(); + cls.baseCallSites[CS_IDX_INITIALIZE].call(context, obj, arg0, arg1, arg2, block); + return obj; + } + } + + /** rb_class_initialize + * + */ + @JRubyMethod(name = "initialize", optional = 1, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, Block block) { + if (superClass != null) { + throw getRuntime().newTypeError("already initialized class"); + } + + IRubyObject superObject; + if (args.length == 0) { + superObject = getRuntime().getObject(); + } else { + superObject = args[0]; + checkInheritable(superObject); + } + + RubyClass superClazz = (RubyClass) superObject; + + superClass = superClazz; + allocator = superClazz.allocator; + makeMetaClass(superClazz.getMetaClass()); + + marshal = superClazz.marshal; + + superClazz.addSubclass(this); + + super.initialize(block); + + inherit(superClazz); + + return this; + } + + /** rb_class_init_copy + * + */ + @JRubyMethod(name = "initialize_copy", required = 1) + @Override + public IRubyObject initialize_copy(IRubyObject original){ + if (superClass != null) throw runtime.newTypeError("already initialized class"); + if (original instanceof MetaClass) throw getRuntime().newTypeError("can't copy singleton class"); + + super.initialize_copy(original); + allocator = ((RubyClass)original).allocator; + return this; + } + + // TODO: Someday, enable. + // @JRubyMethod(name = "subclasses", optional = 1) + public IRubyObject subclasses(ThreadContext context, IRubyObject[] args) { + boolean recursive = false; + if (args.length == 1) { + if (args[0] instanceof RubyBoolean) { + recursive = args[0].isTrue(); + } else { + context.getRuntime().newTypeError(args[0], context.getRuntime().fastGetClass("Boolean")); + } + } + + return RubyArray.newArray(context.getRuntime(), subclasses(recursive)).freeze(context); + } + + public Collection subclasses(boolean includeDescendants) { + if (subclasses != null) { + Collection<RubyClass> mine = new ArrayList<RubyClass>(subclasses); + if (includeDescendants) { + for (RubyClass i: subclasses) { + mine.addAll(i.subclasses(includeDescendants)); + } + } + + return mine; + } else { + return Collections.EMPTY_LIST; + } + } + + public synchronized void addSubclass(RubyClass subclass) { + if (subclasses == null) subclasses = new WeakHashSet<RubyClass>(); + subclasses.add(subclass); + } + + public Ruby getClassRuntime() { + return runtime; + } + + public RubyClass getRealClass() { + return this; + } + + @JRubyMethod(name = "inherited", required = 1) + public IRubyObject inherited(ThreadContext context, IRubyObject arg) { + return context.getRuntime().getNil(); + } + + /** rb_class_inherited (reversed semantics!) + * + */ + public void inherit(RubyClass superClazz) { + if (superClazz == null) superClazz = getRuntime().getObject(); + + superClazz.invokeInherited(getRuntime().getCurrentContext(), superClazz, this); + } + + /** Return the real super class of this class. + * + * rb_class_superclass + * + */ + @JRubyMethod(name = "superclass") + public IRubyObject superclass(ThreadContext context) { + RubyClass superClazz = superClass; + + if (superClazz == null) throw context.getRuntime().newTypeError("uninitialized class"); + + if (isSingleton()) superClazz = metaClass; + while (superClazz != null && superClazz.isIncluded()) superClazz = superClazz.superClass; + + return superClazz != null ? superClazz : context.getRuntime().getNil(); + } + + /** rb_check_inheritable + * + */ + public static void checkInheritable(IRubyObject superClass) { + if (!(superClass instanceof RubyClass)) { + throw superClass.getRuntime().newTypeError("superclass must be a Class (" + superClass.getMetaClass() + " given)"); + } + if (((RubyClass)superClass).isSingleton()) { + throw superClass.getRuntime().newTypeError("can't make subclass of virtual class"); + } + } + + public final ObjectMarshal getMarshal() { + return marshal; + } + + public final void setMarshal(ObjectMarshal marshal) { + this.marshal = marshal; + } + + public final void marshal(Object obj, MarshalStream marshalStream) throws IOException { + getMarshal().marshalTo(getRuntime(), obj, this, marshalStream); + } + + public final Object unmarshal(UnmarshalStream unmarshalStream) throws IOException { + return getMarshal().unmarshalFrom(getRuntime(), this, unmarshalStream); + } + + public static void marshalTo(RubyClass clazz, MarshalStream output) throws java.io.IOException { + output.registerLinkTarget(clazz); + output.writeString(MarshalStream.getPathFromClass(clazz)); + } + + public static RubyClass unmarshalFrom(UnmarshalStream input) throws java.io.IOException { + String name = RubyString.byteListToString(input.unmarshalString()); + RubyClass result = UnmarshalStream.getClassFromPath(input.getRuntime(), name); + input.registerLinkTarget(result); + return result; + } + + protected static final ObjectMarshal DEFAULT_OBJECT_MARSHAL = new ObjectMarshal() { + public void marshalTo(Ruby runtime, Object obj, RubyClass type, + MarshalStream marshalStream) throws IOException { + IRubyObject object = (IRubyObject)obj; + + marshalStream.registerLinkTarget(object); + marshalStream.dumpVariables(object.getVariableList()); + } + + public Object unmarshalFrom(Ruby runtime, RubyClass type, + UnmarshalStream unmarshalStream) throws IOException { + IRubyObject result = type.allocate(); + + unmarshalStream.registerLinkTarget(result); + + unmarshalStream.defaultVariablesUnmarshal(result); + + return result; + } + }; +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import org.jruby.anno.JRubyMethod; + +import org.jruby.runtime.Block; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +public class RubyClassPathVariable extends RubyObject { + public static void createClassPathVariable(Ruby runtime) { + RubyClassPathVariable self = new RubyClassPathVariable(runtime); + runtime.getEnumerable().extend_object(self); + runtime.defineReadonlyVariable("$CLASSPATH", self); + + self.getMetaClass().defineAnnotatedMethods(RubyClassPathVariable.class); + } + + private RubyClassPathVariable(Ruby runtime) { + super(runtime, runtime.getObject()); + } + + @JRubyMethod(name = {"append", "<<"}, required = 1) + public IRubyObject append(IRubyObject obj) throws Exception { + String ss = obj.convertToString().toString(); + URL url = getURL(ss); + getRuntime().getJRubyClassLoader().addURL(url); + return this; + } + + private URL getURL(String target) throws MalformedURLException { + if(target.indexOf("://") == -1) { + return new File(target).toURI().toURL(); + } else { + return new URL(target); + } + } + + @JRubyMethod(name = {"size", "length"}) + public IRubyObject size() { + return getRuntime().newFixnum(getRuntime().getJRubyClassLoader().getURLs().length); + } + + @JRubyMethod(name = "each", frame = true) + public IRubyObject each(Block block) { + URL[] urls = getRuntime().getJRubyClassLoader().getURLs(); + ThreadContext ctx = getRuntime().getCurrentContext(); + for(int i=0,j=urls.length;i<j;i++) { + block.yield(ctx, getRuntime().newString(urls[i].toString())); + } + return getRuntime().getNil(); + } + + @JRubyMethod(name = "to_s") + public IRubyObject to_s() { + return callMethod(getRuntime().getCurrentContext(), "to_a").callMethod(getRuntime().getCurrentContext(), "to_s"); + } + + @JRubyMethod(name = "inspect") + public IRubyObject inspect() { + return callMethod(getRuntime().getCurrentContext(), "to_a").callMethod(getRuntime().getCurrentContext(), "inspect"); + } +}// RubyClassPathVariable +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2006 Thomas E Enebo <enebo@acm.org> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.exceptions.RaiseException; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +/** Implementation of the Comparable module. + * + */ +@JRubyModule(name="Comparable") +public class RubyComparable { + public static RubyModule createComparable(Ruby runtime) { + RubyModule comparableModule = runtime.defineModule("Comparable"); + runtime.setComparable(comparableModule); + + comparableModule.defineAnnotatedMethods(RubyComparable.class); + + return comparableModule; + } + + /* ================ + * Utility Methods + * ================ + */ + + /** rb_cmpint + * + */ + public static int cmpint(ThreadContext context, IRubyObject val, IRubyObject a, IRubyObject b) { + if (val.isNil()) cmperr(a, b); + if (val instanceof RubyFixnum) return RubyNumeric.fix2int((RubyFixnum) val); + if (val instanceof RubyBignum) return ((RubyBignum) val).getValue().signum() == -1 ? 1 : -1; + + RubyFixnum zero = RubyFixnum.zero(context.getRuntime()); + + if (val.callMethod(context, MethodIndex.OP_GT, ">", zero).isTrue()) return 1; + if (val.callMethod(context, MethodIndex.OP_LT, "<", zero).isTrue()) return -1; + + return 0; + } + + /** rb_cmperr + * + */ + public static IRubyObject cmperr(IRubyObject recv, IRubyObject other) { + IRubyObject target; + if (other.isImmediate() || !(other.isNil() || other.isTrue() || other == recv.getRuntime().getFalse())) { + target = other.inspect(); + } else { + target = other.getType(); + } + + throw recv.getRuntime().newArgumentError("comparison of " + recv.getType() + " with " + target + " failed"); + } + + /* ================ + * Module Methods + * ================ + */ + + /** cmp_equal (cmp_eq inlined here) + * + */ + @JRubyMethod(name = "==", required = 1) + public static IRubyObject op_equal(ThreadContext context, IRubyObject recv, IRubyObject other) { + Ruby runtime = context.getRuntime(); + + if (recv == other) return runtime.getTrue(); + + try { + IRubyObject result = recv.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", other); + + return RubyBoolean.newBoolean(runtime, cmpint(context, result, recv, other) == 0); + } catch (RaiseException e) { + if (e.getException().kind_of_p(context, runtime.getStandardError()).isTrue()) { + return runtime.getNil(); + } else { + throw e; + } + } + } + + /** cmp_gt + * + */ + // <=> may return nil in many circumstances, e.g. 3 <=> NaN + @JRubyMethod(name = ">", required = 1) + public static RubyBoolean op_gt(ThreadContext context, IRubyObject recv, IRubyObject other) { + IRubyObject result = recv.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", other); + + if (result.isNil()) cmperr(recv, other); + + return RubyBoolean.newBoolean(context.getRuntime(), cmpint(context, result, recv, other) > 0); + } + + /** cmp_ge + * + */ + @JRubyMethod(name = ">=", required = 1) + public static RubyBoolean op_ge(ThreadContext context, IRubyObject recv, IRubyObject other) { + IRubyObject result = recv.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", other); + + if (result.isNil()) cmperr(recv, other); + + return RubyBoolean.newBoolean(context.getRuntime(), cmpint(context, result, recv, other) >= 0); + } + + /** cmp_lt + * + */ + @JRubyMethod(name = "<", required = 1) + public static RubyBoolean op_lt(ThreadContext context, IRubyObject recv, IRubyObject other) { + IRubyObject result = recv.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", other); + + if (result.isNil()) cmperr(recv, other); + + return RubyBoolean.newBoolean(context.getRuntime(), cmpint(context, result, recv, other) < 0); + } + + /** cmp_le + * + */ + @JRubyMethod(name = "<=", required = 1) + public static RubyBoolean op_le(ThreadContext context, IRubyObject recv, IRubyObject other) { + IRubyObject result = recv.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", other); + + if (result.isNil()) cmperr(recv, other); + + return RubyBoolean.newBoolean(context.getRuntime(), cmpint(context, result, recv, other) <= 0); + } + + /** cmp_between + * + */ + @JRubyMethod(name = "between?", required = 2) + public static RubyBoolean between_p(ThreadContext context, IRubyObject recv, IRubyObject first, IRubyObject second) { + return context.getRuntime().newBoolean(op_lt(context, recv, first).isFalse() && op_gt(context, recv, second).isFalse()); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import static org.jruby.util.Numeric.f_abs; +import static org.jruby.util.Numeric.f_abs2; +import static org.jruby.util.Numeric.f_add; +import static org.jruby.util.Numeric.f_arg; +import static org.jruby.util.Numeric.f_conjugate; +import static org.jruby.util.Numeric.f_denominator; +import static org.jruby.util.Numeric.f_div; +import static org.jruby.util.Numeric.f_divmod; +import static org.jruby.util.Numeric.f_equal_p; +import static org.jruby.util.Numeric.f_exact_p; +import static org.jruby.util.Numeric.f_expt; +import static org.jruby.util.Numeric.f_gt_p; +import static org.jruby.util.Numeric.f_inspect; +import static org.jruby.util.Numeric.f_lcm; +import static org.jruby.util.Numeric.f_mul; +import static org.jruby.util.Numeric.f_negate; +import static org.jruby.util.Numeric.f_negative_p; +import static org.jruby.util.Numeric.f_numerator; +import static org.jruby.util.Numeric.f_one_p; +import static org.jruby.util.Numeric.f_polar; +import static org.jruby.util.Numeric.f_quo; +import static org.jruby.util.Numeric.f_scalar_p; +import static org.jruby.util.Numeric.f_sub; +import static org.jruby.util.Numeric.f_to_f; +import static org.jruby.util.Numeric.f_to_i; +import static org.jruby.util.Numeric.f_to_r; +import static org.jruby.util.Numeric.f_to_s; +import static org.jruby.util.Numeric.f_xor; +import static org.jruby.util.Numeric.f_zero_p; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Arity; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.Frame; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.Numeric; + +/** + * 1.9 complex.c as of revision: 18876 + */ + +@JRubyClass(name = "Complex", parent = "Numeric") +public class RubyComplex extends RubyNumeric { + + public static RubyClass createComplexClass(Ruby runtime) { + RubyClass complexc = runtime.defineClass("Complex", runtime.getNumeric(), COMPLEX_ALLOCATOR); // because one can Complex.send(:allocate) + runtime.setComplex(complexc); + + complexc.index = ClassIndex.COMPLEX; + complexc.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyComplex; + } + }; + + ThreadContext context = runtime.getCurrentContext(); + complexc.callMethod(context, "private_class_method", runtime.newSymbol("allocate")); + + complexc.defineAnnotatedMethods(RubyComplex.class); + + String[]undefined = {"<", "<=", "<=>", ">", ">=", "between?", "divmod", + "floor", "ceil", "modulo", "round", "step", "truncate"}; + + for (String undef : undefined) { + complexc.undefineMethod(undef); + } + + complexc.defineConstant("I", RubyComplex.newComplexConvert(context, RubyFixnum.zero(runtime), RubyFixnum.one(runtime))); + + return complexc; + } + + private static ObjectAllocator COMPLEX_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyComplex(runtime, klass, RubyFixnum.zero(runtime), RubyFixnum.zero(runtime)); + } + }; + + /** internal + * + */ + private RubyComplex(Ruby runtime, IRubyObject clazz, IRubyObject real, IRubyObject image) { + super(runtime, (RubyClass)clazz); + this.real = real; + this.image = image; + } + + /** rb_complex_raw + * + */ + static RubyComplex newComplexRaw(Ruby runtime, IRubyObject x, RubyObject y) { + return new RubyComplex(runtime, runtime.getComplex(), x, y); + } + + /** rb_complex_raw1 + * + */ + static RubyComplex newComplexRaw(Ruby runtime, IRubyObject x) { + return new RubyComplex(runtime, runtime.getComplex(), x, RubyFixnum.zero(runtime)); + } + + /** rb_complex_new1 + * + */ + public static IRubyObject newComplexCanonicalize(ThreadContext context, IRubyObject x) { + return newComplexCanonicalize(context, x, RubyFixnum.zero(context.getRuntime())); + } + + /** rb_complex_new + * + */ + public static IRubyObject newComplexCanonicalize(ThreadContext context, IRubyObject x, IRubyObject y) { + return canonicalizeInternal(context, context.getRuntime().getComplex(), x, y); + } + + /** rb_complex_polar + * + */ + static IRubyObject newComplexPolar(ThreadContext context, IRubyObject x, IRubyObject y) { + return polar(context, context.getRuntime().getComplex(), x, y); + } + + /** f_complex_new1 + * + */ + static IRubyObject newComplex(ThreadContext context, IRubyObject clazz, IRubyObject x) { + return newComplex(context, clazz, x, RubyFixnum.zero(context.getRuntime())); + } + + /** f_complex_new2 + * + */ + static IRubyObject newComplex(ThreadContext context, IRubyObject clazz, IRubyObject x, IRubyObject y) { + assert !(x instanceof RubyComplex); + return canonicalizeInternal(context, clazz, x, y); + } + + /** f_complex_new_bang2 + * + */ + static RubyComplex newComplexBang(ThreadContext context, IRubyObject clazz, IRubyObject x, IRubyObject y) { + assert x instanceof RubyComplex && y instanceof RubyComplex; + return new RubyComplex(context.getRuntime(), clazz, x, y); + } + + /** f_complex_new_bang1 + * + */ + public static RubyComplex newComplexBang(ThreadContext context, IRubyObject clazz, IRubyObject x) { + assert x instanceof RubyComplex; + return newComplexBang(context, clazz, x, RubyFixnum.zero(context.getRuntime())); + } + + private IRubyObject real; + private IRubyObject image; + + IRubyObject getImage() { + return image; + } + + IRubyObject getReal() { + return real; + } + + /** m_cos + * + */ + private static IRubyObject m_cos(ThreadContext context, IRubyObject x) { + if (f_scalar_p(context, x).isTrue()) return RubyMath.cos(x, x); + RubyComplex complex = (RubyComplex)x; + return newComplex(context, context.getRuntime().getComplex(), + f_mul(context, RubyMath.cos(x, complex.real), RubyMath.cosh(x, complex.image)), + f_mul(context, f_negate(context, RubyMath.sin(x, complex.real)), RubyMath.sinh(x, complex.image))); + } + + /** m_sin + * + */ + private static IRubyObject m_sin(ThreadContext context, IRubyObject x) { + if (f_scalar_p(context, x).isTrue()) return RubyMath.sin(x, x); + RubyComplex complex = (RubyComplex)x; + return newComplex(context, context.getRuntime().getComplex(), + f_mul(context, RubyMath.sin(x, complex.real), RubyMath.cosh(x, complex.image)), + f_mul(context, RubyMath.cos(x, complex.real), RubyMath.sinh(x, complex.image))); + } + + /** m_sqrt + * + */ + private static IRubyObject m_sqrt(ThreadContext context, IRubyObject x) { + if (f_scalar_p(context, x).isTrue()) { + if (!f_negative_p(context, x)) return RubyMath.sqrt(x, x); + return newComplex(context, context.getRuntime().getComplex(), + RubyFixnum.zero(context.getRuntime()), + RubyMath.sqrt(x, f_negate(context, x))); + } else { + RubyComplex complex = (RubyComplex)x; + if (f_negative_p(context, complex.image)) { + return f_conjugate(context, m_sqrt(context, f_conjugate(context, x))); + } else { + IRubyObject a = f_abs(context, x); + IRubyObject two = RubyFixnum.two(context.getRuntime()); + return newComplex(context, context.getRuntime().getComplex(), + RubyMath.sqrt(x, f_div(context, f_add(context, a, complex.real), two)), + RubyMath.sqrt(x, f_div(context, f_sub(context, a, complex.real), two))); + } + } + } + + /** nucomp_s_new_bang + * + */ + @Deprecated + public static IRubyObject newInstanceBang(ThreadContext context, IRubyObject recv, IRubyObject[]args) { + switch (args.length) { + case 1: return newInstanceBang(context, recv, args[0]); + case 2: return newInstanceBang(context, recv, args[0], args[1]); + } + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 1); + return null; + } + + @JRubyMethod(name = "new!", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject newInstanceBang(ThreadContext context, IRubyObject recv, IRubyObject real) { + if (!(real instanceof RubyNumeric)) real = f_to_i(context, real); + return new RubyComplex(context.getRuntime(), recv, real, RubyFixnum.zero(context.getRuntime())); + } + + @JRubyMethod(name = "new!", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject newInstanceBang(ThreadContext context, IRubyObject recv, IRubyObject real, IRubyObject image) { + if (!(real instanceof RubyNumeric)) real = f_to_i(context, real); + if (!(image instanceof RubyNumeric)) image = f_to_i(context, image); + return new RubyComplex(context.getRuntime(), recv, real, image); + } + + /** nucomp_real_check (might go to bimorphic) + * + */ + private static void realCheck(ThreadContext context, IRubyObject num) { + switch (num.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + case ClassIndex.RATIONAL: + break; + default: + if (!(num instanceof RubyNumeric ) || !f_scalar_p(context, num).isTrue()) { + throw context.getRuntime().newArgumentError("not a real"); + } + } + } + + /** nucomp_s_canonicalize_internal + * + */ + private static final boolean CL_CANNON = true; + private static IRubyObject canonicalizeInternal(ThreadContext context, IRubyObject clazz, IRubyObject real, IRubyObject image) { + if (f_zero_p(context, image) && + ((RubyModule)clazz).fastHasConstant("Unify") && + (!CL_CANNON || + (!(real instanceof RubyFloat) && + !(image instanceof RubyFloat)))) { + return real; + } else if (f_scalar_p(context, real).isTrue() && + f_scalar_p(context, image).isTrue()) { + return new RubyComplex(context.getRuntime(), clazz, real, image); + } else if (f_scalar_p(context, real).isTrue()) { + RubyComplex complex = (RubyComplex)image; + return new RubyComplex(context.getRuntime(), clazz, + f_sub(context, real, complex.image), + f_add(context, RubyFixnum.zero(context.getRuntime()), complex.real)); + } else if (f_scalar_p(context, image).isTrue()) { + RubyComplex complex = (RubyComplex)real; + return new RubyComplex(context.getRuntime(), clazz, + complex.real, + f_add(context, complex.image, image)); + } else { + RubyComplex complex1 = (RubyComplex)real; + RubyComplex complex2 = (RubyComplex)image; + return new RubyComplex(context.getRuntime(), clazz, + f_sub(context, complex1.real, complex2.image), + f_add(context, complex1.image, complex2.real)); + } + } + + /** nucomp_s_new + * + */ + @Deprecated + public static IRubyObject newInstance(ThreadContext context, IRubyObject recv, IRubyObject[]args) { + switch (args.length) { + case 1: return newInstance(context, recv, args[0]); + case 2: return newInstance(context, recv, args[0], args[1]); + } + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 1); + return null; + } + + @JRubyMethod(name = {"new", "rect", "rectangular"}, meta = true) + public static IRubyObject newInstance(ThreadContext context, IRubyObject recv, IRubyObject real) { + realCheck(context, real); + return canonicalizeInternal(context, recv, real, RubyFixnum.zero(context.getRuntime())); + } + + @JRubyMethod(name = {"new", "rect", "rectangular"}, meta = true) + public static IRubyObject newInstance(ThreadContext context, IRubyObject recv, IRubyObject real, IRubyObject image) { + realCheck(context, real); + realCheck(context, image); + return canonicalizeInternal(context, recv, real, image); + } + + /** f_complex_polar + * + */ + private static IRubyObject f_complex_polar(ThreadContext context, IRubyObject clazz, IRubyObject x, IRubyObject y) { + assert !(x instanceof RubyComplex) && !(y instanceof RubyComplex); + return canonicalizeInternal(context, clazz, + f_mul(context, x, m_cos(context, y)), + f_mul(context, x, m_sin(context, y))); + } + + /** nucomp_s_polar + * + */ + @JRubyMethod(name = "polar", meta = true) + public static IRubyObject polar(ThreadContext context, IRubyObject clazz, IRubyObject abs, IRubyObject arg) { + return f_complex_polar(context, clazz, abs, arg); + } + + /** rb_Complex1 + * + */ + public static IRubyObject newComplexConvert(ThreadContext context, IRubyObject x) { + return newComplexConvert(context, x, RubyFixnum.zero(context.getRuntime())); + } + + /** rb_Complex/rb_Complex2 + * + */ + public static IRubyObject newComplexConvert(ThreadContext context, IRubyObject x, IRubyObject y) { + return convert(context, context.getRuntime().getComplex(), x, y); + } + + @Deprecated + public static IRubyObject convert(ThreadContext context, IRubyObject clazz, IRubyObject[]args) { + switch (args.length) { + case 0: return convert(context, clazz); + case 1: return convert(context, clazz, args[0]); + case 2: return convert(context, clazz, args[0], args[1]); + } + Arity.raiseArgumentError(context.getRuntime(), args.length, 0, 2); + return null; + } + + /** nucomp_s_convert + * + */ + @JRubyMethod(name = "convert", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject convert(ThreadContext context, IRubyObject recv) { + IRubyObject nil = context.getRuntime().getNil(); + return convertCommon(context, recv, nil, nil); + } + + /** nucomp_s_convert + * + */ + @JRubyMethod(name = "convert", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject convert(ThreadContext context, IRubyObject recv, IRubyObject a1) { + return convertCommon(context, recv, a1, context.getRuntime().getNil()); + } + + /** nucomp_s_convert + * + */ + @JRubyMethod(name = "convert", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject convert(ThreadContext context, IRubyObject recv, IRubyObject a1, IRubyObject a2) { + return convertCommon(context, recv, a1, a2); + } + + private static IRubyObject convertCommon(ThreadContext context, IRubyObject recv, IRubyObject a1, IRubyObject a2) { + Frame frame = context.getCurrentFrame(); + IRubyObject backref = frame.getBackRef(); + if (backref != null && backref instanceof RubyMatchData) ((RubyMatchData)backref).use(); + + if (a1 instanceof RubyString) a1 = str_to_c_strict(context, a1); + if (a2 instanceof RubyString) a2 = str_to_c_strict(context, a2); + + frame.setBackRef(backref); + + if (a1 instanceof RubyComplex) { + RubyComplex a1Complex = (RubyComplex)a1; + if (!(a1Complex.image instanceof RubyFloat) && f_zero_p(context, a1Complex.image)) { + a1 = a1Complex.real; + } + } + + if (a2 instanceof RubyComplex) { + RubyComplex a2Complex = (RubyComplex)a2; + if (!(a2Complex.image instanceof RubyFloat) && f_zero_p(context, a2Complex.image)) { + a2 = a2Complex.real; + } + } + + if (a1 instanceof RubyComplex) { + if (a2.isNil() || f_zero_p(context, a2)) return a1; + } + return a2.isNil() ? newInstance(context, recv, a1) : newInstance(context, recv, a1, a2); + } + + /** nucomp_real + * + */ + @JRubyMethod(name = "real") + public IRubyObject real() { + return real; + } + + /** nucomp_image + * + */ + @JRubyMethod(name = {"image", "imag"}) + public IRubyObject image() { + return image; + } + + /** nucomp_add + * + */ + @JRubyMethod(name = "+") + public IRubyObject op_add(ThreadContext context, IRubyObject other) { + if (other instanceof RubyComplex) { + RubyComplex otherComplex = (RubyComplex)other; + return newComplex(context, getMetaClass(), + f_add(context, real, otherComplex.real), + f_add(context, image, otherComplex.image)); + } else if (other instanceof RubyNumeric && f_scalar_p(context, other).isTrue()) { + return newComplex(context, getMetaClass(), f_add(context, real, other), image); + } + return coerceBin(context, "+", other); + } + + /** nucomp_sub + * + */ + @JRubyMethod(name = "-") + public IRubyObject op_sub(ThreadContext context, IRubyObject other) { + if (other instanceof RubyComplex) { + RubyComplex otherComplex = (RubyComplex)other; + return newComplex(context, getMetaClass(), + f_sub(context, real, otherComplex.real), + f_sub(context, image, otherComplex.image)); + } else if (other instanceof RubyNumeric && f_scalar_p(context, other).isTrue()) { + return newComplex(context, getMetaClass(), f_sub(context, real, other), image); + } + return coerceBin(context, "-", other); + } + + /** nucomp_mul + * + */ + @JRubyMethod(name = "*") + public IRubyObject op_mul(ThreadContext context, IRubyObject other) { + if (other instanceof RubyComplex) { + RubyComplex otherComplex = (RubyComplex)other; + IRubyObject realp = f_sub(context, + f_mul(context, real, otherComplex.real), + f_mul(context, image, otherComplex.image)); + IRubyObject imagep = f_add(context, + f_mul(context, real, otherComplex.image), + f_mul(context, image, otherComplex.real)); + + return newComplex(context, getMetaClass(), realp, imagep); + } else if (other instanceof RubyNumeric && f_scalar_p(context, other).isTrue()) { + return newComplex(context, getMetaClass(), + f_mul(context, real, other), + f_mul(context, image, other)); + } + return coerceBin(context, "*", other); + } + + /** nucomp_div + * + */ + @JRubyMethod(name = "/") + public IRubyObject op_div(ThreadContext context, IRubyObject other) { + if (other instanceof RubyComplex) { + RubyComplex otherComplex = (RubyComplex)other; + if (real instanceof RubyFloat || image instanceof RubyFloat || + otherComplex.real instanceof RubyFloat || otherComplex.image instanceof RubyFloat) { + IRubyObject magn = RubyMath.hypot(this, otherComplex.real, otherComplex.image); + IRubyObject tmp = newComplexBang(context, getMetaClass(), + f_quo(context, otherComplex.real, magn), + f_quo(context, otherComplex.image, magn)); + return f_quo(context, f_mul(context, this, f_conjugate(context, tmp)), magn); + } + return f_quo(context, f_mul(context, this, f_conjugate(context, other)), f_abs2(context, other)); + } else if (other instanceof RubyNumeric && f_scalar_p(context, other).isTrue()) { + return newComplex(context, getMetaClass(), + f_quo(context, real, other), + f_quo(context, image, other)); + } + return coerceBin(context, "/", other); + } + + /** nucomp_fdiv / nucomp_quo + * + */ + @JRubyMethod(name = {"fdiv", "quo"}) + public IRubyObject fdiv(ThreadContext context, IRubyObject other) { + IRubyObject complex = newComplex(context, getMetaClass(), + f_to_f(context, real), + f_to_f(context, image)); + + return f_div(context, complex, other); + } + + /** nucomp_expt + * + */ + @JRubyMethod(name = "**") + public IRubyObject op_expt(ThreadContext context, IRubyObject other) { + if (f_zero_p(context, other)) { + return newComplexBang(context, getMetaClass(), RubyFixnum.one(context.getRuntime())); + } else if (other instanceof RubyRational && f_one_p(context, f_denominator(context, other))) { + other = f_numerator(context, other); + } + + if (other instanceof RubyComplex) { + RubyArray a = f_polar(context, this).convertToArray(); + IRubyObject r = a.eltInternal(0); + IRubyObject theta = a.eltInternal(1); + RubyComplex otherComplex = (RubyComplex)other; + IRubyObject nr = RubyMath.exp(this, f_sub(context, + f_mul(context, otherComplex.real, RubyMath.log(this, r)), + f_mul(context, otherComplex.image, theta))); + IRubyObject ntheta = f_add(context, + f_mul(context, theta, otherComplex.real), + f_mul(context, otherComplex.image, RubyMath.log(this, r))); + return polar(context, getMetaClass(), nr, ntheta); + } else if (other instanceof RubyInteger) { + IRubyObject one = RubyFixnum.one(context.getRuntime()); + if (f_gt_p(context, other, RubyFixnum.zero(context.getRuntime())).isTrue()) { + IRubyObject x = this; + IRubyObject z = x; + IRubyObject n = f_sub(context, other, one); + + IRubyObject two = RubyFixnum.two(context.getRuntime()); + + while (!f_zero_p(context, n)) { + + RubyArray a = f_divmod(context, n, two).convertToArray(); + + while (f_zero_p(context, a.eltInternal(1))) { + RubyComplex xComplex = (RubyComplex)x; + x = newComplex(context, getMetaClass(), + f_sub(context, f_mul(context, xComplex.real, xComplex.real), + f_mul(context, xComplex.image, xComplex.image)), + f_mul(context, f_mul(context, two, xComplex.real), xComplex.image)); + + n = a.eltInternal(0); + a = f_divmod(context, n, two).convertToArray(); + } + z = f_mul(context, z, x); + n = f_sub(context, n, one); + } + return z; + } + return f_expt(context, f_div(context, f_to_r(context, one), this), f_negate(context, other)); + } else if (other instanceof RubyNumeric && f_scalar_p(context, other).isTrue()) { + RubyArray a = f_polar(context, this).convertToArray(); + IRubyObject r = a.eltInternal(0); + IRubyObject theta = a.eltInternal(1); + return f_complex_polar(context, getMetaClass(), f_expt(context, r, other), f_mul(context, theta, other)); + } + return coerceBin(context, "**", other); + } + + /** nucomp_equal_p + * + */ + @JRubyMethod(name = "==") + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + if (other instanceof RubyComplex) { + RubyComplex otherComplex = (RubyComplex)other; + if (f_equal_p(context, real, otherComplex.real) && f_equal_p(context, image, otherComplex.image)) return context.getRuntime().getTrue(); + return context.getRuntime().getFalse(); + } else if (other instanceof RubyNumeric && f_scalar_p(context, other).isTrue()) { + if (f_equal_p(context, real, other) && f_zero_p(context, image)) return context.getRuntime().getTrue(); + return context.getRuntime().getFalse(); + } + return f_equal_p(context, other, this) ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + /** nucomp_coerce + * + */ + @JRubyMethod(name = "coerce") + public IRubyObject coerce(ThreadContext context, IRubyObject other) { + if (other instanceof RubyNumeric && f_scalar_p(context, other).isTrue()) { + return context.getRuntime().newArray(newComplexBang(context, getMetaClass(), other), this); + } + throw context.getRuntime().newTypeError(other.getMetaClass().getName() + " can't be coerced into " + getMetaClass().getName()); + } + + /** nucomp_abs + * + */ + @JRubyMethod(name = {"abs", "magnitude"}) + public IRubyObject abs(ThreadContext context) { + return RubyMath.hypot(this, real, image); + } + + /** nucomp_abs2 + * + */ + @JRubyMethod(name = "abs2") + public IRubyObject abs2(ThreadContext context) { + return f_add(context, + f_mul(context, real, real), + f_mul(context, image, image)); + } + + /** nucomp_arg + * + */ + @JRubyMethod(name = {"arg", "angle"}) + public IRubyObject arg(ThreadContext context) { + return RubyMath.atan2(this, image, real); + } + + /** nucomp_polar + * + */ + @JRubyMethod(name = "polar") + public IRubyObject polar(ThreadContext context) { + return context.getRuntime().newArray(f_abs(context, this), f_arg(context, this)); + } + + /** nucomp_conjugate + * + */ + @JRubyMethod(name = {"conjugate", "conj", "~"}) + public IRubyObject conjugate(ThreadContext context) { + return newComplex(context, getMetaClass(), real, f_negate(context, image)); + } + + /** nucomp_real_p + * + */ + //@JRubyMethod(name = "real?") + public IRubyObject real_p(ThreadContext context) { + return context.getRuntime().getFalse(); + } + + /** nucomp_complex_p + * + */ + // @JRubyMethod(name = "complex?") + public IRubyObject complex_p(ThreadContext context) { + return context.getRuntime().getTrue(); + } + + /** nucomp_exact_p + * + */ + // @JRubyMethod(name = "exact?") + public IRubyObject exact_p(ThreadContext context) { + return (f_exact_p(context, real).isTrue() && f_exact_p(context, image).isTrue()) ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + /** nucomp_exact_p + * + */ + // @JRubyMethod(name = "inexact?") + public IRubyObject inexact_p(ThreadContext context) { + return exact_p(context).isTrue() ? context.getRuntime().getFalse() : context.getRuntime().getTrue(); + } + + /** nucomp_denominator + * + */ + @JRubyMethod(name = "denominator") + public IRubyObject demoninator(ThreadContext context) { + return f_lcm(context, f_denominator(context, real), f_denominator(context, image)); + } + + /** nucomp_numerator + * + */ + @JRubyMethod(name = "numerator") + public IRubyObject numerator(ThreadContext context) { + IRubyObject cd = callMethod(context, "denominator"); + return newComplex(context, getMetaClass(), + f_mul(context, + f_numerator(context, real), + f_div(context, cd, f_denominator(context, real))), + f_mul(context, + f_numerator(context, image), + f_div(context, cd, f_denominator(context, image)))); + } + + /** nucomp_hash + * + */ + @JRubyMethod(name = "hash") + public IRubyObject hash(ThreadContext context) { + return f_xor(context, real, image); + } + + /** f_signbit + * + */ + private static boolean signbit(ThreadContext context, IRubyObject x) { + if (x instanceof RubyFloat) { + return Double.doubleToLongBits(((RubyFloat)x).getDoubleValue()) < 0; + } + return f_negative_p(context, x); + } + + /** f_tpositive_p + * + */ + private static boolean tpositive_p(ThreadContext context, IRubyObject x) { + return !signbit(context, x); + } + + /** nucomp_to_s + * + */ + @JRubyMethod(name = "to_s") + public IRubyObject to_s(ThreadContext context) { + boolean impos = tpositive_p(context, image); + + RubyString str = f_to_s(context, real).convertToString(); + str.cat(impos ? (byte)'+' : (byte)'-'); + str.cat(f_to_s(context, f_abs(context, image)).convertToString().getByteList()); + str.cat((byte)'i'); + return str; + } + + /** nucomp_inspect + * + */ + @JRubyMethod(name = "inspect") + public IRubyObject inspect(ThreadContext context) { + boolean impos = tpositive_p(context, image); + RubyString str = context.getRuntime().newString(); + str.cat((byte)'('); + str.cat(f_inspect(context, real).convertToString().getByteList()); + str.cat(impos ? (byte)'+' : (byte)'-'); + str.cat(f_inspect(context, f_abs(context, image)).convertToString().getByteList()); + str.cat((byte)'i'); + str.cat((byte)')'); + return str; + } + + /** nucomp_marshal_dump + * + */ + @JRubyMethod(name = "marshal_dump") + public IRubyObject marshal_dump(ThreadContext context) { + return context.getRuntime().newArray(real, image); + } + + /** nucomp_marshal_load + * + */ + @JRubyMethod(name = "marshal_load") + public IRubyObject marshal_load(ThreadContext context, IRubyObject arg) { + RubyArray a = arg.convertToArray(); + real = a.size() > 0 ? a.eltInternal(0) : context.getRuntime().getNil(); + image = a.size() > 1 ? a.eltInternal(1) : context.getRuntime().getNil(); + return this; + } + + /** nucomp_scalar_p + * + */ + @JRubyMethod(name = "scalar?") + public IRubyObject scalar_p(ThreadContext context) { + return context.getRuntime().getFalse(); + } + + /** nucomp_to_i + * + */ + @JRubyMethod(name = "to_i") + public IRubyObject to_i(ThreadContext context) { + if (image instanceof RubyFloat || !f_zero_p(context, image)) { + throw context.getRuntime().newRangeError("can't convert " + f_to_s(context, this).convertToString() + " into Integer"); + } + return f_to_i(context, real); + } + + /** nucomp_to_f + * + */ + @JRubyMethod(name = "to_f") + public IRubyObject to_f(ThreadContext context) { + if (image instanceof RubyFloat || !f_zero_p(context, image)) { + throw context.getRuntime().newRangeError("can't convert " + f_to_s(context, this).convertToString() + " into Float"); + } + return f_to_f(context, real); + } + + /** nucomp_to_f + * + */ + @JRubyMethod(name = "to_r") + public IRubyObject to_r(ThreadContext context) { + if (image instanceof RubyFloat || !f_zero_p(context, image)) { + throw context.getRuntime().newRangeError("can't convert " + f_to_s(context, this).convertToString() + " into Rational"); + } + return f_to_r(context, real); + } + + static RubyArray str_to_c_internal(ThreadContext context, IRubyObject recv) { + RubyString s = recv.callMethod(context, "strip").convertToString(); + ByteList bytes = s.getByteList(); + + Ruby runtime = context.getRuntime(); + if (bytes.realSize == 0) return runtime.newArray(runtime.getNil(), recv); + + IRubyObject sr, si, re; + sr = si = re = runtime.getNil(); + boolean po = false; + IRubyObject m = RubyRegexp.newRegexp(runtime, Numeric.ComplexPatterns.comp_pat0).callMethod(context, "match", s); + + if (!m.isNil()) { + sr = m.callMethod(context, "[]", RubyFixnum.one(runtime)); + si = m.callMethod(context, "[]", RubyFixnum.two(runtime)); + re = m.callMethod(context, "post_match"); + po = true; + } + + if (m.isNil()) { + m = RubyRegexp.newRegexp(runtime, Numeric.ComplexPatterns.comp_pat1).callMethod(context, "match", s); + + if (!m.isNil()) { + sr = runtime.getNil(); + si = m.callMethod(context, "[]", RubyFixnum.one(runtime)); + if (si.isNil()) si = runtime.newString(); + IRubyObject t = m.callMethod(context, "[]", RubyFixnum.two(runtime)); + if (t.isNil()) t = runtime.newString(new ByteList(new byte[]{'1'})); + si.convertToString().cat(t.convertToString().getByteList()); + re = m.callMethod(context, "post_match"); + po = false; + } + } + + if (m.isNil()) { + m = RubyRegexp.newRegexp(runtime, Numeric.ComplexPatterns.comp_pat2).callMethod(context, "match", s); + if (m.isNil()) return runtime.newArray(runtime.getNil(), recv); + sr = m.callMethod(context, "[]", RubyFixnum.one(runtime)); + if (m.callMethod(context, "[]", RubyFixnum.two(runtime)).isNil()) { + si = runtime.getNil(); + } else { + si = m.callMethod(context, "[]", RubyFixnum.three(runtime)); + IRubyObject t = m.callMethod(context, "[]", RubyFixnum.four(runtime)); + if (t.isNil()) t = runtime.newString(new ByteList(new byte[]{'1'})); + si.convertToString().cat(t.convertToString().getByteList()); + } + re = m.callMethod(context, "post_match"); + po = false; + } + + IRubyObject r = RubyFixnum.zero(runtime); + IRubyObject i = r; + + if (!sr.isNil()) { + if (sr.callMethod(context, "include?", runtime.newString(new ByteList(new byte[]{'/'}))).isTrue()) { + r = f_to_r(context, sr); + } else if (f_gt_p(context, sr.callMethod(context, "count", runtime.newString(".eE")), RubyFixnum.zero(runtime)).isTrue()) { + r = f_to_f(context, sr); + } else { + r = f_to_i(context, sr); + } + } + + if (!si.isNil()) { + if (si.callMethod(context, "include?", runtime.newString(new ByteList(new byte[]{'/'}))).isTrue()) { + i = f_to_r(context, si); + } else if (f_gt_p(context, si.callMethod(context, "count", runtime.newString(".eE")), RubyFixnum.zero(runtime)).isTrue()) { + i = f_to_f(context, si); + } else { + i = f_to_i(context, si); + } + } + return runtime.newArray(po ? newComplexPolar(context, r, i) : newComplexCanonicalize(context, r, i), re); + } + + private static IRubyObject str_to_c_strict(ThreadContext context, IRubyObject recv) { + RubyArray a = str_to_c_internal(context, recv); + if (a.eltInternal(0).isNil() || a.eltInternal(1).convertToString().getByteList().length() > 0) { + IRubyObject s = recv.callMethod(context, "inspect"); + throw context.getRuntime().newArgumentError("invalid value for Complex: " + s.convertToString()); + } + return a.eltInternal(0); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.Block; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * Placeholder until/if we can support this + * + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +@JRubyClass(name="Continuation") +public class RubyContinuation { + public static void createContinuation(Ruby runtime) { + RubyClass cContinuation = runtime.defineClass("Continuation",runtime.getObject(),runtime.getObject().getAllocator()); + cContinuation.defineAnnotatedMethods(RubyContinuation.class); + runtime.setContinuation(cContinuation); + } + + @JRubyMethod(name = {"call", "[]"}, rest = true, frame = true) + public static IRubyObject call(IRubyObject recv, IRubyObject[] args, Block unusedBlock) { + throw recv.getRuntime().newNotImplementedError("Continuations are not implemented in JRuby and will not work"); + } +}// RubyContinuation +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006, 2007 Ola Bini <ola@ologix.com> + * Copyright (C) 2007 Nick Sieger <nicksieger@gmail.com> + * Copyright (C) 2008 Vladimir Sizikov <vsizikov@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.security.Provider; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.anno.JRubyClass; + +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.callback.Callback; +import org.jruby.util.ByteList; + +/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +@JRubyModule(name="Digest") +public class RubyDigest { + private static Provider provider = null; + + public static void createDigest(Ruby runtime) { + try { + provider = (Provider) Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider").newInstance(); + } catch(Exception e) { + // provider is not available + } + + RubyModule mDigest = runtime.defineModule("Digest"); + RubyClass cDigestBase = mDigest.defineClassUnder("Base",runtime.getObject(), Base.BASE_ALLOCATOR); + + cDigestBase.defineAnnotatedMethods(Base.class); + } + + private static MessageDigest createMessageDigest(Ruby runtime, String providerName) throws NoSuchAlgorithmException { + if(provider != null) { + try { + return MessageDigest.getInstance(providerName, provider); + } catch(NoSuchAlgorithmException e) { + // bouncy castle doesn't support algorithm + } + } + // fall back to system JCA providers + return MessageDigest.getInstance(providerName); + } + + @JRubyClass(name="Digest::MD5", parent="Digest::Base") + public static class MD5 {} + @JRubyClass(name="Digest::RMD160", parent="Digest::Base") + public static class RMD160 {} + @JRubyClass(name="Digest::SHA1", parent="Digest::Base") + public static class SHA1 {} + @JRubyClass(name="Digest::SHA256", parent="Digest::Base") + public static class SHA256 {} + @JRubyClass(name="Digest::SHA384", parent="Digest::Base") + public static class SHA384 {} + @JRubyClass(name="Digest::SHA512", parent="Digest::Base") + public static class SHA512 {} + + public static void createDigestMD5(Ruby runtime) { + runtime.getLoadService().require("digest.so"); + RubyModule mDigest = runtime.fastGetModule("Digest"); + RubyClass cDigestBase = mDigest.fastGetClass("Base"); + RubyClass cDigest_MD5 = mDigest.defineClassUnder("MD5",cDigestBase,cDigestBase.getAllocator()); + cDigest_MD5.defineFastMethod("block_length", new Callback() { + public Arity getArity() { + return Arity.NO_ARGUMENTS; + } + public IRubyObject execute(IRubyObject recv, IRubyObject[] args, Block block) { + return RubyFixnum.newFixnum(recv.getRuntime(), 64); + } + }); + cDigest_MD5.setInternalModuleVariable("metadata",runtime.newString("MD5")); + } + + public static void createDigestRMD160(Ruby runtime) { + runtime.getLoadService().require("digest.so"); + if(provider == null) { + throw runtime.newLoadError("RMD160 not supported without BouncyCastle"); + } + + RubyModule mDigest = runtime.fastGetModule("Digest"); + RubyClass cDigestBase = mDigest.fastGetClass("Base"); + RubyClass cDigest_RMD160 = mDigest.defineClassUnder("RMD160",cDigestBase,cDigestBase.getAllocator()); + cDigest_RMD160.setInternalModuleVariable("metadata",runtime.newString("RIPEMD160")); + } + + public static void createDigestSHA1(Ruby runtime) { + runtime.getLoadService().require("digest.so"); + RubyModule mDigest = runtime.fastGetModule("Digest"); + RubyClass cDigestBase = mDigest.fastGetClass("Base"); + RubyClass cDigest_SHA1 = mDigest.defineClassUnder("SHA1",cDigestBase,cDigestBase.getAllocator()); + cDigest_SHA1.setInternalModuleVariable("metadata",runtime.newString("SHA1")); + } + + public static void createDigestSHA2(Ruby runtime) { + runtime.getLoadService().require("digest.so"); + try { + createMessageDigest(runtime, "SHA-256"); + } catch(NoSuchAlgorithmException e) { + throw runtime.newLoadError("SHA2 not supported"); + } + + RubyModule mDigest = runtime.fastGetModule("Digest"); + RubyClass cDigestBase = mDigest.fastGetClass("Base"); + RubyClass cDigest_SHA2_256 = mDigest.defineClassUnder("SHA256",cDigestBase,cDigestBase.getAllocator()); + cDigest_SHA2_256.setInternalModuleVariable("metadata",runtime.newString("SHA-256")); + RubyClass cDigest_SHA2_384 = mDigest.defineClassUnder("SHA384",cDigestBase,cDigestBase.getAllocator()); + cDigest_SHA2_384.setInternalModuleVariable("metadata",runtime.newString("SHA-384")); + RubyClass cDigest_SHA2_512 = mDigest.defineClassUnder("SHA512",cDigestBase,cDigestBase.getAllocator()); + cDigest_SHA2_512.setInternalModuleVariable("metadata",runtime.newString("SHA-512")); + } + + @JRubyClass(name="Digest::Base") + public static class Base extends RubyObject { + protected static final ObjectAllocator BASE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new Base(runtime, klass); + } + }; + + @JRubyMethod(name = "digest", required = 1, meta = true) + public static IRubyObject s_digest(IRubyObject recv, IRubyObject str) { + Ruby runtime = recv.getRuntime(); + String name = ((RubyClass)recv).searchInternalModuleVariable("metadata").toString(); + try { + MessageDigest md = createMessageDigest(runtime, name); + return RubyString.newString(runtime, md.digest(str.convertToString().getBytes())); + } catch(NoSuchAlgorithmException e) { + throw recv.getRuntime().newNotImplementedError("Unsupported digest algorithm (" + name + ")"); + } + } + + @JRubyMethod(name = "hexdigest", required = 1, meta = true) + public static IRubyObject s_hexdigest(IRubyObject recv, IRubyObject str) { + Ruby runtime = recv.getRuntime(); + String name = ((RubyClass)recv).searchInternalModuleVariable("metadata").toString(); + try { + MessageDigest md = createMessageDigest(runtime, name); + return RubyString.newString(runtime, ByteList.plain(toHex(md.digest(str.convertToString().getBytes())))); + } catch(NoSuchAlgorithmException e) { + throw recv.getRuntime().newNotImplementedError("Unsupported digest algorithm (" + name + ")"); + } + } + + private MessageDigest algo; + private StringBuffer data; + + public Base(Ruby runtime, RubyClass type) { + super(runtime,type); + data = new StringBuffer(); + + if(type == runtime.fastGetModule("Digest").fastGetClass("Base")) { + throw runtime.newNotImplementedError("Digest::Base is an abstract class"); + } + if(!type.hasInternalModuleVariable("metadata")) { + throw runtime.newNotImplementedError("the " + type + "() function is unimplemented on this machine"); + } + try { + setAlgorithm(type.searchInternalModuleVariable("metadata")); + } catch(NoSuchAlgorithmException e) { + throw runtime.newNotImplementedError("the " + type + "() function is unimplemented on this machine"); + } + + } + + @JRubyMethod(name = "initialize", optional = 1, frame = true) + public IRubyObject initialize(IRubyObject[] args, Block unusedBlock) { + if(args.length > 0 && !args[0].isNil()) { + update(args[0]); + } + return this; + } + + @JRubyMethod(name = "initialize_copy", required = 1) + public IRubyObject initialize_copy(IRubyObject obj) { + if(this == obj) { + return this; + } + ((RubyObject)obj).checkFrozen(); + + data = new StringBuffer(((Base)obj).data.toString()); + String name = ((Base)obj).algo.getAlgorithm(); + try { + algo = createMessageDigest(getRuntime(), name); + } catch(NoSuchAlgorithmException e) { + throw getRuntime().newNotImplementedError("Unsupported digest algorithm (" + name + ")"); + } + return this; + } + + @JRubyMethod(name = {"update", "<<"}, required = 1) + public IRubyObject update(IRubyObject obj) { + data.append(obj); + return this; + } + + @JRubyMethod(name = "digest", optional = 1) + public IRubyObject digest(IRubyObject[] args) { + if (args.length == 1) { + reset(); + data.append(args[0]); + } + + IRubyObject digest = getDigest(); + + if (args.length == 1) { + reset(); + } + return digest; + } + + private IRubyObject getDigest() { + algo.reset(); + return RubyString.newString(getRuntime(), algo.digest(ByteList.plain(data))); + } + + @JRubyMethod(name = "digest!") + public IRubyObject digest_bang() { + algo.reset(); + byte[] digest = algo.digest(ByteList.plain(data)); + reset(); + return RubyString.newString(getRuntime(), digest); + } + + @JRubyMethod(name = {"hexdigest"}, optional = 1) + public IRubyObject hexdigest(IRubyObject[] args) { + algo.reset(); + if (args.length == 1) { + reset(); + data.append(args[0]); + } + + byte[] digest = ByteList.plain(toHex(algo.digest(ByteList.plain(data)))); + + if (args.length == 1) { + reset(); + } + return RubyString.newString(getRuntime(), digest); + } + + @JRubyMethod(name = {"to_s"}) + public IRubyObject to_s() { + algo.reset(); + return RubyString.newString(getRuntime(), ByteList.plain(toHex(algo.digest(ByteList.plain(data))))); + } + + @JRubyMethod(name = {"hexdigest!"}) + public IRubyObject hexdigest_bang() { + algo.reset(); + byte[] digest = ByteList.plain(toHex(algo.digest(ByteList.plain(data)))); + reset(); + return RubyString.newString(getRuntime(), digest); + } + + @JRubyMethod(name = "inspect") + public IRubyObject inspect() { + algo.reset(); + return RubyString.newString(getRuntime(), ByteList.plain("#<" + getMetaClass().getRealClass().getName() + ": " + toHex(algo.digest(ByteList.plain(data))) + ">")); + } + + @JRubyMethod(name = "==", required = 1) + public IRubyObject op_equal(IRubyObject oth) { + boolean ret = this == oth; + if(!ret) { + if (oth instanceof Base) { + Base b = (Base)oth; + ret = this.algo.getAlgorithm().equals(b.algo.getAlgorithm()) && + this.getDigest().equals(b.getDigest()); + } else { + IRubyObject str = oth.convertToString(); + ret = this.to_s().equals(str); + } + } + + return ret ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = {"length", "size", "digest_length"}) + public IRubyObject length() { + return RubyFixnum.newFixnum(getRuntime(), algo.getDigestLength()); + } + + @JRubyMethod(name = {"block_length"}) + public IRubyObject block_length() { + throw getRuntime().newRuntimeError( + this.getMetaClass() + " doesn't implement block_length()"); + } + + @JRubyMethod(name = {"reset"}) + public IRubyObject reset() { + algo.reset(); + data = new StringBuffer(); + return getRuntime().getNil(); + } + + private void setAlgorithm(IRubyObject algo) throws NoSuchAlgorithmException { + this.algo = createMessageDigest(getRuntime(), algo.toString()); + } + + private static String toHex(byte[] val) { + StringBuilder out = new StringBuilder(); + for(int i=0,j=val.length;i<j;i++) { + String ve = Integer.toString((((int)((char)val[i])) & 0xFF),16); + if(ve.length() == 1) { + ve = "0" + ve; + } + out.append(ve); + } + return out.toString(); + } + } +}// RubyDigest +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.ext.posix.util.Platform; + +import org.jruby.javasupport.JavaUtil; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.Dir; +import org.jruby.util.JRubyFile; +import org.jruby.util.ByteList; + +/** + * .The Ruby built-in class Dir. + * + * @author jvoegele + */ +@JRubyClass(name="Dir", include="Enumerable") +public class RubyDir extends RubyObject { + // What we passed to the constructor for method 'path' + private RubyString path; + protected JRubyFile dir; + private String[] snapshot; // snapshot of contents of directory + private int pos; // current position in directory + private boolean isOpen = true; + + public RubyDir(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + private static final ObjectAllocator DIR_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyDir(runtime, klass); + } + }; + + public static RubyClass createDirClass(Ruby runtime) { + RubyClass dirClass = runtime.defineClass("Dir", runtime.getObject(), DIR_ALLOCATOR); + runtime.setDir(dirClass); + + dirClass.includeModule(runtime.getEnumerable()); + + dirClass.defineAnnotatedMethods(RubyDir.class); + + return dirClass; + } + + private final void checkDir() { + if (!isTaint() && getRuntime().getSafeLevel() >= 4) throw getRuntime().newSecurityError("Insecure: operation on untainted Dir"); + + testFrozen(""); + + if (!isOpen) throw getRuntime().newIOError("closed directory"); + } + + /** + * Creates a new <code>Dir</code>. This method takes a snapshot of the + * contents of the directory at creation time, so changes to the contents + * of the directory will not be reflected during the lifetime of the + * <code>Dir</code> object returned, so a new <code>Dir</code> instance + * must be created to reflect changes to the underlying file system. + */ + @JRubyMethod(name = "initialize", required = 1, frame = true) + public IRubyObject initialize(IRubyObject _newPath, Block unusedBlock) { + RubyString newPath = _newPath.convertToString(); + getRuntime().checkSafeString(newPath); + + String adjustedPath = RubyFile.adjustRootPathOnWindows(getRuntime(), newPath.toString(), null); + checkDirIsTwoSlashesOnWindows(getRuntime(), adjustedPath); + + dir = JRubyFile.create(getRuntime().getCurrentDirectory(), adjustedPath); + if (!dir.isDirectory()) { + dir = null; + throw getRuntime().newErrnoENOENTError(newPath.toString() + " is not a directory"); + } + path = newPath; + List<String> snapshotList = new ArrayList<String>(); + snapshotList.add("."); + snapshotList.add(".."); + snapshotList.addAll(getContents(dir)); + snapshot = (String[]) snapshotList.toArray(new String[snapshotList.size()]); + pos = 0; + + return this; + } + +// ----- Ruby Class Methods ---------------------------------------------------- + + private static List<ByteList> dirGlobs(String cwd, IRubyObject[] args, int flags) { + List<ByteList> dirs = new ArrayList<ByteList>(); + + for (int i = 0; i < args.length; i++) { + ByteList globPattern = args[i].convertToString().getByteList(); + dirs.addAll(Dir.push_glob(cwd, globPattern, flags)); + } + + return dirs; + } + + private static IRubyObject asRubyStringList(Ruby runtime, List<ByteList> dirs) { + List<RubyString> allFiles = new ArrayList<RubyString>(); + + for (ByteList dir: dirs) { + allFiles.add(RubyString.newString(runtime, dir)); + } + + IRubyObject[] tempFileList = new IRubyObject[allFiles.size()]; + allFiles.toArray(tempFileList); + + return runtime.newArrayNoCopy(tempFileList); + } + + private static String getCWD(Ruby runtime) { + try { + return new org.jruby.util.NormalizedFile(runtime.getCurrentDirectory()).getCanonicalPath(); + } catch(Exception e) { + return runtime.getCurrentDirectory(); + } + } + + @JRubyMethod(name = "[]", required = 1, rest=true, meta = true) + public static IRubyObject aref(IRubyObject recv, IRubyObject[] args) { + List<ByteList> dirs; + if (args.length == 1) { + ByteList globPattern = args[0].convertToString().getByteList(); + dirs = Dir.push_glob(getCWD(recv.getRuntime()), globPattern, 0); + } else { + dirs = dirGlobs(getCWD(recv.getRuntime()), args, 0); + } + + return asRubyStringList(recv.getRuntime(), dirs); + } + + /** + * Returns an array of filenames matching the specified wildcard pattern + * <code>pat</code>. If a block is given, the array is iterated internally + * with each filename is passed to the block in turn. In this case, Nil is + * returned. + */ + @JRubyMethod(name = "glob", required = 1, optional = 1, frame = true, meta = true) + public static IRubyObject glob(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = recv.getRuntime(); + int flags = args.length == 2 ? RubyNumeric.num2int(args[1]) : 0; + + List<ByteList> dirs; + IRubyObject tmp = args[0].checkArrayType(); + if (tmp.isNil()) { + ByteList globPattern = args[0].convertToString().getByteList(); + dirs = Dir.push_glob(recv.getRuntime().getCurrentDirectory(), globPattern, flags); + } else { + dirs = dirGlobs(getCWD(runtime), ((RubyArray) tmp).toJavaArray(), flags); + } + + if (block.isGiven()) { + for (int i = 0; i < dirs.size(); i++) { + block.yield(context, RubyString.newString(runtime, dirs.get(i))); + } + + return recv.getRuntime().getNil(); + } + + return asRubyStringList(recv.getRuntime(), dirs); + } + + /** + * @return all entries for this Dir + */ + @JRubyMethod(name = "entries") + public RubyArray entries() { + return getRuntime().newArrayNoCopy(JavaUtil.convertJavaArrayToRuby(getRuntime(), snapshot)); + } + + /** + * Returns an array containing all of the filenames in the given directory. + */ + @JRubyMethod(name = "entries", required = 1, meta = true) + public static RubyArray entries(IRubyObject recv, IRubyObject path) { + Ruby runtime = recv.getRuntime(); + + String adjustedPath = RubyFile.adjustRootPathOnWindows( + runtime, path.convertToString().toString(), null); + checkDirIsTwoSlashesOnWindows(runtime, adjustedPath); + + final JRubyFile directory = JRubyFile.create( + recv.getRuntime().getCurrentDirectory(), adjustedPath); + + if (!directory.isDirectory()) { + throw recv.getRuntime().newErrnoENOENTError("No such directory"); + } + List<String> fileList = getContents(directory); + fileList.add(0, "."); + fileList.add(1, ".."); + Object[] files = fileList.toArray(); + return recv.getRuntime().newArrayNoCopy(JavaUtil.convertJavaArrayToRuby(recv.getRuntime(), files)); + } + + // MRI behavior: just plain '//' or '\\\\' are considered illegal on Windows. + private static void checkDirIsTwoSlashesOnWindows(Ruby runtime, String path) { + if (Platform.IS_WINDOWS && ("//".equals(path) || "\\\\".equals(path))) { + throw runtime.newErrnoEINVALError("Invalid argument - " + path); + } + } + + /** Changes the current directory to <code>path</code> */ + @JRubyMethod(name = "chdir", optional = 1, frame = true, meta = true) + public static IRubyObject chdir(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + RubyString path = args.length == 1 ? + (RubyString) args[0].convertToString() : getHomeDirectoryPath(context); + String adjustedPath = RubyFile.adjustRootPathOnWindows( + recv.getRuntime(), path.toString(), null); + checkDirIsTwoSlashesOnWindows(recv.getRuntime(), adjustedPath); + JRubyFile dir = getDir(recv.getRuntime(), adjustedPath, true); + String realPath = null; + String oldCwd = recv.getRuntime().getCurrentDirectory(); + + // We get canonical path to try and flatten the path out. + // a dir '/subdir/..' should return as '/' + // cnutter: Do we want to flatten path out? + try { + realPath = dir.getCanonicalPath(); + } catch (IOException e) { + realPath = dir.getAbsolutePath(); + } + + IRubyObject result = null; + if (block.isGiven()) { + // FIXME: Don't allow multiple threads to do this at once + recv.getRuntime().setCurrentDirectory(realPath); + try { + result = block.yield(context, path); + } finally { + dir = getDir(recv.getRuntime(), oldCwd, true); + recv.getRuntime().setCurrentDirectory(oldCwd); + } + } else { + recv.getRuntime().setCurrentDirectory(realPath); + result = recv.getRuntime().newFixnum(0); + } + + return result; + } + + /** + * Changes the root directory (only allowed by super user). Not available + * on all platforms. + */ + @JRubyMethod(name = "chroot", required = 1, meta = true) + public static IRubyObject chroot(IRubyObject recv, IRubyObject path) { + throw recv.getRuntime().newNotImplementedError("chroot not implemented: chroot is non-portable and is not supported."); + } + + /** + * Deletes the directory specified by <code>path</code>. The directory must + * be empty. + */ + @JRubyMethod(name = {"rmdir", "unlink", "delete"}, required = 1, meta = true) + public static IRubyObject rmdir(IRubyObject recv, IRubyObject path) { + JRubyFile directory = getDir(recv.getRuntime(), path.convertToString().toString(), true); + + if (!directory.delete()) { + throw recv.getRuntime().newSystemCallError("No such directory"); + } + + return recv.getRuntime().newFixnum(0); + } + + /** + * Executes the block once for each file in the directory specified by + * <code>path</code>. + */ + @JRubyMethod(name = "foreach", required = 1, frame = true, meta = true) + public static IRubyObject foreach(ThreadContext context, IRubyObject recv, IRubyObject _path, Block block) { + RubyString path = _path.convertToString(); + recv.getRuntime().checkSafeString(path); + + RubyClass dirClass = recv.getRuntime().getDir(); + RubyDir dir = (RubyDir) dirClass.newInstance(context, new IRubyObject[] { path }, block); + + dir.each(context, block); + return recv.getRuntime().getNil(); + } + + /** Returns the current directory. */ + @JRubyMethod(name = {"getwd", "pwd"}, meta = true) + public static RubyString getwd(IRubyObject recv) { + Ruby ruby = recv.getRuntime(); + + return RubyString.newUnicodeString(ruby, ruby.getCurrentDirectory()); + } + + /** + * Creates the directory specified by <code>path</code>. Note that the + * <code>mode</code> parameter is provided only to support existing Ruby + * code, and is ignored. + */ + @JRubyMethod(name = "mkdir", required = 1, optional = 1, meta = true) + public static IRubyObject mkdir(IRubyObject recv, IRubyObject[] args) { + Ruby runtime = recv.getRuntime(); + runtime.checkSafeString(args[0]); + String path = args[0].toString(); + + File newDir = getDir(runtime, path, false); + if (File.separatorChar == '\\') { + newDir = new File(newDir.getPath()); + } + + int mode = args.length == 2 ? ((int) args[1].convertToInteger().getLongValue()) : 0777; + + if (runtime.getPosix().mkdir(newDir.getAbsolutePath(), mode) < 0) { + // FIXME: This is a system error based on errno + throw recv.getRuntime().newSystemCallError("mkdir failed"); + } + + return RubyFixnum.zero(recv.getRuntime()); + } + + /** + * Returns a new directory object for <code>path</code>. If a block is + * provided, a new directory object is passed to the block, which closes the + * directory object before terminating. + */ + @JRubyMethod(name = "open", required = 1, frame = true, meta = true) + public static IRubyObject open(ThreadContext context, IRubyObject recv, IRubyObject path, Block block) { + RubyDir directory = + (RubyDir) recv.getRuntime().getDir().newInstance(context, + new IRubyObject[] { path }, Block.NULL_BLOCK); + + if (!block.isGiven()) return directory; + + try { + return block.yield(context, directory); + } finally { + directory.close(); + } + } + +// ----- Ruby Instance Methods ------------------------------------------------- + + /** + * Closes the directory stream. + */ + @JRubyMethod(name = "close") + public IRubyObject close() { + // Make sure any read()s after close fail. + checkDir(); + + isOpen = false; + + return getRuntime().getNil(); + } + + /** + * Executes the block once for each entry in the directory. + */ + @JRubyMethod(name = "each", frame = true) + public IRubyObject each(ThreadContext context, Block block) { + checkDir(); + + String[] contents = snapshot; + for (int i=0; i<contents.length; i++) { + block.yield(context, getRuntime().newString(contents[i])); + } + return this; + } + + /** + * Returns the current position in the directory. + */ + @JRubyMethod(name = {"tell", "pos"}) + public RubyInteger tell() { + checkDir(); + return getRuntime().newFixnum(pos); + } + + /** + * Moves to a position <code>d</code>. <code>pos</code> must be a value + * returned by <code>tell</code> or 0. + */ + @JRubyMethod(name = "seek", required = 1) + public IRubyObject seek(IRubyObject newPos) { + checkDir(); + + set_pos(newPos); + return this; + } + + @JRubyMethod(name = "pos=", required = 1) + public IRubyObject set_pos(IRubyObject newPos) { + this.pos = RubyNumeric.fix2int(newPos); + return newPos; + } + + @JRubyMethod(name = "path") + public IRubyObject path(ThreadContext context) { + checkDir(); + + return path.strDup(context.getRuntime()); + } + + /** Returns the next entry from this directory. */ + @JRubyMethod(name = "read") + public IRubyObject read() { + checkDir(); + + if (pos >= snapshot.length) { + return getRuntime().getNil(); + } + RubyString result = getRuntime().newString(snapshot[pos]); + pos++; + return result; + } + + /** Moves position in this directory to the first entry. */ + @JRubyMethod(name = "rewind") + public IRubyObject rewind() { + if (!isTaint() && getRuntime().getSafeLevel() >= 4) throw getRuntime().newSecurityError("Insecure: can't close"); + checkDir(); + + pos = 0; + return this; + } + +// ----- Helper Methods -------------------------------------------------------- + + /** Returns a Java <code>File</code> object for the specified path. If + * <code>path</code> is not a directory, throws <code>IOError</code>. + * + * @param path path for which to return the <code>File</code> object. + * @param mustExist is true the directory must exist. If false it must not. + * @throws IOError if <code>path</code> is not a directory. + */ + protected static JRubyFile getDir(final Ruby runtime, final String path, final boolean mustExist) { + JRubyFile result = JRubyFile.create(runtime.getCurrentDirectory(),path); + if (mustExist && !result.exists()) { + throw runtime.newErrnoENOENTError("No such file or directory - " + path); + } + boolean isDirectory = result.isDirectory(); + + if (mustExist && !isDirectory) { + throw runtime.newErrnoENOTDIRError(path + " is not a directory"); + } else if (!mustExist && isDirectory) { + throw runtime.newErrnoEEXISTError("File exists - " + path); + } + + return result; + } + + /** + * Returns the contents of the specified <code>directory</code> as an + * <code>ArrayList</code> containing the names of the files as Java Strings. + */ + protected static List<String> getContents(File directory) { + String[] contents = directory.list(); + List<String> result = new ArrayList<String>(); + + // If an IO exception occurs (something odd, but possible) + // A directory may return null. + if (contents != null) { + for (int i=0; i<contents.length; i++) { + result.add(contents[i]); + } + } + return result; + } + + /** + * Returns the contents of the specified <code>directory</code> as an + * <code>ArrayList</code> containing the names of the files as Ruby Strings. + */ + protected static List<RubyString> getContents(File directory, Ruby runtime) { + List<RubyString> result = new ArrayList<RubyString>(); + String[] contents = directory.list(); + + for (int i = 0; i < contents.length; i++) { + result.add(runtime.newString(contents[i])); + } + return result; + } + + /** + * Returns the home directory of the specified <code>user</code> on the + * system. If the home directory of the specified user cannot be found, + * an <code>ArgumentError it thrown</code>. + */ + public static IRubyObject getHomeDirectoryPath(ThreadContext context, String user) { + /* + * TODO: This version is better than the hackish previous one. Windows + * behavior needs to be defined though. I suppose this version + * could be improved more too. + * TODO: /etc/passwd is also inadequate for MacOSX since it does not + * use /etc/passwd for regular user accounts + */ + + String passwd = null; + try { + FileInputStream stream = new FileInputStream("/etc/passwd"); + int totalBytes = stream.available(); + byte[] bytes = new byte[totalBytes]; + stream.read(bytes); + stream.close(); + passwd = new String(bytes); + } catch (IOException e) { + return context.getRuntime().getNil(); + } + + String[] rows = passwd.split("\n"); + int rowCount = rows.length; + for (int i = 0; i < rowCount; i++) { + String[] fields = rows[i].split(":"); + if (fields[0].equals(user)) { + return context.getRuntime().newString(fields[5]); + } + } + + throw context.getRuntime().newArgumentError("user " + user + " doesn't exist"); + } + + public static RubyString getHomeDirectoryPath(ThreadContext context) { + Ruby runtime = context.getRuntime(); + RubyHash systemHash = (RubyHash) runtime.getObject().fastGetConstant("ENV_JAVA"); + RubyHash envHash = (RubyHash) runtime.getObject().fastGetConstant("ENV"); + IRubyObject home = envHash.op_aref(context, runtime.newString("HOME")); + + if (home == null || home.isNil()) { + home = systemHash.op_aref(context, runtime.newString("user.home")); + } + + if (home == null || home.isNil()) { + home = envHash.op_aref(context, runtime.newString("LOGDIR")); + } + + if (home == null || home.isNil()) { + throw runtime.newArgumentError("user.home/LOGDIR not set"); + } + + return (RubyString) home; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.util.Comparator; +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicInteger; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; + +import org.jruby.exceptions.JumpException; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallBlock; +import org.jruby.runtime.BlockCallback; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.TypeConverter; + +/** + * The implementation of Ruby's Enumerable module. + */ + +@JRubyModule(name="Enumerable") +public class RubyEnumerable { + + public static RubyModule createEnumerableModule(Ruby runtime) { + RubyModule enumModule = runtime.defineModule("Enumerable"); + runtime.setEnumerable(enumModule); + + enumModule.defineAnnotatedMethods(RubyEnumerable.class); + + return enumModule; + } + + public static IRubyObject callEach(Ruby runtime, ThreadContext context, IRubyObject self, + BlockCallback callback) { + return RuntimeHelpers.invoke(context, self, "each", CallBlock.newCallClosure(self, runtime.getEnumerable(), + Arity.noArguments(), callback, context)); + } + + private static class ExitIteration extends RuntimeException { + public Throwable fillInStackTrace() { + return this; + } + } + + @JRubyMethod(name = "first") + public static IRubyObject first_0(ThreadContext context, IRubyObject self) { + Ruby runtime = self.getRuntime(); + final ThreadContext localContext = context; + + final IRubyObject[] holder = new IRubyObject[]{runtime.getNil()}; + + try { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw ctx.getRuntime().newThreadError("Enumerable#first cannot be parallelized"); + } + holder[0] = largs[0]; + throw new ExitIteration(); + } + }); + } catch(ExitIteration ei) {} + + return holder[0]; + } + + @JRubyMethod(name = "first") + public static IRubyObject first_1(ThreadContext context, IRubyObject self, final IRubyObject num) { + final Ruby runtime = self.getRuntime(); + final RubyArray result = runtime.newArray(); + final ThreadContext localContext = context; + + if(RubyNumeric.fix2int(num) < 0) { + throw runtime.newArgumentError("negative index"); + } + + try { + callEach(runtime, context, self, new BlockCallback() { + private int iter = RubyNumeric.fix2int(num); + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#first cannot be parallelized"); + } + if(iter-- == 0) { + throw new ExitIteration(); + } + result.append(largs[0]); + return runtime.getNil(); + } + }); + } catch(ExitIteration ei) {} + + return result; + } + + @JRubyMethod(name = {"to_a", "entries"}) + public static IRubyObject to_a(ThreadContext context, IRubyObject self) { + Ruby runtime = self.getRuntime(); + RubyArray result = runtime.newArray(); + + callEach(runtime, context, self, new AppendBlockCallback(runtime, result)); + + return result; + } + + @JRubyMethod(name = "sort", frame = true) + public static IRubyObject sort(ThreadContext context, IRubyObject self, final Block block) { + Ruby runtime = self.getRuntime(); + RubyArray result = runtime.newArray(); + + callEach(runtime, context, self, new AppendBlockCallback(runtime, result)); + result.sort_bang(block); + + return result; + } + + @JRubyMethod(name = "sort_by", frame = true) + public static IRubyObject sort_by(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final ThreadContext localContext = context; // MUST NOT be used across threads + + if (self instanceof RubyArray) { + RubyArray selfArray = (RubyArray) self; + final IRubyObject[][] valuesAndCriteria = new IRubyObject[selfArray.size()][2]; + + callEach(runtime, context, self, new BlockCallback() { + AtomicInteger i = new AtomicInteger(0); + + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + IRubyObject[] myVandC = valuesAndCriteria[i.getAndIncrement()]; + myVandC[0] = largs[0]; + myVandC[1] = block.yield(ctx, largs[0]); + return runtime.getNil(); + } + }); + + Arrays.sort(valuesAndCriteria, new Comparator<IRubyObject[]>() { + public int compare(IRubyObject[] o1, IRubyObject[] o2) { + return RubyFixnum.fix2int(o1[1].callMethod(localContext, MethodIndex.OP_SPACESHIP, "<=>", o2[1])); + } + }); + + IRubyObject dstArray[] = new IRubyObject[selfArray.size()]; + for (int i = 0; i < dstArray.length; i++) { + dstArray[i] = valuesAndCriteria[i][0]; + } + + return runtime.newArrayNoCopy(dstArray); + } else { + final RubyArray result = runtime.newArray(); + callEach(runtime, context, self, new AppendBlockCallback(runtime, result)); + + final IRubyObject[][] valuesAndCriteria = new IRubyObject[result.size()][2]; + for (int i = 0; i < valuesAndCriteria.length; i++) { + IRubyObject val = result.eltInternal(i); + valuesAndCriteria[i][0] = val; + valuesAndCriteria[i][1] = block.yield(context, val); + } + + Arrays.sort(valuesAndCriteria, new Comparator<IRubyObject[]>() { + public int compare(IRubyObject[] o1, IRubyObject[] o2) { + return RubyFixnum.fix2int(o1[1].callMethod(localContext, MethodIndex.OP_SPACESHIP, "<=>", o2[1])); + } + }); + + for (int i = 0; i < valuesAndCriteria.length; i++) { + result.eltInternalSet(i, valuesAndCriteria[i][0]); + } + + return result; + } + } + + @JRubyMethod(name = "grep", required = 1, frame = true) + public static IRubyObject grep(ThreadContext context, IRubyObject self, final IRubyObject pattern, final Block block) { + final Ruby runtime = self.getRuntime(); + final RubyArray result = runtime.newArray(); + + if (block.isGiven()) { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + ctx.setRubyFrameDelta(ctx.getRubyFrameDelta()+2); + if (pattern.callMethod(ctx, MethodIndex.OP_EQQ, "===", largs[0]).isTrue()) { + IRubyObject value = block.yield(ctx, largs[0]); + synchronized (result) { + result.append(value); + } + } + ctx.setRubyFrameDelta(ctx.getRubyFrameDelta()-2); + return runtime.getNil(); + } + }); + } else { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (pattern.callMethod(ctx, MethodIndex.OP_EQQ, "===", largs[0]).isTrue()) { + synchronized (result) { + result.append(largs[0]); + } + } + return runtime.getNil(); + } + }); + } + + return result; + } + + @JRubyMethod(name = {"detect", "find"}, optional = 1, frame = true) + public static IRubyObject detect(ThreadContext context, IRubyObject self, IRubyObject[] args, final Block block) { + final Ruby runtime = self.getRuntime(); + final IRubyObject result[] = new IRubyObject[] { null }; + final ThreadContext localContext = context; + IRubyObject ifnone = null; + + if (args.length == 1) ifnone = args[0]; + + try { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#detect/find cannot be parallelized"); + } + if (block.yield(ctx, largs[0]).isTrue()) { + result[0] = largs[0]; + throw JumpException.SPECIAL_JUMP; + } + return runtime.getNil(); + } + }); + } catch (JumpException.SpecialJump sj) { + return result[0]; + } + + return ifnone != null ? ifnone.callMethod(context, "call") : runtime.getNil(); + } + + @JRubyMethod(name = {"select", "find_all"}, frame = true) + public static IRubyObject select(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final RubyArray result = runtime.newArray(); + + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (block.yield(ctx, largs[0]).isTrue()) { + synchronized (result) { + result.append(largs[0]); + } + } + return runtime.getNil(); + } + }); + + return result; + } + + @JRubyMethod(name = "reject", frame = true) + public static IRubyObject reject(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final RubyArray result = runtime.newArray(); + + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (!block.yield(ctx, largs[0]).isTrue()) { + synchronized (result) { + result.append(largs[0]); + } + } + return runtime.getNil(); + } + }); + + return result; + } + + @JRubyMethod(name = {"collect", "map"}, frame = true) + public static IRubyObject collect(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final RubyArray result = runtime.newArray(); + + if (block.isGiven()) { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + IRubyObject value = block.yield(ctx, largs[0]); + synchronized (result) { + result.append(value); + } + return runtime.getNil(); + } + }); + } else { + callEach(runtime, context, self, new AppendBlockCallback(runtime, result)); + } + return result; + } + + @JRubyMethod(name = "inject", optional = 1, frame = true) + public static IRubyObject inject(ThreadContext context, IRubyObject self, IRubyObject[] args, final Block block) { + final Ruby runtime = self.getRuntime(); + final IRubyObject result[] = new IRubyObject[] { null }; + final ThreadContext localContext = context; + + if (args.length == 1) result[0] = args[0]; + + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#inject cannot be parallelized"); + } + result[0] = result[0] == null ? + largs[0] : block.yield(ctx, runtime.newArray(result[0], largs[0]), null, null, true); + + return runtime.getNil(); + } + }); + + return result[0] == null ? runtime.getNil() : result[0]; + } + + @JRubyMethod(name = "partition", frame = true) + public static IRubyObject partition(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final RubyArray arr_true = runtime.newArray(); + final RubyArray arr_false = runtime.newArray(); + + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (block.yield(ctx, largs[0]).isTrue()) { + synchronized (arr_true) { + arr_true.append(largs[0]); + } + } else { + synchronized (arr_false) { + arr_false.append(largs[0]); + } + } + + return runtime.getNil(); + } + }); + + return runtime.newArray(arr_true, arr_false); + } + + private static class EachWithIndex implements BlockCallback { + private int index = 0; + private final Block block; + private final Ruby runtime; + + public EachWithIndex(ThreadContext ctx, Block block) { + this.block = block; + this.runtime = ctx.getRuntime(); + } + + public IRubyObject call(ThreadContext context, IRubyObject[] iargs, Block block) { + this.block.call(context, new IRubyObject[] { runtime.newArray(iargs[0], runtime.newFixnum(index++)) }); + return runtime.getNil(); + } + } + + @JRubyMethod(name = "each_with_index", frame = true) + public static IRubyObject each_with_index(ThreadContext context, IRubyObject self, Block block) { + RuntimeHelpers.invoke(context, self, "each", CallBlock.newCallClosure(self, self.getRuntime().getEnumerable(), + Arity.noArguments(), new EachWithIndex(context, block), context)); + + return self; + } + + @JRubyMethod(name = {"include?", "member?"}, required = 1, frame = true) + public static IRubyObject include_p(ThreadContext context, IRubyObject self, final IRubyObject arg) { + final Ruby runtime = context.getRuntime(); + final ThreadContext localContext = context; + + try { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#include?/member? cannot be parallelized"); + } + if (RubyObject.equalInternal(ctx, largs[0], arg)) { + throw JumpException.SPECIAL_JUMP; + } + return runtime.getNil(); + } + }); + } catch (JumpException.SpecialJump sj) { + return runtime.getTrue(); + } + + return runtime.getFalse(); + } + + @JRubyMethod(name = "max", frame = true) + public static IRubyObject max(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final IRubyObject result[] = new IRubyObject[] { null }; + final ThreadContext localContext = context; + + if (block.isGiven()) { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#max{} cannot be parallelized"); + } + if (result[0] == null || RubyComparable.cmpint(ctx, block.yield(ctx, + runtime.newArray(largs[0], result[0])), largs[0], result[0]) > 0) { + result[0] = largs[0]; + } + return runtime.getNil(); + } + }); + } else { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + synchronized (result) { + if (result[0] == null || RubyComparable.cmpint(ctx, largs[0].callMethod(ctx, + MethodIndex.OP_SPACESHIP, "<=>", result[0]), largs[0], result[0]) > 0) { + result[0] = largs[0]; + } + } + return runtime.getNil(); + } + }); + } + + return result[0] == null ? runtime.getNil() : result[0]; + } + + @JRubyMethod(name = "min", frame = true) + public static IRubyObject min(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final IRubyObject result[] = new IRubyObject[] { null }; + final ThreadContext localContext = context; + + if (block.isGiven()) { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#min{} cannot be parallelized"); + } + if (result[0] == null || RubyComparable.cmpint(ctx, block.yield(ctx, + runtime.newArray(largs[0], result[0])), largs[0], result[0]) < 0) { + result[0] = largs[0]; + } + return runtime.getNil(); + } + }); + } else { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + synchronized (result) { + if (result[0] == null || RubyComparable.cmpint(ctx, largs[0].callMethod(ctx, + MethodIndex.OP_SPACESHIP, "<=>", result[0]), largs[0], result[0]) < 0) { + result[0] = largs[0]; + } + } + return runtime.getNil(); + } + }); + } + + return result[0] == null ? runtime.getNil() : result[0]; + } + + @JRubyMethod(name = "all?", frame = true) + public static IRubyObject all_p(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final ThreadContext localContext = context; + + try { + if (block.isGiven()) { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#all? cannot be parallelized"); + } + if (!block.yield(ctx, largs[0]).isTrue()) { + throw JumpException.SPECIAL_JUMP; + } + return runtime.getNil(); + } + }); + } else { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#all? cannot be parallelized"); + } + if (!largs[0].isTrue()) { + throw JumpException.SPECIAL_JUMP; + } + return runtime.getNil(); + } + }); + } + } catch (JumpException.SpecialJump sj) { + return runtime.getFalse(); + } + + return runtime.getTrue(); + } + + @JRubyMethod(name = "any?", frame = true) + public static IRubyObject any_p(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final ThreadContext localContext = context; + + try { + if (block.isGiven()) { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#any? cannot be parallelized"); + } + if (block.yield(ctx, largs[0]).isTrue()) { + throw JumpException.SPECIAL_JUMP; + } + return runtime.getNil(); + } + }); + } else { + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (localContext != ctx) { + throw runtime.newThreadError("Enumerable#any? cannot be parallelized"); + } + if (largs[0].isTrue()) { + throw JumpException.SPECIAL_JUMP; + } + return runtime.getNil(); + } + }); + } + } catch (JumpException.SpecialJump sj) { + return runtime.getTrue(); + } + + return runtime.getFalse(); + } + + @JRubyMethod(name = "zip", rest = true, frame = true) + public static IRubyObject zip(ThreadContext context, IRubyObject self, final IRubyObject[] args, final Block block) { + final Ruby runtime = self.getRuntime(); + + for (int i = 0; i < args.length; i++) { + args[i] = TypeConverter.convertToType(args[i], runtime.getArray(), MethodIndex.TO_A, "to_a"); + } + + final int aLen = args.length + 1; + + if (block.isGiven()) { + callEach(runtime, context, self, new BlockCallback() { + AtomicInteger ix = new AtomicInteger(0); + + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + RubyArray array = runtime.newArray(aLen); + int myIx = ix.getAndIncrement(); + array.append(largs[0]); + for (int i = 0, j = args.length; i < j; i++) { + array.append(((RubyArray) args[i]).entry(myIx)); + } + block.yield(ctx, array); + return runtime.getNil(); + } + }); + return runtime.getNil(); + } else { + final RubyArray zip = runtime.newArray(); + callEach(runtime, context, self, new BlockCallback() { + AtomicInteger ix = new AtomicInteger(0); + + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + RubyArray array = runtime.newArray(aLen); + array.append(largs[0]); + int myIx = ix.getAndIncrement(); + for (int i = 0, j = args.length; i < j; i++) { + array.append(((RubyArray) args[i]).entry(myIx)); + } + synchronized (zip) { + zip.append(array); + } + return runtime.getNil(); + } + }); + return zip; + } + } + + @JRubyMethod(name = "group_by", frame = true) + public static IRubyObject group_by(ThreadContext context, IRubyObject self, final Block block) { + final Ruby runtime = self.getRuntime(); + final RubyHash result = new RubyHash(runtime); + + callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + IRubyObject key = block.yield(ctx, largs[0]); + synchronized (result) { + IRubyObject curr = result.fastARef(key); + + if (curr == null) { + curr = runtime.newArray(); + result.fastASet(key, curr); + } + curr.callMethod(ctx, MethodIndex.OP_LSHIFT, "<<", largs[0]); + } + return runtime.getNil(); + } + }); + + return result; + } + + public static final class AppendBlockCallback implements BlockCallback { + private Ruby runtime; + private RubyArray result; + + public AppendBlockCallback(Ruby runtime, RubyArray result) { + this.runtime = runtime; + this.result = result; + } + + public IRubyObject call(ThreadContext context, IRubyObject[] largs, Block blk) { + result.append(largs[0]); + + return runtime.getNil(); + } + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006 Michael Studman <me@michaelstudman.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Block; +import org.jruby.runtime.BlockCallback; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * Implementation of Ruby's Enumerator module. + */ +@JRubyModule(name="Enumerable::Enumerator", include="Enumerable") +public class RubyEnumerator extends RubyObject { + /** target for each operation */ + private IRubyObject object; + + /** method to invoke for each operation */ + private IRubyObject method; + + /** args to each method */ + private IRubyObject[] methodArgs; + + private static ObjectAllocator ENUMERATOR_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyEnumerator(runtime, klass); + } + }; + + public static void defineEnumerator(Ruby runtime) { + RubyModule kernel = runtime.getKernel(); + kernel.defineAnnotatedMethod(RubyEnumerator.class, "obj_to_enum"); + + RubyModule enm = runtime.getClassFromPath("Enumerable"); + enm.defineAnnotatedMethod(RubyEnumerator.class, "each_with_index"); + enm.defineAnnotatedMethod(RubyEnumerator.class, "each_slice"); + enm.defineAnnotatedMethod(RubyEnumerator.class, "enum_slice"); + enm.defineAnnotatedMethod(RubyEnumerator.class, "each_cons"); + enm.defineAnnotatedMethod(RubyEnumerator.class, "enum_cons"); + + RubyClass enmr = enm.defineClassUnder("Enumerator", runtime.getObject(), ENUMERATOR_ALLOCATOR); + + enmr.includeModule(enm); + + enmr.defineAnnotatedMethod(RubyEnumerator.class, "initialize"); + enmr.defineAnnotatedMethod(RubyEnumerator.class, "each"); + + runtime.setEnumerator(enmr); + } + + @JRubyMethod(name = {"to_enum", "enum_for"}, optional = 1, rest = true, frame = true) + public static IRubyObject obj_to_enum(ThreadContext context, IRubyObject self, IRubyObject[] args, Block block) { + IRubyObject[] newArgs = new IRubyObject[args.length + 1]; + newArgs[0] = self; + System.arraycopy(args, 0, newArgs, 1, args.length); + + return self.getRuntime().getEnumerator().callMethod(context, "new", newArgs); + } + + private RubyEnumerator(Ruby runtime, RubyClass type) { + super(runtime, type); + object = method = runtime.getNil(); + } + + @JRubyMethod(name = "initialize", required = 1, rest = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args) { + object = args[0]; + method = args.length > 1 ? args[1] : getRuntime().fastNewSymbol("each"); + if (args.length > 2) { + methodArgs = new IRubyObject[Math.max(0, args.length - 2)]; + System.arraycopy(args, 2, methodArgs, 0, args.length - 2); + } else { + methodArgs = new IRubyObject[0]; + } + return this; + } + + /** + * Send current block and supplied args to method on target. According to MRI + * Block may not be given and "each" should just ignore it and call on through to + * underlying method. + */ + @JRubyMethod(name = "each", frame = true) + public IRubyObject each(ThreadContext context, Block block) { + return object.callMethod(context, method.asJavaString(), methodArgs, block); + } + + @JRubyMethod(name = "enum_with_index") + public static IRubyObject each_with_index(ThreadContext context, IRubyObject self) { + IRubyObject enumerator = self.getRuntime().getEnumerator(); + return RuntimeHelpers.invoke(context, enumerator, "new", self, self.getRuntime().fastNewSymbol("each_with_index")); + } + + @JRubyMethod(name = "each_slice", required = 1, frame = true) + public static IRubyObject each_slice(ThreadContext context, IRubyObject self, IRubyObject arg, final Block block) { + final int size = (int)RubyNumeric.num2long(arg); + + if (size <= 0) throw self.getRuntime().newArgumentError("invalid slice size"); + + final Ruby runtime = self.getRuntime(); + final RubyArray result[] = new RubyArray[]{runtime.newArray(size)}; + + RubyEnumerable.callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + result[0].append(largs[0]); + if (result[0].size() == size) { + block.yield(ctx, result[0]); + result[0] = runtime.newArray(size); + } + return runtime.getNil(); + } + }); + + if (result[0].size() > 0) block.yield(context, result[0]); + return self.getRuntime().getNil(); + } + + @JRubyMethod(name = "each_cons", required = 1, frame = true) + public static IRubyObject each_cons(ThreadContext context, IRubyObject self, IRubyObject arg, final Block block) { + final int size = (int)RubyNumeric.num2long(arg); + + if (size <= 0) throw self.getRuntime().newArgumentError("invalid size"); + + final Ruby runtime = self.getRuntime(); + final RubyArray result = runtime.newArray(size); + + RubyEnumerable.callEach(runtime, context, self, new BlockCallback() { + public IRubyObject call(ThreadContext ctx, IRubyObject[] largs, Block blk) { + if (result.size() == size) result.shift(); + result.append(largs[0]); + if (result.size() == size) block.yield(ctx, result.aryDup()); + return runtime.getNil(); + } + }); + + return runtime.getNil(); + } + + @JRubyMethod(name = "enum_slice", required = 1) + public static IRubyObject enum_slice(ThreadContext context, IRubyObject self, IRubyObject arg) { + IRubyObject enumerator = self.getRuntime().getEnumerator(); + return RuntimeHelpers.invoke(context, enumerator, "new", self, self.getRuntime().fastNewSymbol("each_slice"), arg); + } + + @JRubyMethod(name = "enum_cons", required = 1) + public static IRubyObject enum_cons(ThreadContext context, IRubyObject self, IRubyObject arg) { + IRubyObject enumerator = self.getRuntime().getEnumerator(); + return RuntimeHelpers.invoke(context, enumerator, "new", self, self.getRuntime().fastNewSymbol("each_cons"), arg); + } +} +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.ext.posix.Passwd; +import org.jruby.ext.posix.Group; +import org.jruby.ext.posix.POSIX; +import org.jruby.ext.posix.util.Platform; +import org.jruby.runtime.Block; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +@JRubyModule(name="Etc") +public class RubyEtc { + public static RubyModule createEtcModule(Ruby runtime) { + RubyModule etcModule = runtime.defineModule("Etc"); + + runtime.setEtc(etcModule); + + etcModule.defineAnnotatedMethods(RubyEtc.class); + + definePasswdStruct(runtime); + defineGroupStruct(runtime); + + return etcModule; + } + + private static void definePasswdStruct(Ruby runtime) { + IRubyObject[] args = new IRubyObject[] { + runtime.newString("Passwd"), + runtime.newSymbol("name"), + runtime.newSymbol("passwd"), + runtime.newSymbol("uid"), + runtime.newSymbol("gid"), + runtime.newSymbol("gecos"), + runtime.newSymbol("dir"), + runtime.newSymbol("shell"), + runtime.newSymbol("change"), + runtime.newSymbol("uclass"), + runtime.newSymbol("expire") + }; + + runtime.setPasswdStruct(RubyStruct.newInstance(runtime.getStructClass(), args, Block.NULL_BLOCK)); + } + + private static void defineGroupStruct(Ruby runtime) { + IRubyObject[] args = new IRubyObject[] { + runtime.newString("Group"), + runtime.newSymbol("name"), + runtime.newSymbol("passwd"), + runtime.newSymbol("gid"), + runtime.newSymbol("mem") + }; + + runtime.setGroupStruct(RubyStruct.newInstance(runtime.getStructClass(), args, Block.NULL_BLOCK)); + } + + private static IRubyObject setupPasswd(Ruby runtime, Passwd passwd) { + IRubyObject[] args = new IRubyObject[] { + runtime.newString(passwd.getLoginName()), + runtime.newString(passwd.getPassword()), + runtime.newFixnum(passwd.getUID()), + runtime.newFixnum(passwd.getGID()), + runtime.newString(passwd.getGECOS()), + runtime.newString(passwd.getHome()), + runtime.newString(passwd.getShell()), + runtime.newFixnum(passwd.getPasswdChangeTime()), + runtime.newString(passwd.getAccessClass()), + runtime.newFixnum(passwd.getExpire()) + + }; + + return RubyStruct.newStruct(runtime.getPasswdStruct(), args, Block.NULL_BLOCK); + } + + + private static IRubyObject setupGroup(Ruby runtime, Group group) { + IRubyObject[] args = new IRubyObject[] { + runtime.newString(group.getName()), + runtime.newString(group.getPassword()), + runtime.newFixnum(group.getGID()), + intoStringArray(runtime, group.getMembers()) + }; + + return RubyStruct.newStruct(runtime.getGroupStruct(), args, Block.NULL_BLOCK); + } + + private static IRubyObject intoStringArray(Ruby runtime, String[] members) { + IRubyObject[] arr = new IRubyObject[members.length]; + for(int i = 0; i<arr.length; i++) { + arr[i] = runtime.newString(members[i]); + } + return runtime.newArrayNoCopy(arr); + } + + + @JRubyMethod(name = "getpwuid", optional=1, module = true) + public static IRubyObject getpwuid(IRubyObject recv, IRubyObject[] args) { + Ruby runtime = recv.getRuntime(); + POSIX posix = runtime.getPosix(); + int uid = args.length == 0 ? posix.getuid() : RubyNumeric.fix2int(args[0]); + Passwd pwd = posix.getpwuid(uid); + if(pwd == null) { + if (Platform.IS_WINDOWS) { // MRI behavior + return recv.getRuntime().getNil(); + } + throw runtime.newArgumentError("can't find user for " + uid); + } + return setupPasswd(runtime, pwd); + } + + @JRubyMethod(name = "getpwnam", required=1, module = true) + public static IRubyObject getpwnam(IRubyObject recv, IRubyObject name) { + String nam = name.convertToString().toString(); + Passwd pwd = recv.getRuntime().getPosix().getpwnam(nam); + if(pwd == null) { + if (Platform.IS_WINDOWS) { // MRI behavior + return recv.getRuntime().getNil(); + } + throw recv.getRuntime().newArgumentError("can't find user for " + nam); + } + return setupPasswd(recv.getRuntime(), pwd); + } + + @JRubyMethod(name = "passwd", module = true, frame=true) + public static IRubyObject passwd(IRubyObject recv, Block block) { + Ruby runtime = recv.getRuntime(); + POSIX posix = runtime.getPosix(); + if(block.isGiven()) { + ThreadContext context = runtime.getCurrentContext(); + posix.setpwent(); + Passwd pw; + while((pw = posix.getpwent()) != null) { + block.yield(context, setupPasswd(runtime, pw)); + } + posix.endpwent(); + } + + Passwd pw = posix.getpwent(); + if (pw != null) { + return setupPasswd(runtime, pw); + } else { + return runtime.getNil(); + } + } + + @JRubyMethod(name = "getlogin", module = true) + public static IRubyObject getlogin(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + + String login = runtime.getPosix().getlogin(); + + if (login != null) { + return runtime.newString(login); + } else { + return runtime.getNil(); + } + } + + @JRubyMethod(name = "endpwent", module = true) + public static IRubyObject endpwent(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + runtime.getPosix().endpwent(); + return runtime.getNil(); + } + + @JRubyMethod(name = "setpwent", module = true) + public static IRubyObject setpwent(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + runtime.getPosix().setpwent(); + return runtime.getNil(); + } + + @JRubyMethod(name = "getpwent", module = true) + public static IRubyObject getpwent(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + Passwd passwd = runtime.getPosix().getpwent(); + if (passwd != null) { + return setupPasswd(recv.getRuntime(), passwd); + } else { + return runtime.getNil(); + } + } + + @JRubyMethod(name = "getgrnam", required=1, module = true) + public static IRubyObject getgrnam(IRubyObject recv, IRubyObject name) { + String nam = name.convertToString().toString(); + Group grp = recv.getRuntime().getPosix().getgrnam(nam); + if(grp == null) { + if (Platform.IS_WINDOWS) { // MRI behavior + return recv.getRuntime().getNil(); + } + throw recv.getRuntime().newArgumentError("can't find group for " + nam); + } + return setupGroup(recv.getRuntime(), grp); + } + + @JRubyMethod(name = "getgrgid", optional=1, module = true) + public static IRubyObject getgrgid(IRubyObject recv, IRubyObject[] args) { + Ruby runtime = recv.getRuntime(); + POSIX posix = runtime.getPosix(); + int gid = args.length == 0 ? posix.getgid() : RubyNumeric.fix2int(args[0]); + Group gr = posix.getgrgid(gid); + if(gr == null) { + if (Platform.IS_WINDOWS) { // MRI behavior + return runtime.getNil(); + } + throw runtime.newArgumentError("can't find group for " + gid); + } + return setupGroup(runtime, gr); + } + + @JRubyMethod(name = "endgrent", module = true) + public static IRubyObject endgrent(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + runtime.getPosix().endgrent(); + return runtime.getNil(); + } + + @JRubyMethod(name = "setgrent", module = true) + public static IRubyObject setgrent(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + runtime.getPosix().setgrent(); + return runtime.getNil(); + } + + @JRubyMethod(name = "group", module = true, frame=true) + public static IRubyObject group(IRubyObject recv, Block block) { + Ruby runtime = recv.getRuntime(); + POSIX posix = runtime.getPosix(); + if(block.isGiven()) { + ThreadContext context = runtime.getCurrentContext(); + posix.setgrent(); + Group gr; + while((gr = posix.getgrent()) != null) { + block.yield(context, setupGroup(runtime, gr)); + } + posix.endgrent(); + } + + Group gr = posix.getgrent(); + if (gr != null) { + return setupGroup(runtime, gr); + } else { + return runtime.getNil(); + } + } + + @JRubyMethod(name = "getgrent", module = true) + public static IRubyObject getgrent(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + Group gr = runtime.getPosix().getgrent(); + if (gr != null) { + return setupGroup(recv.getRuntime(), gr); + } else { + return runtime.getNil(); + } + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Joey Gibson <joey@joeygibson.com> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 David Corbin <dcorbin@users.sf.net> + * Copyright (C) 2006 Michael Studman <codehaus@michaelstudman.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; +import java.io.PrintStream; +import java.util.List; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; + +import org.jruby.runtime.Block; +import org.jruby.runtime.Frame; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ObjectMarshal; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.builtin.Variable; +import org.jruby.runtime.component.VariableEntry; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.SafePropertyAccessor; + +/** + * + * @author jpetersen + */ +@JRubyClass(name="Exception") +public class RubyException extends RubyObject { + private StackTraceElement[] backtraceFrames; + private StackTraceElement[] javaStackTrace; + private IRubyObject backtrace; + public IRubyObject message; + public static final int TRACE_HEAD = 8; + public static final int TRACE_TAIL = 4; + public static final int TRACE_MAX = TRACE_HEAD + TRACE_TAIL + 6; + + protected RubyException(Ruby runtime, RubyClass rubyClass) { + this(runtime, rubyClass, null); + } + + public RubyException(Ruby runtime, RubyClass rubyClass, String message) { + super(runtime, rubyClass); + + this.message = message == null ? runtime.getNil() : runtime.newString(message); + } + + private static ObjectAllocator EXCEPTION_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + RubyException instance = new RubyException(runtime, klass); + + // for future compatibility as constructors move toward not accepting metaclass? + instance.setMetaClass(klass); + + return instance; + } + }; + + private static final ObjectMarshal EXCEPTION_MARSHAL = new ObjectMarshal() { + public void marshalTo(Ruby runtime, Object obj, RubyClass type, + MarshalStream marshalStream) throws IOException { + RubyException exc = (RubyException)obj; + + marshalStream.registerLinkTarget(exc); + List<Variable<IRubyObject>> attrs = exc.getVariableList(); + attrs.add(new VariableEntry<IRubyObject>( + "mesg", exc.message == null ? runtime.getNil() : exc.message)); + attrs.add(new VariableEntry<IRubyObject>("bt", exc.getBacktrace())); + marshalStream.dumpVariables(attrs); + } + + public Object unmarshalFrom(Ruby runtime, RubyClass type, + UnmarshalStream unmarshalStream) throws IOException { + RubyException exc = (RubyException)type.allocate(); + + unmarshalStream.registerLinkTarget(exc); + unmarshalStream.defaultVariablesUnmarshal(exc); + + exc.message = exc.removeInternalVariable("mesg"); + exc.set_backtrace(exc.removeInternalVariable("bt")); + + return exc; + } + }; + + public static RubyClass createExceptionClass(Ruby runtime) { + RubyClass exceptionClass = runtime.defineClass("Exception", runtime.getObject(), EXCEPTION_ALLOCATOR); + runtime.setException(exceptionClass); + + exceptionClass.setMarshal(EXCEPTION_MARSHAL); + exceptionClass.defineAnnotatedMethods(RubyException.class); + + return exceptionClass; + } + + public static RubyException newException(Ruby runtime, RubyClass excptnClass, String msg) { + return new RubyException(runtime, excptnClass, msg); + } + + public void setBacktraceFrames(StackTraceElement[] backtraceFrames) { + this.backtraceFrames = backtraceFrames; + if (TRACE_TYPE == RAW || + TRACE_TYPE == RAW_FILTERED || + TRACE_TYPE == RUBY_COMPILED || + TRACE_TYPE == RUBY_HYBRID) { + javaStackTrace = Thread.currentThread().getStackTrace(); + } + } + + public static final int RAW = 0; + public static final int RAW_FILTERED = 1; + public static final int RUBY_FRAMED = 2; + public static final int RUBY_COMPILED = 3; + public static final int RUBY_HYBRID = 4; + + public static final int TRACE_TYPE; + + static { + String style = SafePropertyAccessor.getProperty("jruby.backtrace.style", "ruby_framed").toLowerCase(); + + if (style.equals("raw")) TRACE_TYPE = RAW; + else if (style.equals("raw_filtered")) TRACE_TYPE = RAW_FILTERED; + else if (style.equals("ruby_framed")) TRACE_TYPE = RUBY_FRAMED; + else if (style.equals("ruby_compiled")) TRACE_TYPE = RUBY_COMPILED; + else if (style.equals("ruby_hybrid")) TRACE_TYPE = RUBY_HYBRID; + else TRACE_TYPE = RUBY_FRAMED; + } + + public IRubyObject getBacktrace() { + if (backtrace == null) { + initBacktrace(); + } + return backtrace; + } + + public void initBacktrace() { + switch (TRACE_TYPE) { + case RAW: + backtrace = ThreadContext.createRawBacktrace(getRuntime(), javaStackTrace, false); + break; + case RAW_FILTERED: + backtrace = ThreadContext.createRawBacktrace(getRuntime(), javaStackTrace, true); + break; + case RUBY_FRAMED: + backtrace = backtraceFrames == null ? getRuntime().getNil() : ThreadContext.createBacktraceFromFrames(getRuntime(), backtraceFrames); + break; + case RUBY_COMPILED: + backtrace = ThreadContext.createRubyCompiledBacktrace(getRuntime(), javaStackTrace); + break; + case RUBY_HYBRID: + backtrace = ThreadContext.createRubyHybridBacktrace(getRuntime(), backtraceFrames, javaStackTrace, getRuntime().getDebug().isTrue()); + break; + } + } + + @JRubyMethod(optional = 2, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, Block block) { + if (args.length == 1) message = args[0]; + return this; + } + + @JRubyMethod + public IRubyObject backtrace() { + return getBacktrace(); + } + + @JRubyMethod(required = 1) + public IRubyObject set_backtrace(IRubyObject obj) { + if (obj.isNil()) { + backtrace = null; + } else if (!isArrayOfStrings(obj)) { + throw getRuntime().newTypeError("backtrace must be Array of String"); + } else { + backtrace = (RubyArray) obj; + } + return backtrace(); + } + + @JRubyMethod(name = "exception", optional = 1, rest = true, meta = true) + public static IRubyObject exception(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + return ((RubyClass) recv).newInstance(context, args, block); + } + + @JRubyMethod(optional = 1) + public RubyException exception(IRubyObject[] args) { + switch (args.length) { + case 0 : + return this; + case 1 : + if(args[0] == this) { + return this; + } + RubyException ret = (RubyException)rbClone(); + ret.initialize(args, Block.NULL_BLOCK); // This looks wrong, but it's the way MRI does it. + return ret; + default : + throw getRuntime().newArgumentError("Wrong argument count"); + } + } + + @JRubyMethod + public IRubyObject to_s() { + if (message.isNil()) return getRuntime().newString(getMetaClass().getName()); + message.setTaint(isTaint()); + return message; + } + + @JRubyMethod(name = {"to_str", "message"}) + public IRubyObject to_str(ThreadContext context) { + return callMethod(context, MethodIndex.TO_S, "to_s"); + } + + /** inspects an object and return a kind of debug information + * + *@return A RubyString containing the debug information. + */ + @JRubyMethod + public IRubyObject inspect(ThreadContext context) { + RubyModule rubyClass = getMetaClass(); + RubyString exception = RubyString.objAsString(context, this); + + if (exception.getByteList().realSize == 0) return getRuntime().newString(rubyClass.getName()); + StringBuilder sb = new StringBuilder("#<"); + sb.append(rubyClass.getName()).append(": ").append(exception.getByteList()).append(">"); + return getRuntime().newString(sb.toString()); + } + + public void printBacktrace(PrintStream errorStream) { + IRubyObject backtrace = callMethod(getRuntime().getCurrentContext(), "backtrace"); + boolean debug = getRuntime().getDebug().isTrue(); + if (!backtrace.isNil() && backtrace instanceof RubyArray) { + IRubyObject[] elements = backtrace.convertToArray().toJavaArray(); + + for (int i = 1; i < elements.length; i++) { + IRubyObject stackTraceLine = elements[i]; + if (stackTraceLine instanceof RubyString) { + printStackTraceLine(errorStream, stackTraceLine); + } + + if (!debug && i == RubyException.TRACE_HEAD && elements.length > RubyException.TRACE_MAX) { + int hiddenLevels = elements.length - RubyException.TRACE_HEAD - RubyException.TRACE_TAIL; + errorStream.print("\t ... " + hiddenLevels + " levels...\n"); + i = elements.length - RubyException.TRACE_TAIL; + } + } + } + } + + private void printStackTraceLine(PrintStream errorStream, IRubyObject stackTraceLine) { + errorStream.print("\tfrom " + stackTraceLine + '\n'); + } + + private boolean isArrayOfStrings(IRubyObject backtrace) { + if (!(backtrace instanceof RubyArray)) return false; + + IRubyObject[] elements = ((RubyArray) backtrace).toJavaArray(); + + for (int i = 0 ; i < elements.length ; i++) { + if (!(elements[i] instanceof RubyString)) return false; + } + + return true; + } +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2003 Joey Gibson <joey@joeygibson.com> + * Copyright (C) 2004-2007 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2007 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.util.io.OpenFile; +import org.jruby.util.io.ChannelDescriptor; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.ext.posix.util.Platform; +import org.jruby.runtime.Block; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.io.DirectoryAsFileException; +import org.jruby.util.io.Stream; +import org.jruby.util.io.ChannelStream; +import org.jruby.util.io.ModeFlags; +import org.jruby.util.JRubyFile; +import org.jruby.util.TypeConverter; +import org.jruby.util.io.BadDescriptorException; +import org.jruby.util.io.FileExistsException; +import org.jruby.util.io.InvalidValueException; +import org.jruby.util.io.PipeException; + +/** + * Ruby File class equivalent in java. + **/ +@JRubyClass(name="File", parent="IO", include="FileTest") +public class RubyFile extends RubyIO { + private static final long serialVersionUID = 1L; + + public static final int LOCK_SH = 1; + public static final int LOCK_EX = 2; + public static final int LOCK_NB = 4; + public static final int LOCK_UN = 8; + + private static final int FNM_NOESCAPE = 1; + private static final int FNM_PATHNAME = 2; + private static final int FNM_DOTMATCH = 4; + private static final int FNM_CASEFOLD = 8; + private static final int FNM_SYSCASE; + + static { + if (Platform.IS_WINDOWS) { + FNM_SYSCASE = FNM_CASEFOLD; + } else { + FNM_SYSCASE = 0; + } + } + + private static boolean startsWithDriveLetterOnWindows(String path) { + return (path != null) + && Platform.IS_WINDOWS && + ((path.length()>1 && path.charAt(0) == '/') ? + (path.length() > 2 + && isWindowsDriveLetter(path.charAt(1)) + && path.charAt(2) == ':') : + (path.length() > 1 + && isWindowsDriveLetter(path.charAt(0)) + && path.charAt(1) == ':')); + } + // adjusts paths started with '/' or '\\', on windows. + static String adjustRootPathOnWindows(Ruby runtime, String path, String dir) { + if (path == null) return path; + if (Platform.IS_WINDOWS) { + // MRI behavior on Windows: it treats '/' as a root of + // a current drive (but only if SINGLE slash is present!): + // E.g., if current work directory is + // 'D:/home/directory', then '/' means 'D:/'. + // + // Basically, '/path' is treated as a *RELATIVE* path, + // relative to the current drive. '//path' is treated + // as absolute one. + if ((path.startsWith("/") && !(path.length()>2 && path.charAt(2) == ':')) || path.startsWith("\\")) { + if (path.length() > 1 && (path.charAt(1) == '/' || path.charAt(1) == '\\')) { + return path; + } + + // First try to use drive letter from supplied dir value, + // then try current work dir. + if (!startsWithDriveLetterOnWindows(dir)) { + dir = runtime.getCurrentDirectory(); + } + if (dir.length() >= 2) { + path = dir.substring(0, 2) + path; + } + } else if (startsWithDriveLetterOnWindows(path) && path.length() == 2) { + // compensate for missing slash after drive letter on windows + path += "/"; + } + } + return path; + } + + protected String path; + private FileLock currentLock; + + public RubyFile(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + // XXX This constructor is a hack to implement the __END__ syntax. + // Converting a reader back into an InputStream doesn't generally work. + public RubyFile(Ruby runtime, String path, final Reader reader) { + this(runtime, path, new InputStream() { + public int read() throws IOException { + return reader.read(); + } + }); + } + + public RubyFile(Ruby runtime, String path, InputStream in) { + super(runtime, runtime.getFile()); + this.path = path; + try { + this.openFile.setMainStream(new ChannelStream(runtime, new ChannelDescriptor(Channels.newChannel(in), getNewFileno(), new FileDescriptor()))); + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } + this.openFile.setMode(openFile.getMainStream().getModes().getOpenFileFlags()); + registerDescriptor(openFile.getMainStream().getDescriptor()); + } + + private static ObjectAllocator FILE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + RubyFile instance = new RubyFile(runtime, klass); + + instance.setMetaClass(klass); + + return instance; + } + }; + + @JRubyModule(name="File::Constants") + public static class Constants {} + + public static RubyClass createFileClass(Ruby runtime) { + RubyClass fileClass = runtime.defineClass("File", runtime.getIO(), FILE_ALLOCATOR); + runtime.setFile(fileClass); + RubyString separator = runtime.newString("/"); + ThreadContext context = runtime.getCurrentContext(); + + fileClass.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyFile; + } + }; + + separator.freeze(context); + fileClass.defineConstant("SEPARATOR", separator); + fileClass.defineConstant("Separator", separator); + + if (File.separatorChar == '\\') { + RubyString altSeparator = runtime.newString("\\"); + altSeparator.freeze(context); + fileClass.defineConstant("ALT_SEPARATOR", altSeparator); + } else { + fileClass.defineConstant("ALT_SEPARATOR", runtime.getNil()); + } + + RubyString pathSeparator = runtime.newString(File.pathSeparator); + pathSeparator.freeze(context); + fileClass.defineConstant("PATH_SEPARATOR", pathSeparator); + + // TODO: why are we duplicating the constants here, and then in + // File::Constants below? File::Constants is included in IO. + + // TODO: These were missing, so we're not handling them elsewhere? + // FIXME: The old value, 32786, didn't match what IOModes expected, so I reference + // the constant here. THIS MAY NOT BE THE CORRECT VALUE. + fileClass.fastSetConstant("BINARY", runtime.newFixnum(ModeFlags.BINARY)); + fileClass.fastSetConstant("FNM_NOESCAPE", runtime.newFixnum(FNM_NOESCAPE)); + fileClass.fastSetConstant("FNM_CASEFOLD", runtime.newFixnum(FNM_CASEFOLD)); + fileClass.fastSetConstant("FNM_SYSCASE", runtime.newFixnum(FNM_SYSCASE)); + fileClass.fastSetConstant("FNM_DOTMATCH", runtime.newFixnum(FNM_DOTMATCH)); + fileClass.fastSetConstant("FNM_PATHNAME", runtime.newFixnum(FNM_PATHNAME)); + + // Create constants for open flags + fileClass.fastSetConstant("RDONLY", runtime.newFixnum(ModeFlags.RDONLY)); + fileClass.fastSetConstant("WRONLY", runtime.newFixnum(ModeFlags.WRONLY)); + fileClass.fastSetConstant("RDWR", runtime.newFixnum(ModeFlags.RDWR)); + fileClass.fastSetConstant("CREAT", runtime.newFixnum(ModeFlags.CREAT)); + fileClass.fastSetConstant("EXCL", runtime.newFixnum(ModeFlags.EXCL)); + fileClass.fastSetConstant("NOCTTY", runtime.newFixnum(ModeFlags.NOCTTY)); + fileClass.fastSetConstant("TRUNC", runtime.newFixnum(ModeFlags.TRUNC)); + fileClass.fastSetConstant("APPEND", runtime.newFixnum(ModeFlags.APPEND)); + fileClass.fastSetConstant("NONBLOCK", runtime.newFixnum(ModeFlags.NONBLOCK)); + + // Create constants for flock + fileClass.fastSetConstant("LOCK_SH", runtime.newFixnum(RubyFile.LOCK_SH)); + fileClass.fastSetConstant("LOCK_EX", runtime.newFixnum(RubyFile.LOCK_EX)); + fileClass.fastSetConstant("LOCK_NB", runtime.newFixnum(RubyFile.LOCK_NB)); + fileClass.fastSetConstant("LOCK_UN", runtime.newFixnum(RubyFile.LOCK_UN)); + + // Create Constants class + RubyModule constants = fileClass.defineModuleUnder("Constants"); + + // TODO: These were missing, so we're not handling them elsewhere? + constants.fastSetConstant("BINARY", runtime.newFixnum(ModeFlags.BINARY)); + constants.fastSetConstant("SYNC", runtime.newFixnum(0x1000)); + constants.fastSetConstant("FNM_NOESCAPE", runtime.newFixnum(FNM_NOESCAPE)); + constants.fastSetConstant("FNM_CASEFOLD", runtime.newFixnum(FNM_CASEFOLD)); + constants.fastSetConstant("FNM_SYSCASE", runtime.newFixnum(FNM_SYSCASE)); + constants.fastSetConstant("FNM_DOTMATCH", runtime.newFixnum(FNM_DOTMATCH)); + constants.fastSetConstant("FNM_PATHNAME", runtime.newFixnum(FNM_PATHNAME)); + + // Create constants for open flags + constants.fastSetConstant("RDONLY", runtime.newFixnum(ModeFlags.RDONLY)); + constants.fastSetConstant("WRONLY", runtime.newFixnum(ModeFlags.WRONLY)); + constants.fastSetConstant("RDWR", runtime.newFixnum(ModeFlags.RDWR)); + constants.fastSetConstant("CREAT", runtime.newFixnum(ModeFlags.CREAT)); + constants.fastSetConstant("EXCL", runtime.newFixnum(ModeFlags.EXCL)); + constants.fastSetConstant("NOCTTY", runtime.newFixnum(ModeFlags.NOCTTY)); + constants.fastSetConstant("TRUNC", runtime.newFixnum(ModeFlags.TRUNC)); + constants.fastSetConstant("APPEND", runtime.newFixnum(ModeFlags.APPEND)); + constants.fastSetConstant("NONBLOCK", runtime.newFixnum(ModeFlags.NONBLOCK)); + + // Create constants for flock + constants.fastSetConstant("LOCK_SH", runtime.newFixnum(RubyFile.LOCK_SH)); + constants.fastSetConstant("LOCK_EX", runtime.newFixnum(RubyFile.LOCK_EX)); + constants.fastSetConstant("LOCK_NB", runtime.newFixnum(RubyFile.LOCK_NB)); + constants.fastSetConstant("LOCK_UN", runtime.newFixnum(RubyFile.LOCK_UN)); + + // File::Constants module is included in IO. + runtime.getIO().includeModule(constants); + + runtime.getFileTest().extend_object(fileClass); + + fileClass.defineAnnotatedMethods(RubyFile.class); + + return fileClass; + } + + @JRubyMethod + @Override + public IRubyObject close() { + // Make sure any existing lock is released before we try and close the file + if (currentLock != null) { + try { + currentLock.release(); + } catch (IOException e) { + throw getRuntime().newIOError(e.getMessage()); + } + } + return super.close(); + } + + @JRubyMethod(required = 1) + public IRubyObject flock(ThreadContext context, IRubyObject lockingConstant) { + // TODO: port exact behavior from MRI, and move most locking logic into ChannelDescriptor + // TODO: for all LOCK_NB cases, return false if they would block + ChannelDescriptor descriptor = openFile.getMainStream().getDescriptor(); + + // null channel always succeeds for all locking operations + if (descriptor.isNull()) return RubyFixnum.zero(context.getRuntime()); + + FileChannel fileChannel = (FileChannel)descriptor.getChannel(); + int lockMode = RubyNumeric.num2int(lockingConstant); + + // Exclusive locks in Java require the channel to be writable, otherwise + // an exception is thrown (terminating JRuby execution). + // But flock behavior of MRI is that it allows + // exclusive locks even on non-writable file. So we convert exclusive + // lock to shared lock if the channel is not writable, to better match + // the MRI behavior. + if (!openFile.isWritable() && (lockMode & LOCK_EX) > 0) { + lockMode = (lockMode ^ LOCK_EX) | LOCK_SH; + } + + try { + switch (lockMode) { + case LOCK_UN: + case LOCK_UN | LOCK_NB: + if (currentLock != null) { + currentLock.release(); + currentLock = null; + + return RubyFixnum.zero(context.getRuntime()); + } + break; + case LOCK_EX: + if (currentLock != null) { + currentLock.release(); + currentLock = null; + } + currentLock = fileChannel.lock(); + if (currentLock != null) { + return RubyFixnum.zero(context.getRuntime()); + } + + break; + case LOCK_EX | LOCK_NB: + if (currentLock != null) { + currentLock.release(); + currentLock = null; + } + currentLock = fileChannel.tryLock(); + if (currentLock != null) { + return RubyFixnum.zero(context.getRuntime()); + } + + break; + case LOCK_SH: + if (currentLock != null) { + currentLock.release(); + currentLock = null; + } + + currentLock = fileChannel.lock(0L, Long.MAX_VALUE, true); + if (currentLock != null) { + return RubyFixnum.zero(context.getRuntime()); + } + + break; + case LOCK_SH | LOCK_NB: + if (currentLock != null) { + currentLock.release(); + currentLock = null; + } + + currentLock = fileChannel.tryLock(0L, Long.MAX_VALUE, true); + if (currentLock != null) { + return RubyFixnum.zero(context.getRuntime()); + } + + break; + default: + } + } catch (IOException ioe) { + if (context.getRuntime().getDebug().isTrue()) { + ioe.printStackTrace(System.err); + } + // Return false here + } catch (java.nio.channels.OverlappingFileLockException ioe) { + if (context.getRuntime().getDebug().isTrue()) { + ioe.printStackTrace(System.err); + } + // Return false here + } + + return context.getRuntime().getFalse(); + } + + @JRubyMethod(required = 1, optional = 2, frame = true, visibility = Visibility.PRIVATE) + @Override + public IRubyObject initialize(IRubyObject[] args, Block block) { + if (openFile == null) { + throw getRuntime().newRuntimeError("reinitializing File"); + } + + if (args.length > 0 && args.length < 3) { + IRubyObject fd = TypeConverter.convertToTypeWithCheck(args[0], getRuntime().getFixnum(), MethodIndex.TO_INT, "to_int"); + if (!fd.isNil()) { + args[0] = fd; + return super.initialize(args, block); + } + } + + return openFile(args); + } + + private IRubyObject openFile(IRubyObject args[]) { + IRubyObject filename = args[0].convertToString(); + getRuntime().checkSafeString(filename); + + path = filename.convertToString().getUnicodeValue(); + + String modeString; + ModeFlags modes; + int perm; + + try { + if ((args.length > 1 && args[1] instanceof RubyFixnum) || (args.length > 2 && !args[2].isNil())) { + if (args[1] instanceof RubyFixnum) { + modes = new ModeFlags(RubyNumeric.num2int(args[1])); + } else { + modeString = args[1].convertToString().toString(); + modes = getIOModes(getRuntime(), modeString); + } + if (args.length > 2 && !args[2].isNil()) { + perm = RubyNumeric.num2int(args[2]); + } else { + perm = 438; // 0666 + } + + sysopenInternal(path, modes, perm); + } else { + modeString = "r"; + if (args.length > 1) { + if (!args[1].isNil()) { + modeString = args[1].convertToString().toString(); + } + } + openInternal(path, modeString); + } + } catch (InvalidValueException ex) { + throw getRuntime().newErrnoEINVALError(); + } finally {} + + return this; + } + + private void sysopenInternal(String path, ModeFlags modes, int perm) throws InvalidValueException { + openFile = new OpenFile(); + + openFile.setPath(path); + openFile.setMode(modes.getOpenFileFlags()); + + ChannelDescriptor descriptor = sysopen(path, modes, perm); + openFile.setMainStream(fdopen(descriptor, modes)); + + registerDescriptor(descriptor); + } + + private void openInternal(String path, String modeString) throws InvalidValueException { + openFile = new OpenFile(); + + openFile.setMode(getIOModes(getRuntime(), modeString).getOpenFileFlags()); + openFile.setPath(path); + openFile.setMainStream(fopen(path, modeString)); + + registerDescriptor(openFile.getMainStream().getDescriptor()); + } + + private ChannelDescriptor sysopen(String path, ModeFlags modes, int perm) throws InvalidValueException { + try { + ChannelDescriptor descriptor = ChannelDescriptor.open( + getRuntime().getCurrentDirectory(), + path, + modes, + perm, + getRuntime().getPosix()); + + // TODO: check if too many open files, GC and try again + + return descriptor; + } catch (FileNotFoundException fnfe) { + throw getRuntime().newErrnoENOENTError(); + } catch (DirectoryAsFileException dafe) { + throw getRuntime().newErrnoEISDirError(); + } catch (FileExistsException fee) { + throw getRuntime().newErrnoEEXISTError("file exists: " + path); + } catch (IOException ioe) { + throw getRuntime().newIOErrorFromException(ioe); + } + } + + private Stream fopen(String path, String modeString) { + try { + Stream stream = ChannelStream.fopen( + getRuntime(), + path, + getIOModes(getRuntime(), modeString)); + + if (stream == null) { + // TODO + // if (errno == EMFILE || errno == ENFILE) { + // rb_gc(); + // file = fopen(fname, mode); + // } + // if (!file) { + // rb_sys_fail(fname); + // } + } + + // Do we need to be in SETVBUF mode for buffering to make sense? This comes up elsewhere. + // #ifdef USE_SETVBUF + // if (setvbuf(file, NULL, _IOFBF, 0) != 0) + // rb_warn("setvbuf() can't be honoured for %s", fname); + // #endif + // #ifdef __human68k__ + // fmode(file, _IOTEXT); + // #endif + return stream; + } catch (BadDescriptorException e) { + throw getRuntime().newErrnoEBADFError(); + } catch (FileNotFoundException ex) { + // FNFException can be thrown in both cases, when the file + // is not found, or when permission is denied. + if (Ruby.isSecurityRestricted() || new File(path).exists()) { + throw getRuntime().newErrnoEACCESError( + "Permission denied - " + path); + } + throw getRuntime().newErrnoENOENTError( + "File not found - " + path); + } catch (DirectoryAsFileException ex) { + throw getRuntime().newErrnoEISDirError(); + } catch (FileExistsException ex) { + throw getRuntime().newErrnoEEXISTError(path); + } catch (IOException ex) { + throw getRuntime().newIOErrorFromException(ex); + } catch (InvalidValueException ex) { + throw getRuntime().newErrnoEINVALError(); + } catch (PipeException ex) { + throw getRuntime().newErrnoEPIPEError(); + } + } + + @JRubyMethod(required = 1) + public IRubyObject chmod(ThreadContext context, IRubyObject arg) { + int mode = (int) arg.convertToInteger().getLongValue(); + + if (!new File(path).exists()) { + throw context.getRuntime().newErrnoENOENTError("No such file or directory - " + path); + } + + return context.getRuntime().newFixnum(context.getRuntime().getPosix().chmod(path, mode)); + } + + @JRubyMethod(required = 2) + public IRubyObject chown(ThreadContext context, IRubyObject arg1, IRubyObject arg2) { + int owner = -1; + if (!arg1.isNil()) { + owner = RubyNumeric.num2int(arg1); + } + + int group = -1; + if (!arg2.isNil()) { + group = RubyNumeric.num2int(arg2); + } + + if (!new File(path).exists()) { + throw context.getRuntime().newErrnoENOENTError("No such file or directory - " + path); + } + + return context.getRuntime().newFixnum(context.getRuntime().getPosix().chown(path, owner, group)); + } + + @JRubyMethod + public IRubyObject atime(ThreadContext context) { + return context.getRuntime().newFileStat(path, false).atime(); + } + + @JRubyMethod + public IRubyObject ctime(ThreadContext context) { + return context.getRuntime().newFileStat(path, false).ctime(); + } + + @JRubyMethod(required = 1) + public IRubyObject lchmod(ThreadContext context, IRubyObject arg) { + int mode = (int) arg.convertToInteger().getLongValue(); + + if (!new File(path).exists()) { + throw context.getRuntime().newErrnoENOENTError("No such file or directory - " + path); + } + + return context.getRuntime().newFixnum(context.getRuntime().getPosix().lchmod(path, mode)); + } + + // TODO: this method is not present in MRI! + @JRubyMethod(required = 2) + public IRubyObject lchown(ThreadContext context, IRubyObject arg1, IRubyObject arg2) { + int owner = -1; + if (!arg1.isNil()) { + owner = RubyNumeric.num2int(arg1); + } + + int group = -1; + if (!arg2.isNil()) { + group = RubyNumeric.num2int(arg2); + } + + if (!new File(path).exists()) { + throw context.getRuntime().newErrnoENOENTError("No such file or directory - " + path); + } + + return context.getRuntime().newFixnum(context.getRuntime().getPosix().lchown(path, owner, group)); + } + + @JRubyMethod + public IRubyObject lstat(ThreadContext context) { + return context.getRuntime().newFileStat(path, true); + } + + @JRubyMethod + public IRubyObject mtime(ThreadContext context) { + return getLastModified(context.getRuntime(), path); + } + + @JRubyMethod + public RubyString path(ThreadContext context) { + return context.getRuntime().newString(path); + } + + @JRubyMethod + @Override + public IRubyObject stat(ThreadContext context) { + openFile.checkClosed(context.getRuntime()); + return context.getRuntime().newFileStat(path, false); + } + + @JRubyMethod(required = 1) + public IRubyObject truncate(ThreadContext context, IRubyObject arg) { + RubyInteger newLength = arg.convertToInteger(); + if (newLength.getLongValue() < 0) { + throw context.getRuntime().newErrnoEINVALError("invalid argument: " + path); + } + try { + openFile.checkWritable(context.getRuntime()); + openFile.getMainStream().ftruncate(newLength.getLongValue()); + } catch (BadDescriptorException e) { + throw context.getRuntime().newErrnoEBADFError(); + } catch (PipeException e) { + throw context.getRuntime().newErrnoESPIPEError(); + } catch (InvalidValueException ex) { + throw context.getRuntime().newErrnoEINVALError(); + } catch (IOException e) { + // Should we do anything? + } + + return RubyFixnum.zero(context.getRuntime()); + } + + @Override + public String toString() { + return "RubyFile(" + path + ", " + openFile.getMode() + ", " + openFile.getMainStream().getDescriptor().getFileno() + ")"; + } + + // TODO: This is also defined in the MetaClass too...Consolidate somewhere. + private static ModeFlags getModes(Ruby runtime, IRubyObject object) throws InvalidValueException { + if (object instanceof RubyString) { + return getIOModes(runtime, ((RubyString) object).toString()); + } else if (object instanceof RubyFixnum) { + return new ModeFlags(((RubyFixnum) object).getLongValue()); + } + + throw runtime.newTypeError("Invalid type for modes"); + } + + @JRubyMethod + @Override + public IRubyObject inspect() { + StringBuilder val = new StringBuilder(); + val.append("#<File:").append(path); + if(!openFile.isOpen()) { + val.append(" (closed)"); + } + val.append(">"); + return getRuntime().newString(val.toString()); + } + + /* File class methods */ + + @JRubyMethod(required = 1, optional = 1, meta = true) + public static IRubyObject basename(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + String name = RubyString.stringValue(args[0]).toString(); + + // MRI-compatible basename handling for windows drive letter paths + if (Platform.IS_WINDOWS) { + if (name.length() > 1 && name.charAt(1) == ':' && Character.isLetter(name.charAt(0))) { + switch (name.length()) { + case 2: + return RubyString.newEmptyString(context.getRuntime()).infectBy(args[0]); + case 3: + return context.getRuntime().newString(name.substring(2)).infectBy(args[0]); + default: + switch (name.charAt(2)) { + case '/': + case '\\': + break; + default: + // strip c: away from relative-pathed name + name = name.substring(2); + break; + } + break; + } + } + } + + while (name.length() > 1 && name.charAt(name.length() - 1) == '/') { + name = name.substring(0, name.length() - 1); + } + + // Paths which end in "/" or "\\" must be stripped off. + int slashCount = 0; + int length = name.length(); + for (int i = length - 1; i >= 0; i--) { + char c = name.charAt(i); + if (c != '/' && c != '\\') { + break; + } + slashCount++; + } + if (slashCount > 0 && length > 1) { + name = name.substring(0, name.length() - slashCount); + } + + int index = name.lastIndexOf('/'); + if (index == -1) { + // XXX actually only on windows... + index = name.lastIndexOf('\\'); + } + + if (!name.equals("/") && index != -1) { + name = name.substring(index + 1); + } + + if (args.length == 2) { + String ext = RubyString.stringValue(args[1]).toString(); + if (".*".equals(ext)) { + index = name.lastIndexOf('.'); + if (index > 0) { // -1 no match; 0 it is dot file not extension + name = name.substring(0, index); + } + } else if (name.endsWith(ext)) { + name = name.substring(0, name.length() - ext.length()); + } + } + return context.getRuntime().newString(name).infectBy(args[0]); + } + + @JRubyMethod(required = 2, rest = true, meta = true) + public static IRubyObject chmod(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + int count = 0; + RubyInteger mode = args[0].convertToInteger(); + for (int i = 1; i < args.length; i++) { + IRubyObject filename = args[i]; + + if (!RubyFileTest.exist_p(filename, filename.convertToString()).isTrue()) { + throw runtime.newErrnoENOENTError("No such file or directory - " + filename); + } + + boolean result = 0 == runtime.getPosix().chmod(filename.toString(), (int)mode.getLongValue()); + if (result) { + count++; + } + } + + return runtime.newFixnum(count); + } + + @JRubyMethod(required = 3, rest = true, meta = true) + public static IRubyObject chown(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + int count = 0; + int owner = -1; + if (!args[0].isNil()) { + owner = RubyNumeric.num2int(args[0]); + } + + int group = -1; + if (!args[1].isNil()) { + group = RubyNumeric.num2int(args[1]); + } + for (int i = 2; i < args.length; i++) { + IRubyObject filename = args[i]; + + if (!RubyFileTest.exist_p(filename, filename.convertToString()).isTrue()) { + throw runtime.newErrnoENOENTError("No such file or directory - " + filename); + } + + boolean result = 0 == runtime.getPosix().chown(filename.toString(), owner, group); + if (result) { + count++; + } + } + + return runtime.newFixnum(count); + } + + @JRubyMethod(required = 1, meta = true) + public static IRubyObject dirname(ThreadContext context, IRubyObject recv, IRubyObject arg) { + RubyString filename = RubyString.stringValue(arg); + String jfilename = filename.toString(); + String name = jfilename.replace('\\', '/'); + int minPathLength = 1; + boolean trimmedSlashes = false; + + boolean startsWithDriveLetterOnWindows = startsWithDriveLetterOnWindows(name); + + if (startsWithDriveLetterOnWindows) { + minPathLength = 3; + } + + while (name.length() > minPathLength && name.charAt(name.length() - 1) == '/') { + trimmedSlashes = true; + name = name.substring(0, name.length() - 1); + } + + String result; + if (startsWithDriveLetterOnWindows && name.length() == 2) { + if (trimmedSlashes) { + // C:\ is returned unchanged + result = jfilename.substring(0, 3); + } else { + result = jfilename.substring(0, 2) + '.'; + } + } else { + //TODO deal with UNC names + int index = name.lastIndexOf('/'); + if (index == -1) { + if (startsWithDriveLetterOnWindows) { + return context.getRuntime().newString(jfilename.substring(0, 2) + "."); + } else { + return context.getRuntime().newString("."); + } + } + if (index == 0) return context.getRuntime().newString("/"); + + if (startsWithDriveLetterOnWindows && index == 2) { + // Include additional path separator + // (so that dirname of "C:\file.txt" is "C:\", not "C:") + index++; + } + + result = jfilename.substring(0, index); + } + + char endChar; + // trim trailing slashes + while (result.length() > minPathLength) { + endChar = result.charAt(result.length() - 1); + if (endChar == '/' || endChar == '\\') { + result = result.substring(0, result.length() - 1); + } else { + break; + } + } + + return context.getRuntime().newString(result).infectBy(filename); + } + + private static boolean isWindowsDriveLetter(char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + } + + + /** + * Returns the extension name of the file. An empty string is returned if + * the filename (not the entire path) starts or ends with a dot. + * @param recv + * @param arg Path to get extension name of + * @return Extension, including the dot, or an empty string + */ + @JRubyMethod(required = 1, meta = true) + public static IRubyObject extname(ThreadContext context, IRubyObject recv, IRubyObject arg) { + IRubyObject baseFilename = basename(context, recv, new IRubyObject[]{arg}); + String filename = RubyString.stringValue(baseFilename).toString(); + String result = ""; + + int dotIndex = filename.lastIndexOf("."); + if (dotIndex > 0 && dotIndex != (filename.length() - 1)) { + // Dot is not at beginning and not at end of filename. + result = filename.substring(dotIndex); + } + + return context.getRuntime().newString(result); + } + + /** + * Converts a pathname to an absolute pathname. Relative paths are + * referenced from the current working directory of the process unless + * a second argument is given, in which case it will be used as the + * starting point. If the second argument is also relative, it will + * first be converted to an absolute pathname. + * @param recv + * @param args + * @return Resulting absolute path as a String + */ + @JRubyMethod(required = 1, optional = 1, meta = true) + public static IRubyObject expand_path(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + String relativePath = RubyString.stringValue(args[0]).toString(); + + boolean isAbsoluteWithFilePrefix = relativePath.startsWith("file:"); + + String cwd = null; + + // Handle ~user paths + relativePath = expandUserPath(context, relativePath); + + // If there's a second argument, it's the path to which the first + // argument is relative. + if (args.length == 2 && !args[1].isNil()) { + + String cwdArg = RubyString.stringValue(args[1]).toString(); + + // Handle ~user paths. + cwd = expandUserPath(context, cwdArg); + + cwd = adjustRootPathOnWindows(runtime, cwd, null); + + boolean startsWithSlashNotOnWindows = (cwd != null) + && !Platform.IS_WINDOWS && cwd.length() > 0 + && cwd.charAt(0) == '/'; + + // TODO: better detection when path is absolute or not. + // If the path isn't absolute, then prepend the current working + // directory to the path. + if (!startsWithSlashNotOnWindows && !startsWithDriveLetterOnWindows(cwd)) { + cwd = new File(runtime.getCurrentDirectory(), cwd).getAbsolutePath(); + } + } else { + // If there's no second argument, simply use the working directory + // of the runtime. + cwd = runtime.getCurrentDirectory(); + } + + // Something wrong we don't know the cwd... + // TODO: Is this behavior really desirable? /mov + if (cwd == null) return runtime.getNil(); + + /* The counting of slashes that follows is simply a way to adhere to + * Ruby's UNC (or something) compatibility. When Ruby's expand_path is + * called with "//foo//bar" it will return "//foo/bar". JRuby uses + * java.io.File, and hence returns "/foo/bar". In order to retain + * java.io.File in the lower layers and provide full Ruby + * compatibility, the number of extra slashes must be counted and + * prepended to the result. + */ + + // TODO: special handling on windows for some corner cases +// if (IS_WINDOWS) { +// if (relativePath.startsWith("//")) { +// if (relativePath.length() > 2 && relativePath.charAt(2) != '/') { +// int nextSlash = relativePath.indexOf('/', 3); +// if (nextSlash != -1) { +// return runtime.newString( +// relativePath.substring(0, nextSlash) +// + canonicalize(relativePath.substring(nextSlash))); +// } else { +// return runtime.newString(relativePath); +// } +// } +// } +// } + + // Find out which string to check. + String padSlashes = ""; + if (!Platform.IS_WINDOWS) { + if (relativePath.length() > 0 && relativePath.charAt(0) == '/') { + padSlashes = countSlashes(relativePath); + } else if (cwd.length() > 0 && cwd.charAt(0) == '/') { + padSlashes = countSlashes(cwd); + } + } + + JRubyFile path; + + if (relativePath.length() == 0) { + path = JRubyFile.create(relativePath, cwd); + } else { + relativePath = adjustRootPathOnWindows(runtime, relativePath, cwd); + path = JRubyFile.create(cwd, relativePath); + } + + String tempResult = padSlashes + canonicalize(path.getAbsolutePath()); + + if(isAbsoluteWithFilePrefix) { + tempResult = tempResult.substring(tempResult.indexOf("file:")); + } + + return runtime.newString(tempResult); + } + + /** + * This method checks a path, and if it starts with ~, then it expands + * the path to the absolute path of the user's home directory. If the + * string does not begin with ~, then the string is simply returned. + * unaltered. + * @param recv + * @param path Path to check + * @return Expanded path + */ + public static String expandUserPath(ThreadContext context, String path) { + + int pathLength = path.length(); + + if (pathLength >= 1 && path.charAt(0) == '~') { + // Enebo : Should ~frogger\\foo work (it doesnt in linux ruby)? + int userEnd = path.indexOf('/'); + + if (userEnd == -1) { + if (pathLength == 1) { + // Single '~' as whole path to expand + path = RubyDir.getHomeDirectoryPath(context).toString(); + } else { + // No directory delimeter. Rest of string is username + userEnd = pathLength; + } + } + + if (userEnd == 1) { + // '~/...' as path to expand + path = RubyDir.getHomeDirectoryPath(context).toString() + + path.substring(1); + } else if (userEnd > 1){ + // '~user/...' as path to expand + String user = path.substring(1, userEnd); + IRubyObject dir = RubyDir.getHomeDirectoryPath(context, user); + + if (dir.isNil()) { + throw context.getRuntime().newArgumentError("user " + user + " does not exist"); + } + + path = "" + dir + (pathLength == userEnd ? "" : path.substring(userEnd)); + } + } + return path; + } + + /** + * Returns a string consisting of <code>n-1</code> slashes, where + * <code>n</code> is the number of slashes at the beginning of the input + * string. + * @param stringToCheck + * @return + */ + private static String countSlashes( String stringToCheck ) { + + // Count number of extra slashes in the beginning of the string. + int slashCount = 0; + for (int i = 0; i < stringToCheck.length(); i++) { + if (stringToCheck.charAt(i) == '/') { + slashCount++; + } else { + break; + } + } + + // If there are N slashes, then we want N-1. + if (slashCount > 0) { + slashCount--; + } + + // Prepare a string with the same number of redundant slashes so that + // we easily can prepend it to the result. + byte[] slashes = new byte[slashCount]; + for (int i = 0; i < slashCount; i++) { + slashes[i] = '/'; + } + return new String(slashes); + + } + + private static String canonicalize(String path) { + return canonicalize(null, path); + } + + private static String canonicalize(String canonicalPath, String remaining) { + if (remaining == null) { + if ("".equals(canonicalPath)) { + return "/"; + } else { + // compensate for missing slash after drive letter on windows + if (startsWithDriveLetterOnWindows(canonicalPath) + && canonicalPath.length() == 2) { + canonicalPath += "/"; + } + } + return canonicalPath; + } + + String child; + int slash = remaining.indexOf('/'); + if (slash == -1) { + child = remaining; + remaining = null; + } else { + child = remaining.substring(0, slash); + remaining = remaining.substring(slash + 1); + } + + if (child.equals(".")) { + // skip it + if (canonicalPath != null && canonicalPath.length() == 0 ) canonicalPath += "/"; + } else if (child.equals("..")) { + if (canonicalPath == null) throw new IllegalArgumentException("Cannot have .. at the start of an absolute path"); + int lastDir = canonicalPath.lastIndexOf('/'); + if (lastDir == -1) { + if (startsWithDriveLetterOnWindows(canonicalPath)) { + // do nothing, we should not delete the drive letter + } else { + canonicalPath = ""; + } + } else { + canonicalPath = canonicalPath.substring(0, lastDir); + } + } else if (canonicalPath == null) { + canonicalPath = child; + } else { + canonicalPath += "/" + child; + } + + return canonicalize(canonicalPath, remaining); + } + + /** + * Returns true if path matches against pattern The pattern is not a regular expression; + * instead it follows rules similar to shell filename globbing. It may contain the following + * metacharacters: + * *: Glob - match any sequence chars (re: .*). If like begins with '.' then it doesn't. + * ?: Matches a single char (re: .). + * [set]: Matches a single char in a set (re: [...]). + * + */ + @JRubyMethod(name = {"fnmatch", "fnmatch?"}, required = 2, optional = 1, meta = true) + public static IRubyObject fnmatch(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + int flags = args.length == 3 ? RubyNumeric.num2int(args[2]) : 0; + + ByteList pattern = args[0].convertToString().getByteList(); + ByteList path = args[1].convertToString().getByteList(); + + if (org.jruby.util.Dir.fnmatch(pattern.bytes, pattern.begin, pattern.begin+pattern.realSize, + path.bytes, path.begin, path.begin+path.realSize, flags) == 0) { + return context.getRuntime().getTrue(); + } + return context.getRuntime().getFalse(); + } + + @JRubyMethod(name = "ftype", required = 1, meta = true) + public static IRubyObject ftype(ThreadContext context, IRubyObject recv, IRubyObject filename) { + return context.getRuntime().newFileStat(filename.convertToString().toString(), true).ftype(); + } + + private static String inspectJoin(ThreadContext context, IRubyObject recv, RubyArray parent, RubyArray array) { + Ruby runtime = context.getRuntime(); + + // If already inspecting, there is no need to register/unregister again. + if (runtime.isInspecting(parent)) return join(context, recv, array).toString(); + + try { + runtime.registerInspecting(parent); + return join(context, recv, array).toString(); + } finally { + runtime.unregisterInspecting(parent); + } + } + + private static RubyString join(ThreadContext context, IRubyObject recv, RubyArray ary) { + IRubyObject[] args = ary.toJavaArray(); + boolean isTainted = false; + StringBuilder buffer = new StringBuilder(); + Ruby runtime = context.getRuntime(); + + for (int i = 0; i < args.length; i++) { + if (args[i].isTaint()) { + isTainted = true; + } + String element; + if (args[i] instanceof RubyString) { + element = args[i].toString(); + } else if (args[i] instanceof RubyArray) { + if (runtime.isInspecting(args[i])) { + element = "[...]"; + } else { + element = inspectJoin(context, recv, ary, ((RubyArray)args[i])); + } + } else { + element = args[i].convertToString().toString(); + } + + chomp(buffer); + if (i > 0 && !element.startsWith("/") && !element.startsWith("\\")) { + buffer.append("/"); + } + buffer.append(element); + } + + RubyString fixedStr = RubyString.newString(runtime, buffer.toString()); + fixedStr.setTaint(isTainted); + return fixedStr; + } + + /* + * Fixme: This does not have exact same semantics as RubyArray.join, but they + * probably could be consolidated (perhaps as join(args[], sep, doChomp)). + */ + @JRubyMethod(rest = true, meta = true) + public static RubyString join(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + return join(context, recv, RubyArray.newArrayNoCopyLight(context.getRuntime(), args)); + } + + private static void chomp(StringBuilder buffer) { + int lastIndex = buffer.length() - 1; + + while (lastIndex >= 0 && (buffer.lastIndexOf("/") == lastIndex || buffer.lastIndexOf("\\") == lastIndex)) { + buffer.setLength(lastIndex); + lastIndex--; + } + } + + @JRubyMethod(name = "lstat", required = 1, meta = true) + public static IRubyObject lstat(ThreadContext context, IRubyObject recv, IRubyObject filename) { + String f = filename.convertToString().toString(); + if(f.startsWith("file:") && f.indexOf('!') != -1) { + f = f.substring(5, f.indexOf("!")); + } + return context.getRuntime().newFileStat(f, true); + } + + @JRubyMethod(name = "stat", required = 1, meta = true) + public static IRubyObject stat(ThreadContext context, IRubyObject recv, IRubyObject filename) { + String f = filename.convertToString().toString(); + if(f.startsWith("file:") && f.indexOf('!') != -1) { + f = f.substring(5, f.indexOf("!")); + } + return context.getRuntime().newFileStat(f, false); + } + + @JRubyMethod(name = "atime", required = 1, meta = true) + public static IRubyObject atime(ThreadContext context, IRubyObject recv, IRubyObject filename) { + String f = filename.convertToString().toString(); + if(f.startsWith("file:") && f.indexOf('!') != -1) { + f = f.substring(5, f.indexOf("!")); + } + return context.getRuntime().newFileStat(f, false).atime(); + } + + @JRubyMethod(name = "ctime", required = 1, meta = true) + public static IRubyObject ctime(ThreadContext context, IRubyObject recv, IRubyObject filename) { + String f = filename.convertToString().toString(); + if(f.startsWith("file:") && f.indexOf('!') != -1) { + f = f.substring(5, f.indexOf("!")); + } + return context.getRuntime().newFileStat(f, false).ctime(); + } + + @JRubyMethod(required = 2, rest = true, meta = true) + public static IRubyObject lchmod(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + int count = 0; + RubyInteger mode = args[0].convertToInteger(); + for (int i = 1; i < args.length; i++) { + IRubyObject filename = args[i]; + + if (!RubyFileTest.exist_p(filename, filename.convertToString()).isTrue()) { + throw runtime.newErrnoENOENTError("No such file or directory - " + filename); + } + + boolean result = 0 == runtime.getPosix().lchmod(filename.toString(), (int)mode.getLongValue()); + if (result) { + count++; + } + } + + return runtime.newFixnum(count); + } + + @JRubyMethod(required = 3, rest = true, meta = true) + public static IRubyObject lchown(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + int owner = !args[0].isNil() ? RubyNumeric.num2int(args[0]) : -1; + int group = !args[1].isNil() ? RubyNumeric.num2int(args[1]) : -1; + int count = 0; + + for (int i = 2; i < args.length; i++) { + IRubyObject filename = args[i]; + + if (!RubyFileTest.exist_p(filename, filename.convertToString()).isTrue()) { + throw runtime.newErrnoENOENTError("No such file or directory - " + filename); + } + + boolean result = 0 == runtime.getPosix().lchown(filename.toString(), owner, group); + if (result) { + count++; + } + } + + return runtime.newFixnum(count); + } + + @JRubyMethod(required = 2, meta = true) + public static IRubyObject link(ThreadContext context, IRubyObject recv, IRubyObject from, IRubyObject to) { + Ruby runtime = context.getRuntime(); + RubyString fromStr = RubyString.stringValue(from); + RubyString toStr = RubyString.stringValue(to); + try { + if (runtime.getPosix().link( + fromStr.toString(),toStr.toString()) == -1) { + // FIXME: When we get JNA3 we need to properly write this to errno. + throw runtime.newErrnoEEXISTError("File exists - " + + fromStr + " or " + toStr); + } + } catch (java.lang.UnsatisfiedLinkError ule) { + throw runtime.newNotImplementedError("link() function is unimplemented on this machine"); + } + + return runtime.newFixnum(0); + } + + @JRubyMethod(name = "mtime", required = 1, meta = true) + public static IRubyObject mtime(ThreadContext context, IRubyObject recv, IRubyObject filename) { + return getLastModified(context.getRuntime(), filename.convertToString().toString()); + } + + @JRubyMethod(required = 2, meta = true) + public static IRubyObject rename(ThreadContext context, IRubyObject recv, IRubyObject oldName, IRubyObject newName) { + Ruby runtime = context.getRuntime(); + RubyString oldNameString = RubyString.stringValue(oldName); + RubyString newNameString = RubyString.stringValue(newName); + runtime.checkSafeString(oldNameString); + runtime.checkSafeString(newNameString); + JRubyFile oldFile = JRubyFile.create(runtime.getCurrentDirectory(), oldNameString.toString()); + JRubyFile newFile = JRubyFile.create(runtime.getCurrentDirectory(), newNameString.toString()); + + if (!oldFile.exists() || !newFile.getParentFile().exists()) { + throw runtime.newErrnoENOENTError("No such file or directory - " + oldNameString + + " or " + newNameString); + } + + JRubyFile dest = JRubyFile.create(runtime.getCurrentDirectory(), newNameString.toString()); + + if (oldFile.renameTo(dest)) { // rename is successful + return RubyFixnum.zero(runtime); + } + + // rename via Java API call wasn't successful, let's try some tricks, similar to MRI + + if (newFile.exists()) { + runtime.getPosix().chmod(newNameString.toString(), 0666); + newFile.delete(); + } + + if (oldFile.renameTo(dest)) { // try to rename one more time + return RubyFixnum.zero(runtime); + } + + throw runtime.newErrnoEACCESError("Permission denied - " + oldNameString + " or " + + newNameString); + } + + @JRubyMethod(required = 1, meta = true) + public static RubyArray split(ThreadContext context, IRubyObject recv, IRubyObject arg) { + RubyString filename = RubyString.stringValue(arg); + + return context.getRuntime().newArray(dirname(context, recv, filename), + basename(context, recv, new IRubyObject[] { filename })); + } + + @JRubyMethod(required = 2, meta = true) + public static IRubyObject symlink(ThreadContext context, IRubyObject recv, IRubyObject from, IRubyObject to) { + Ruby runtime = context.getRuntime(); + RubyString fromStr = RubyString.stringValue(from); + RubyString toStr = RubyString.stringValue(to); + try { + if (runtime.getPosix().symlink( + fromStr.toString(), toStr.toString()) == -1) { + // FIXME: When we get JNA3 we need to properly write this to errno. + throw runtime.newErrnoEEXISTError("File exists - " + + fromStr + " or " + toStr); + } + } catch (java.lang.UnsatisfiedLinkError ule) { + throw runtime.newNotImplementedError("symlink() function is unimplemented on this machine"); + } + + return runtime.newFixnum(0); + } + + @JRubyMethod(required = 1, meta = true) + public static IRubyObject readlink(ThreadContext context, IRubyObject recv, IRubyObject path) { + Ruby runtime = context.getRuntime(); + + try { + String realPath = runtime.getPosix().readlink(path.toString()); + + if (!RubyFileTest.exist_p(recv, path).isTrue()) { + throw runtime.newErrnoENOENTError("No such file or directory - " + path); + } + + if (!RubyFileTest.symlink_p(recv, path).isTrue()) { + throw runtime.newErrnoEINVALError("invalid argument - " + path); + } + + if (realPath == null) { + //FIXME: When we get JNA3 we need to properly write this to errno. + } + + return runtime.newString(realPath); + } catch (IOException e) { + throw runtime.newIOError(e.getMessage()); + } + } + + // Can we produce IOError which bypasses a close? + @JRubyMethod(required = 2, meta = true) + public static IRubyObject truncate(ThreadContext context, IRubyObject recv, IRubyObject arg1, IRubyObject arg2) { + Ruby runtime = context.getRuntime(); + RubyString filename = arg1.convertToString(); // TODO: SafeStringValue here + RubyInteger newLength = arg2.convertToInteger(); + + if (!new File(runtime.getCurrentDirectory(), filename.getByteList().toString()).exists()) { + throw runtime.newErrnoENOENTError( + "No such file or directory - " + filename.getByteList().toString()); + } + + if (newLength.getLongValue() < 0) { + throw runtime.newErrnoEINVALError("invalid argument: " + filename); + } + + IRubyObject[] args = new IRubyObject[] { filename, runtime.newString("r+") }; + RubyFile file = (RubyFile) open(context, recv, args, Block.NULL_BLOCK); + file.truncate(context, newLength); + file.close(); + + return RubyFixnum.zero(runtime); + } + + @JRubyMethod(meta = true, optional = 1) + public static IRubyObject umask(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + int oldMask = 0; + if (args.length == 0) { + oldMask = runtime.getPosix().umask(0); + runtime.getPosix().umask(oldMask); + } else if (args.length == 1) { + oldMask = runtime.getPosix().umask((int) args[0].convertToInteger().getLongValue()); + } else { + runtime.newArgumentError("wrong number of arguments"); + } + + return runtime.newFixnum(oldMask); + } + + /** + * This method does NOT set atime, only mtime, since Java doesn't support anything else. + */ + @JRubyMethod(required = 2, rest = true, meta = true) + public static IRubyObject utime(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + // Ignore access_time argument since Java does not support it. + + long mtime; + if (args[1] instanceof RubyTime) { + mtime = ((RubyTime) args[1]).getJavaDate().getTime(); + } else if (args[1] instanceof RubyNumeric) { + mtime = RubyNumeric.num2long(args[1]); + } else if (args[1] == runtime.getNil()) { + mtime = System.currentTimeMillis(); + } else { + RubyTime time = (RubyTime) TypeConverter.convertToType(args[1], runtime.getTime(), MethodIndex.NO_INDEX,"to_time", true); + mtime = time.getJavaDate().getTime(); + } + + for (int i = 2, j = args.length; i < j; i++) { + RubyString filename = RubyString.stringValue(args[i]); + runtime.checkSafeString(filename); + JRubyFile fileToTouch = JRubyFile.create(runtime.getCurrentDirectory(),filename.toString()); + + if (!fileToTouch.exists()) { + throw runtime.newErrnoENOENTError(" No such file or directory - \"" + filename + "\""); + } + + fileToTouch.setLastModified(mtime); + } + + return runtime.newFixnum(args.length - 2); + } + + @JRubyMethod(name = {"unlink", "delete"}, rest = true, meta = true) + public static IRubyObject unlink(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + for (int i = 0; i < args.length; i++) { + RubyString filename = RubyString.stringValue(args[i]); + runtime.checkSafeString(filename); + JRubyFile lToDelete = JRubyFile.create(runtime.getCurrentDirectory(),filename.toString()); + + boolean isSymlink = RubyFileTest.symlink_p(recv, filename).isTrue(); + // Broken symlinks considered by exists() as non-existing, + // so we need to check for symlinks explicitly. + if (!lToDelete.exists() && !isSymlink) { + throw runtime.newErrnoENOENTError(" No such file or directory - \"" + filename + "\""); + } + + if (!lToDelete.delete()) { + throw runtime.newErrnoEACCESError("Permission denied - \"" + filename + "\""); + } + } + + return runtime.newFixnum(args.length); + } + + // Fast path since JNA stat is about 10x slower than this + private static IRubyObject getLastModified(Ruby runtime, String path) { + JRubyFile file = JRubyFile.create(runtime.getCurrentDirectory(), path); + + if (!file.exists()) { + throw runtime.newErrnoENOENTError("No such file or directory - " + path); + } + + return runtime.newTime(file.lastModified()); + } +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Joey Gibson <joey@joeygibson.com> + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.FileDescriptor; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.ext.posix.FileStat; +import org.jruby.ext.posix.util.Platform; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.JRubyFile; + +/** + * Implements File::Stat + */ +@JRubyClass(name="File::Stat", include="Comparable") +public class RubyFileStat extends RubyObject { + private static final long serialVersionUID = 1L; + + private JRubyFile file; + private FileStat stat; + + private static ObjectAllocator ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyFileStat(runtime, klass); + } + }; + + public static RubyClass createFileStatClass(Ruby runtime) { + // TODO: NOT_ALLOCATABLE_ALLOCATOR is probably ok here. Confirm. JRUBY-415 + final RubyClass fileStatClass = runtime.getFile().defineClassUnder("Stat",runtime.getObject(), ALLOCATOR); + runtime.setFileStat(fileStatClass); + + fileStatClass.includeModule(runtime.fastGetModule("Comparable")); + fileStatClass.defineAnnotatedMethods(RubyFileStat.class); + + return fileStatClass; + } + + protected RubyFileStat(Ruby runtime, RubyClass clazz) { + super(runtime, clazz); + + } + + public static RubyFileStat newFileStat(Ruby runtime, String filename, boolean lstat) { + RubyFileStat stat = new RubyFileStat(runtime, runtime.getFileStat()); + + stat.setup(filename, lstat); + + return stat; + } + + public static RubyFileStat newFileStat(Ruby runtime, FileDescriptor descriptor) { + RubyFileStat stat = new RubyFileStat(runtime, runtime.getFileStat()); + + stat.setup(descriptor); + + return stat; + } + + private void setup(FileDescriptor descriptor) { + stat = getRuntime().getPosix().fstat(descriptor); + } + + private void setup(String filename, boolean lstat) { + if (Platform.IS_WINDOWS && filename.length() == 2 + && filename.charAt(1) == ':' && Character.isLetter(filename.charAt(0))) { + filename += "/"; + } + + file = JRubyFile.create(getRuntime().getCurrentDirectory(), filename); + + if (lstat) { + stat = getRuntime().getPosix().lstat(file.getAbsolutePath()); + } else { + stat = getRuntime().getPosix().stat(file.getAbsolutePath()); + } + } + + @JRubyMethod(name = "initialize", required = 1, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject fname, Block unusedBlock) { + setup(fname.convertToString().toString(), false); + + return this; + } + + @JRubyMethod(name = "atime") + public IRubyObject atime() { + return getRuntime().newTime(stat.atime() * 1000); + } + + @JRubyMethod(name = "blksize") + public RubyFixnum blksize() { + return getRuntime().newFixnum(stat.blockSize()); + } + + @JRubyMethod(name = "blockdev?") + public IRubyObject blockdev_p() { + return getRuntime().newBoolean(stat.isBlockDev()); + } + + @JRubyMethod(name = "blocks") + public IRubyObject blocks() { + return getRuntime().newFixnum(stat.blocks()); + } + + @JRubyMethod(name = "chardev?") + public IRubyObject chardev_p() { + return getRuntime().newBoolean(stat.isCharDev()); + } + + @JRubyMethod(name = "<=>", required = 1) + public IRubyObject cmp(IRubyObject other) { + if (!(other instanceof RubyFileStat)) getRuntime().getNil(); + + long time1 = stat.mtime(); + long time2 = ((RubyFileStat) other).stat.mtime(); + + if (time1 == time2) { + return getRuntime().newFixnum(0); + } else if (time1 < time2) { + return getRuntime().newFixnum(-1); + } + + return getRuntime().newFixnum(1); + } + + @JRubyMethod(name = "ctime") + public IRubyObject ctime() { + return getRuntime().newTime(stat.ctime() * 1000); + } + + @JRubyMethod(name = "dev") + public IRubyObject dev() { + return getRuntime().newFixnum(stat.dev()); + } + + @JRubyMethod(name = "dev_major") + public IRubyObject devMajor() { + return getRuntime().newFixnum(stat.major(stat.dev())); + } + + @JRubyMethod(name = "dev_minor") + public IRubyObject devMinor() { + return getRuntime().newFixnum(stat.minor(stat.dev())); + } + + @JRubyMethod(name = "directory?") + public RubyBoolean directory_p() { + return getRuntime().newBoolean(stat.isDirectory()); + } + + @JRubyMethod(name = "executable?") + public IRubyObject executable_p() { + return getRuntime().newBoolean(stat.isExecutable()); + } + + @JRubyMethod(name = "executable_real?") + public IRubyObject executableReal_p() { + return getRuntime().newBoolean(stat.isExecutableReal()); + } + + @JRubyMethod(name = "file?") + public RubyBoolean file_p() { + return getRuntime().newBoolean(stat.isFile()); + } + + @JRubyMethod(name = "ftype") + public RubyString ftype() { + return getRuntime().newString(stat.ftype()); + } + + @JRubyMethod(name = "gid") + public IRubyObject gid() { + return getRuntime().newFixnum(stat.gid()); + } + + @JRubyMethod(name = "grpowned?") + public IRubyObject group_owned_p() { + return getRuntime().newBoolean(stat.isGroupOwned()); + } + + @JRubyMethod(name = "initialize_copy", required = 1) + public IRubyObject initialize_copy(IRubyObject original) { + if (!(original instanceof RubyFileStat)) { + throw getRuntime().newTypeError("wrong argument class"); + } + + RubyFileStat originalFileStat = (RubyFileStat) original; + + file = originalFileStat.file; + stat = originalFileStat.stat; + + return this; + } + + @JRubyMethod(name = "ino") + public IRubyObject ino() { + return getRuntime().newFixnum(stat.ino()); + } + + @JRubyMethod(name = "inspect") + public IRubyObject inspect() { + StringBuilder buf = new StringBuilder("#<"); + buf.append(getMetaClass().getRealClass().getName()); + buf.append(" "); + // FIXME: Obvious issue that not all platforms can display all attributes. Ugly hacks. + // Using generic posix library makes pushing inspect behavior into specific system impls + // rather painful. + try { buf.append("dev=0x").append(Long.toHexString(stat.dev())).append(", "); } catch (Exception e) {} + try { buf.append("ino=").append(stat.ino()).append(", "); } catch (Exception e) {} + buf.append("mode=0").append(Integer.toOctalString(stat.mode())).append(", "); + try { buf.append("nlink=").append(stat.nlink()).append(", "); } catch (Exception e) {} + try { buf.append("uid=").append(stat.uid()).append(", "); } catch (Exception e) {} + try { buf.append("gid=").append(stat.gid()).append(", "); } catch (Exception e) {} + try { buf.append("rdev=0x").append(Long.toHexString(stat.rdev())).append(", "); } catch (Exception e) {} + buf.append("size=").append(stat.st_size()).append(", "); + try { buf.append("blksize=").append(stat.blockSize()).append(", "); } catch (Exception e) {} + try { buf.append("blocks=").append(stat.blocks()).append(", "); } catch (Exception e) {} + + buf.append("atime=").append(atime()).append(", "); + buf.append("mtime=").append(mtime()).append(", "); + buf.append("ctime=").append(ctime()); + buf.append(">"); + + return getRuntime().newString(buf.toString()); + } + + @JRubyMethod(name = "uid") + public IRubyObject uid() { + return getRuntime().newFixnum(stat.uid()); + } + + @JRubyMethod(name = "mode") + public IRubyObject mode() { + return getRuntime().newFixnum(stat.mode()); + } + + @JRubyMethod(name = "mtime") + public IRubyObject mtime() { + return getRuntime().newTime(stat.mtime() * 1000); + } + + public IRubyObject mtimeEquals(IRubyObject other) { + return getRuntime().newBoolean(stat.mtime() == newFileStat(getRuntime(), other.convertToString().toString(), false).stat.mtime()); + } + + public IRubyObject mtimeGreaterThan(IRubyObject other) { + return getRuntime().newBoolean(stat.mtime() > newFileStat(getRuntime(), other.convertToString().toString(), false).stat.mtime()); + } + + public IRubyObject mtimeLessThan(IRubyObject other) { + return getRuntime().newBoolean(stat.mtime() < newFileStat(getRuntime(), other.convertToString().toString(), false).stat.mtime()); + } + + @JRubyMethod(name = "nlink") + public IRubyObject nlink() { + return getRuntime().newFixnum(stat.nlink()); + } + + @JRubyMethod(name = "owned?") + public IRubyObject owned_p() { + return getRuntime().newBoolean(stat.isOwned()); + } + + @JRubyMethod(name = "pipe?") + public IRubyObject pipe_p() { + return getRuntime().newBoolean(stat.isNamedPipe()); + } + + @JRubyMethod(name = "rdev") + public IRubyObject rdev() { + return getRuntime().newFixnum(stat.rdev()); + } + + @JRubyMethod(name = "rdev_major") + public IRubyObject rdevMajor() { + return getRuntime().newFixnum(stat.major(stat.rdev())); + } + + @JRubyMethod(name = "rdev_minor") + public IRubyObject rdevMinor() { + return getRuntime().newFixnum(stat.minor(stat.rdev())); + } + + @JRubyMethod(name = "readable?") + public IRubyObject readable_p() { + return getRuntime().newBoolean(stat.isReadable()); + } + + @JRubyMethod(name = "readable_real?") + public IRubyObject readableReal_p() { + return getRuntime().newBoolean(stat.isReadableReal()); + } + + @JRubyMethod(name = "setgid?") + public IRubyObject setgid_p() { + return getRuntime().newBoolean(stat.isSetgid()); + } + + @JRubyMethod(name = "setuid?") + public IRubyObject setuid_p() { + return getRuntime().newBoolean(stat.isSetuid()); + } + + @JRubyMethod(name = "size") + public IRubyObject size() { + return getRuntime().newFixnum(stat.st_size()); + } + + @JRubyMethod(name = "size?") + public IRubyObject size_p() { + long size = stat.st_size(); + + if (size == 0) return getRuntime().getNil(); + + return getRuntime().newFixnum(size); + } + + @JRubyMethod(name = "socket?") + public IRubyObject socket_p() { + return getRuntime().newBoolean(stat.isSocket()); + } + + @JRubyMethod(name = "sticky?") + public IRubyObject sticky_p() { + return getRuntime().newBoolean(stat.isSticky()); + } + + @JRubyMethod(name = "symlink?") + public IRubyObject symlink_p() { + return getRuntime().newBoolean(stat.isSymlink()); + } + + @JRubyMethod(name = "writable?") + public IRubyObject writable_p() { + return getRuntime().newBoolean(stat.isWritable()); + } + + @JRubyMethod(name = "writable_real?") + public IRubyObject writableReal_p() { + return getRuntime().newBoolean(stat.isWritableReal()); + } + + @JRubyMethod(name = "zero?") + public IRubyObject zero_p() { + return getRuntime().newBoolean(stat.isEmpty()); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.exceptions.RaiseException; + +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.JRubyFile; + +@JRubyModule(name="FileTest") +public class RubyFileTest { + public static RubyModule createFileTestModule(Ruby runtime) { + RubyModule fileTestModule = runtime.defineModule("FileTest"); + runtime.setFileTest(fileTestModule); + + fileTestModule.defineAnnotatedMethods(RubyFileTest.class); + + return fileTestModule; + } + + @JRubyMethod(name = "blockdev?", required = 1, module = true) + public static IRubyObject blockdev_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isBlockDev()); + } + + @JRubyMethod(name = "chardev?", required = 1, module = true) + public static IRubyObject chardev_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isCharDev()); + } + + @JRubyMethod(name = "directory?", required = 1, module = true) + public static IRubyObject directory_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isDirectory()); + } + + @JRubyMethod(name = "executable?", required = 1, module = true) + public static IRubyObject executable_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isExecutable()); + } + + @JRubyMethod(name = "executable_real?", required = 1, module = true) + public static IRubyObject executable_real_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isExecutableReal()); + } + + @JRubyMethod(name = {"exist?", "exists?"}, required = 1, module = true) + public static IRubyObject exist_p(IRubyObject recv, IRubyObject filename) { + if (Ruby.isSecurityRestricted()) { + return recv.getRuntime().getFalse(); + } + + if(filename.convertToString().toString().startsWith("file:")) { + String file = filename.convertToString().toString().substring(5); + int bang = file.indexOf('!'); + if (bang == -1 || bang == file.length() - 1) { + return recv.getRuntime().getFalse(); + } + String jar = file.substring(0, bang); + String after = file.substring(bang + 2); + try { + java.util.jar.JarFile jf = new java.util.jar.JarFile(jar); + if(jf.getJarEntry(after) != null) { + return recv.getRuntime().getTrue(); + } else { + return recv.getRuntime().getFalse(); + } + } catch(Exception e) { + return recv.getRuntime().getFalse(); + } + } + + return recv.getRuntime().newBoolean(file(filename).exists()); + } + + @JRubyMethod(name = "file?", required = 1, module = true) + public static RubyBoolean file_p(IRubyObject recv, IRubyObject filename) { + JRubyFile file = file(filename); + + return filename.getRuntime().newBoolean(file.exists() && file.isFile()); + } + + @JRubyMethod(name = "grpowned?", required = 1, module = true) + public static IRubyObject grpowned_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isGroupOwned()); + } + + @JRubyMethod(name = "identical?", required = 2, module = true) + public static IRubyObject identical_p(IRubyObject recv, IRubyObject filename1, IRubyObject filename2) { + Ruby runtime = recv.getRuntime(); + JRubyFile file1 = file(filename1); + JRubyFile file2 = file(filename2); + + return runtime.newBoolean(file1.exists() && file2.exists() && + runtime.getPosix().stat(file1.getAbsolutePath()).isIdentical(runtime.getPosix().stat(file2.getAbsolutePath()))); + } + + @JRubyMethod(name = "owned?", required = 1, module = true) + public static IRubyObject owned_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isOwned()); + } + + @JRubyMethod(name = "pipe?", required = 1, module = true) + public static IRubyObject pipe_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isNamedPipe()); + } + + // We use file test since it is faster than a stat; also euid == uid in Java always + @JRubyMethod(name = {"readable?", "readable_real?"}, required = 1, module = true) + public static IRubyObject readable_p(IRubyObject recv, IRubyObject filename) { + JRubyFile file = file(filename); + + return recv.getRuntime().newBoolean(file.exists() && file.canRead()); + } + + // Not exposed by filetest, but so similiar in nature that it is stored here + public static IRubyObject rowned_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isROwned()); + } + + @JRubyMethod(name = "setgid?", required = 1, module = true) + public static IRubyObject setgid_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isSetgid()); + } + + @JRubyMethod(name = "setuid?", required = 1, module = true) + public static IRubyObject setuid_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isSetuid()); + } + + @JRubyMethod(name = "size", required = 1, module = true) + public static IRubyObject size(IRubyObject recv, IRubyObject filename) { + JRubyFile file = file(filename); + + if (!file.exists()) noFileError(filename); + + return recv.getRuntime().newFixnum(file.length()); + } + + @JRubyMethod(name = "size?", required = 1, module = true) + public static IRubyObject size_p(IRubyObject recv, IRubyObject filename) { + JRubyFile file = file(filename); + + if (!file.exists()) { + return recv.getRuntime().getNil(); + } + + long length = file.length(); + if (length > 0) { + return recv.getRuntime().newFixnum(length); + } else { + return recv.getRuntime().getNil(); + } + } + + @JRubyMethod(name = "socket?", required = 1, module = true) + public static IRubyObject socket_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isSocket()); + } + + @JRubyMethod(name = "sticky?", required = 1, module = true) + public static IRubyObject sticky_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + return runtime.newBoolean(file.exists() && runtime.getPosix().stat(file.getAbsolutePath()).isSticky()); + } + + @JRubyMethod(name = "symlink?", required = 1, module = true) + public static RubyBoolean symlink_p(IRubyObject recv, IRubyObject filename) { + Ruby runtime = recv.getRuntime(); + JRubyFile file = file(filename); + + try { + // Note: We can't use file.exists() to check whether the symlink + // exists or not, because that method returns false for existing + // but broken symlink. So, we try without the existence check, + // but in the try-catch block. + // MRI behavior: symlink? on broken symlink should return true. + return runtime.newBoolean(runtime.getPosix().lstat(file.getAbsolutePath()).isSymlink()); + } catch (RaiseException re) { + return runtime.getFalse(); + } + } + + // We do both writable and writable_real through the same method because + // in our java process effective and real userid will always be the same. + @JRubyMethod(name = {"writable?", "writable_real?"}, required = 1, module = true) + public static RubyBoolean writable_p(IRubyObject recv, IRubyObject filename) { + return filename.getRuntime().newBoolean(file(filename).canWrite()); + } + + @JRubyMethod(name = "zero?", required = 1, module = true) + public static RubyBoolean zero_p(IRubyObject recv, IRubyObject filename) { + JRubyFile file = file(filename); + + return filename.getRuntime().newBoolean(file.exists() && file.length() == 0L); + } + + private static JRubyFile file(IRubyObject path) { + String filename = path.convertToString().toString(); + + return JRubyFile.create(path.getRuntime().getCurrentDirectory(), filename); + } + + private static void noFileError(IRubyObject filename) { + throw filename.getRuntime().newErrnoENOENTError("No such file or directory - " + + filename.convertToString()); + } +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 David Corbin <dcorbin@users.sourceforge.net> + * Copyright (C) 2006 Antti Karanta <antti.karanta@napa.fi> + * Copyright (C) 2007 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.math.BigInteger; +import java.util.HashMap; +import java.util.Map; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.java.MiniJava; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.Convert; +import org.jruby.util.Numeric; +import org.jruby.util.TypeCoercer; + +/** + * Implementation of the Fixnum class. + */ +@JRubyClass(name="Fixnum", parent="Integer", include="Precision") +public class RubyFixnum extends RubyInteger { + + public static RubyClass createFixnumClass(Ruby runtime) { + RubyClass fixnum = runtime.defineClass("Fixnum", runtime.getInteger(), + ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setFixnum(fixnum); + fixnum.index = ClassIndex.FIXNUM; + fixnum.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyFixnum; + } + }; + + fixnum.includeModule(runtime.getPrecision()); + + fixnum.defineAnnotatedMethods(RubyFixnum.class); + + for (int i = 0; i < runtime.fixnumCache.length; i++) { + runtime.fixnumCache[i] = new RubyFixnum(runtime, fixnum, i - 128); + } + + return fixnum; + } + + private final long value; + private static final int BIT_SIZE = 64; + public static final long SIGN_BIT = (1L << (BIT_SIZE - 1)); + public static final long MAX = (1L<<(BIT_SIZE - 1)) - 1; + public static final long MIN = -1 * MAX - 1; + public static final long MAX_MARSHAL_FIXNUM = (1L << 30) - 1; // 0x3fff_ffff + public static final long MIN_MARSHAL_FIXNUM = - (1L << 30); // -0x4000_0000 + + private static IRubyObject fixCoerce(IRubyObject x) { + do { + x = x.convertToInteger(); + } while (!(x instanceof RubyFixnum) && !(x instanceof RubyBignum)); + return x; + } + + public RubyFixnum(Ruby runtime) { + this(runtime, 0); + } + + public RubyFixnum(Ruby runtime, long value) { + super(runtime, runtime.getFixnum(), false); + this.value = value; + } + + private RubyFixnum(Ruby runtime, RubyClass klazz, long value) { + super(runtime, klazz, false); + this.value = value; + } + + @Override + public int getNativeTypeIndex() { + return ClassIndex.FIXNUM; + } + + /** + * short circuit for Fixnum key comparison + */ + @Override + public final boolean eql(IRubyObject other) { + return other instanceof RubyFixnum && value == ((RubyFixnum)other).value; + } + + @Override + public boolean isImmediate() { + return true; + } + + @Override + public RubyClass getSingletonClass() { + throw getRuntime().newTypeError("can't define singleton"); + } + + @Override + public Class<?> getJavaClass() { + // this precision-guessing needs to be thought out more, since in the + // case of coercing to Object we generally want to get the same type + // always +// if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) { +// return byte.class; +// } else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE) { +// return short.class; +// } else if (value >= Character.MIN_VALUE && value <= Character.MAX_VALUE) { +// return char.class; +// } else if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) { +// return int.class; +// } + return long.class; + } + + @Override + public double getDoubleValue() { + return value; + } + + @Override + public long getLongValue() { + return value; + } + + private static final int CACHE_OFFSET = 128; + + public static RubyFixnum newFixnum(Ruby runtime, long value) { + if (isInCacheRange(value)) { + return runtime.fixnumCache[(int) value + CACHE_OFFSET]; + } + return new RubyFixnum(runtime, value); + } + + private static boolean isInCacheRange(long value) { + return value <= 127 && value >= -128; + } + + public RubyFixnum newFixnum(long newValue) { + return newFixnum(getRuntime(), newValue); + } + + public static RubyFixnum zero(Ruby runtime) { + return runtime.fixnumCache[CACHE_OFFSET]; + } + + public static RubyFixnum one(Ruby runtime) { + return runtime.fixnumCache[CACHE_OFFSET + 1]; + } + + public static RubyFixnum two(Ruby runtime) { + return runtime.fixnumCache[CACHE_OFFSET + 2]; + } + + public static RubyFixnum three(Ruby runtime) { + return runtime.fixnumCache[CACHE_OFFSET + 3]; + } + + public static RubyFixnum four(Ruby runtime) { + return runtime.fixnumCache[CACHE_OFFSET + 4]; + } + + public static RubyFixnum five(Ruby runtime) { + return runtime.fixnumCache[CACHE_OFFSET + 5]; + } + + public static RubyFixnum minus_one(Ruby runtime) { + return runtime.fixnumCache[CACHE_OFFSET - 1]; + } + + @Override + public RubyFixnum hash() { + return newFixnum(hashCode()); + } + + @Override + public final int hashCode() { + return (int)(value ^ value >>> 32); + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + + if (other instanceof RubyFixnum) { + RubyFixnum num = (RubyFixnum)other; + + if (num.value == value) { + return true; + } + } + + return false; + } + + /* ================ + * Instance Methods + * ================ + */ + + /** fix_to_s + * + */ + public RubyString to_s(IRubyObject[] args) { + switch (args.length) { + case 0: return to_s(); + case 1: return to_s(args[0]); + default: throw getRuntime().newArgumentError(args.length, 1); + } + } + + @JRubyMethod + @Override + public RubyString to_s() { + int base = 10; + return getRuntime().newString(Convert.longToByteList(value, base)); + } + + @JRubyMethod + public RubyString to_s(IRubyObject arg0) { + int base = num2int(arg0); + if (base < 2 || base > 36) { + throw getRuntime().newArgumentError("illegal radix " + base); + } + return getRuntime().newString(Convert.longToByteList(value, base)); + } + + /** fix_id2name + * + */ + @JRubyMethod + public IRubyObject id2name() { + RubySymbol symbol = RubySymbol.getSymbolLong(getRuntime(), value); + + if (symbol != null) return getRuntime().newString(symbol.asJavaString()); + + return getRuntime().getNil(); + } + + /** fix_to_sym + * + */ + @JRubyMethod + public IRubyObject to_sym() { + RubySymbol symbol = RubySymbol.getSymbolLong(getRuntime(), value); + + return symbol != null ? symbol : getRuntime().getNil(); + } + + /** fix_uminus + * + */ + @JRubyMethod(name = "-@") + public IRubyObject op_uminus() { + if (value == MIN) { // a gotcha + return RubyBignum.newBignum(getRuntime(), BigInteger.valueOf(value).negate()); + } + return RubyFixnum.newFixnum(getRuntime(), -value); + } + + /** fix_plus + * + */ + @JRubyMethod(name = "+") + public IRubyObject op_plus(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return addFixnum(context, (RubyFixnum)other); + } + return addOther(context, other); + } + + private IRubyObject addFixnum(ThreadContext context, RubyFixnum other) { + long otherValue = other.value; + long result = value + otherValue; + if (additionOverflowed(value, otherValue, result)) { + return addAsBignum(context, other); + } + return newFixnum(context.getRuntime(), result); + } + + private static boolean additionOverflowed(long original, long other, long result) { + return (~(original ^ other) & (original ^ result) & SIGN_BIT) != 0; + } + + private static boolean subtractionOverflowed(long original, long other, long result) { + return (~(original ^ ~other) & (original ^ result) & SIGN_BIT) != 0; + } + + private IRubyObject addAsBignum(ThreadContext context, RubyFixnum other) { + return RubyBignum.newBignum(context.getRuntime(), value).op_plus(context, other); + } + + private IRubyObject addOther(ThreadContext context, IRubyObject other) { + if (other instanceof RubyBignum) { + return ((RubyBignum) other).op_plus(context, this); + } + if (other instanceof RubyFloat) { + return context.getRuntime().newFloat((double) value + ((RubyFloat) other).getDoubleValue()); + } + return coerceBin(context, "+", other); + } + + /** fix_minus + * + */ + @JRubyMethod(name = "-") + public IRubyObject op_minus(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return subtractFixnum(context, (RubyFixnum)other); + } + return subtractOther(context, other); + } + + private IRubyObject subtractFixnum(ThreadContext context, RubyFixnum other) { + long otherValue = other.value; + long result = value - otherValue; + if (subtractionOverflowed(value, otherValue, result)) { + return subtractAsBignum(context, other); + } + return newFixnum(context.getRuntime(), result); + } + + private IRubyObject subtractAsBignum(ThreadContext context, RubyFixnum other) { + return RubyBignum.newBignum(context.getRuntime(), value).op_minus(context, other); + } + + private IRubyObject subtractOther(ThreadContext context, IRubyObject other) { + if (other instanceof RubyBignum) { + return RubyBignum.newBignum(context.getRuntime(), value).op_minus(context, other); + } else if (other instanceof RubyFloat) { + return context.getRuntime().newFloat((double) value - ((RubyFloat) other).getDoubleValue()); + } + return coerceBin(context, "-", other); + } + + /** fix_mul + * + */ + @JRubyMethod(name = "*") + public IRubyObject op_mul(ThreadContext context, IRubyObject other) { + Ruby runtime = context.getRuntime(); + if (other instanceof RubyFixnum) { + long otherValue = ((RubyFixnum) other).value; + if (value == 0) { + return RubyFixnum.zero(runtime); + } + long result = value * otherValue; + if (result / value != otherValue) { + return RubyBignum.newBignum(runtime, value).op_mul(context, other); + } + return newFixnum(runtime, result); + } else if (other instanceof RubyBignum) { + return ((RubyBignum) other).op_mul(context, this); + } else if (other instanceof RubyFloat) { + return runtime.newFloat((double) value * ((RubyFloat) other).getDoubleValue()); + } + return coerceBin(context, "*", other); + } + + /** fix_div + * here is terrible MRI gotcha: + * 1.div 3.0 -> 0 + * 1 / 3.0 -> 0.3333333333333333 + * + * MRI is also able to do it in one place by looking at current frame in rb_num_coerce_bin: + * rb_funcall(x, ruby_frame->orig_func, 1, y); + * + * also note that RubyFloat doesn't override Numeric.div + */ + @JRubyMethod(name = "div") + public IRubyObject div_div(ThreadContext context, IRubyObject other) { + return idiv(context, other, "div"); + } + + @JRubyMethod(name = "/") + public IRubyObject op_div(ThreadContext context, IRubyObject other) { + return idiv(context, other, "/"); + } + + @JRubyMethod(name = {"odd?"}) + public RubyBoolean odd_p() { + if(value%2 != 0) { + return getRuntime().getTrue(); + } + return getRuntime().getFalse(); + } + + @JRubyMethod(name = {"even?"}) + public RubyBoolean even_p() { + if(value%2 == 0) { + return getRuntime().getTrue(); + } + return getRuntime().getFalse(); + } + + @JRubyMethod + public IRubyObject pred() { + return getRuntime().newFixnum(value-1); + } + + public IRubyObject idiv(ThreadContext context, IRubyObject other, String method) { + if (other instanceof RubyFixnum) { + long x = value; + long y = ((RubyFixnum) other).value; + + if (y == 0) { + throw context.getRuntime().newZeroDivisionError(); + } + + long div = x / y; + long mod = x % y; + + if (mod < 0 && y > 0 || mod > 0 && y < 0) { + div -= 1; + } + + return context.getRuntime().newFixnum(div); + } + return coerceBin(context, method, other); + } + + /** fix_mod + * + */ + @JRubyMethod(name = {"%", "modulo"}) + public IRubyObject op_mod(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + // Java / and % are not the same as ruby + long x = value; + long y = ((RubyFixnum) other).value; + + if (y == 0) { + throw context.getRuntime().newZeroDivisionError(); + } + + long mod = x % y; + + if (mod < 0 && y > 0 || mod > 0 && y < 0) { + mod += y; + } + + return context.getRuntime().newFixnum(mod); + } + return coerceBin(context, "%", other); + } + + /** fix_divmod + * + */ + @JRubyMethod + @Override + public IRubyObject divmod(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + long x = value; + long y = ((RubyFixnum) other).value; + final Ruby runtime = context.getRuntime(); + + if (y == 0) { + throw runtime.newZeroDivisionError(); + } + + long div = x / y; + long mod = x % y; + + if (mod < 0 && y > 0 || mod > 0 && y < 0) { + div -= 1; + mod += y; + } + + IRubyObject fixDiv = RubyFixnum.newFixnum(runtime, div); + IRubyObject fixMod = RubyFixnum.newFixnum(runtime, mod); + + return RubyArray.newArray(runtime, fixDiv, fixMod); + + } + return coerceBin(context, "divmod", other); + } + + /** fix_quo + * + */ + @JRubyMethod(name = "quo", compat = CompatVersion.RUBY1_8) + public IRubyObject quo(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return RubyFloat.newFloat(context.getRuntime(), (double) value / (double) ((RubyFixnum) other).value); + } + return coerceBin(context, "quo", other); + } + + /** fix_pow + * + */ + @JRubyMethod(name = "**") + public IRubyObject op_pow(ThreadContext context, IRubyObject other) { + if(other instanceof RubyFixnum) { + long b = ((RubyFixnum) other).value; + + if (b == 0) { + return RubyFixnum.one(context.getRuntime()); + } + if (b == 1) { + return this; + } + if (b > 0) { + return RubyBignum.newBignum(context.getRuntime(), value).op_pow(context, other); + } + return RubyFloat.newFloat(context.getRuntime(), Math.pow(value, b)); + } else if (other instanceof RubyFloat) { + return RubyFloat.newFloat(context.getRuntime(), Math.pow(value, ((RubyFloat) other) + .getDoubleValue())); + } + return coerceBin(context, "**", other); + } + + /** fix_pow + * + */ + @JRubyMethod(name = "**", compat = CompatVersion.RUBY1_9) + public IRubyObject op_pow_19(ThreadContext context, IRubyObject other) { + Ruby runtime = context.getRuntime(); + long a = value; + if (other instanceof RubyFixnum) { + long b = ((RubyFixnum) other).value; + + if (b < 0) { + return RubyRational.newRationalRaw(context.getRuntime(), this).callMethod(context, "**", other); + } + + if (b == 0) return RubyFixnum.one(runtime); + if (b == 1) return this; + + if (a == 0) { + return b > 0 ? RubyFixnum.zero(runtime) : RubyNumeric.dbl2num(runtime, 1.0 / 0.0); + } + if (a == 1) return RubyFixnum.one(runtime); + if (a == -1) { + return b % 2 == 0 ? RubyFixnum.one(runtime) : RubyFixnum.minus_one(runtime); + } + return Numeric.int_pow(context, a, b); + } else if (other instanceof RubyBignum) { + if (other.callMethod(context, "<", RubyFixnum.zero(runtime)).isTrue()) { + return RubyRational.newRationalRaw(runtime, this).callMethod(context, "**", other); + } + if (a == 0) return RubyFixnum.zero(runtime); + if (a == 1) return RubyFixnum.one(runtime); + if (a == -1) { + return RubyInteger.even_p(context, other).isTrue() ? RubyFixnum.one(runtime) : RubyFixnum.minus_one(runtime); + } + RubyBignum.newBignum(runtime, RubyBignum.fix2big(this)).op_pow(context, other); + } else if (other instanceof RubyFloat) { + return RubyFloat.newFloat(context.getRuntime(), Math.pow(a, ((RubyFloat) other).getDoubleValue())); + } + return coerceBin(context, "**", other); + } + + + /** fix_abs + * + */ + @JRubyMethod + public IRubyObject abs() { + if (value < 0) { + // A gotcha for Long.MIN_VALUE: value = -value + if (value == Long.MIN_VALUE) { + return RubyBignum.newBignum( + getRuntime(), BigInteger.valueOf(value).negate()); + } + return RubyFixnum.newFixnum(getRuntime(), -value); + } + return this; + } + + /** fix_equal + * + */ + @JRubyMethod(name = "==") + @Override + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return RubyBoolean.newBoolean(context.getRuntime(), value == ((RubyFixnum) other).value); + } + return super.op_num_equal(context, other); + } + + /** fix_cmp + * + */ + @JRubyMethod(name = "<=>") + public IRubyObject op_cmp(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return compareFixnum(context, (RubyFixnum)other); + } + return coerceCmp(context, "<=>", other); + } + + private IRubyObject compareFixnum(ThreadContext context, RubyFixnum other) { + long otherValue = ((RubyFixnum) other).value; + if (value == otherValue) { + return RubyFixnum.zero(context.getRuntime()); + } + if (value > otherValue) { + return RubyFixnum.one(context.getRuntime()); + } + return RubyFixnum.minus_one(context.getRuntime()); + } + + /** fix_gt + * + */ + @JRubyMethod(name = ">") + public IRubyObject op_gt(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return RubyBoolean.newBoolean(context.getRuntime(), value > ((RubyFixnum) other).value); + } + return coerceRelOp(context, ">", other); + } + + /** fix_ge + * + */ + @JRubyMethod(name = ">=") + public IRubyObject op_ge(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return RubyBoolean.newBoolean(context.getRuntime(), value >= ((RubyFixnum) other).value); + } + return coerceRelOp(context, ">=", other); + } + + /** fix_lt + * + */ + @JRubyMethod(name = "<") + public IRubyObject op_lt(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return RubyBoolean.newBoolean(context.getRuntime(), value < ((RubyFixnum) other).value); + } + + return coerceRelOp(context, "<", other); + } + + /** fix_le + * + */ + @JRubyMethod(name = "<=") + public IRubyObject op_le(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum) { + return RubyBoolean.newBoolean(context.getRuntime(), value <= ((RubyFixnum) other).value); + } + + return coerceRelOp(context, "<=", other); + } + + /** fix_rev + * + */ + @JRubyMethod(name = "~") + public IRubyObject op_neg() { + return newFixnum(~value); + } + + /** fix_and + * + */ + @JRubyMethod(name = "&") + public IRubyObject op_and(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum || (other = fixCoerce(other)) instanceof RubyFixnum) { + return newFixnum(context.getRuntime(), value & ((RubyFixnum) other).value); + } + return ((RubyBignum) other).op_and(context, this); + } + + /** fix_or + * + */ + @JRubyMethod(name = "|") + public IRubyObject op_or(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum || (other = fixCoerce(other)) instanceof RubyFixnum) { + return newFixnum(context.getRuntime(), value | ((RubyFixnum) other).value); + } + return ((RubyBignum) other).op_or(context, this); + } + + /** fix_xor + * + */ + @JRubyMethod(name = "^") + public IRubyObject op_xor(ThreadContext context, IRubyObject other) { + if (other instanceof RubyFixnum || (other = fixCoerce(other)) instanceof RubyFixnum) { + return newFixnum(context.getRuntime(), value ^ ((RubyFixnum) other).value); + } + return ((RubyBignum) other).op_xor(context, this); + } + + /** fix_aref + * + */ + @JRubyMethod(name = "[]") + public IRubyObject op_aref(IRubyObject other) { + if(!(other instanceof RubyFixnum) && !((other = fixCoerce(other)) instanceof RubyFixnum)) { + RubyBignum big = (RubyBignum) other; + RubyObject tryFix = RubyBignum.bignorm(getRuntime(), big.getValue()); + if (!(tryFix instanceof RubyFixnum)) { + return big.getValue().signum() == 0 || value >= 0 ? RubyFixnum.zero(getRuntime()) : RubyFixnum.one(getRuntime()); + } + } + + long otherValue = fix2long(other); + + if (otherValue < 0) return RubyFixnum.zero(getRuntime()); + + if (BIT_SIZE - 1 < otherValue) { + return value < 0 ? RubyFixnum.one(getRuntime()) : RubyFixnum.zero(getRuntime()); + } + + return (value & (1L << otherValue)) == 0 ? RubyFixnum.zero(getRuntime()) : RubyFixnum.one(getRuntime()); + } + + /** fix_lshift + * + */ + @JRubyMethod(name = "<<") + public IRubyObject op_lshift(IRubyObject other) { + if (!(other instanceof RubyFixnum)) return RubyBignum.newBignum(getRuntime(), value).op_lshift(other); + + long width = ((RubyFixnum)other).getLongValue(); + + return width < 0 ? rshift(-width) : lshift(width); + } + + private IRubyObject lshift(long width) { + if (width > BIT_SIZE - 1 || ((~0L << BIT_SIZE - width - 1) & value) != 0) { + return RubyBignum.newBignum(getRuntime(), value).op_lshift(RubyFixnum.newFixnum(getRuntime(), width)); + } + return RubyFixnum.newFixnum(getRuntime(), value << width); + } + + /** fix_rshift + * + */ + @JRubyMethod(name = ">>") + public IRubyObject op_rshift(IRubyObject other) { + if (!(other instanceof RubyFixnum)) return RubyBignum.newBignum(getRuntime(), value).op_rshift(other); + + long width = ((RubyFixnum)other).getLongValue(); + + if (width == 0) return this; + + return width < 0 ? lshift(-width) : rshift(width); + } + + private IRubyObject rshift(long width) { + if (width >= BIT_SIZE - 1) { + return value < 0 ? RubyFixnum.minus_one(getRuntime()) : RubyFixnum.zero(getRuntime()); + } + return RubyFixnum.newFixnum(getRuntime(), value >> width); + } + + /** fix_to_f + * + */ + @JRubyMethod + public IRubyObject to_f() { + return RubyFloat.newFloat(getRuntime(), (double) value); + } + + /** fix_size + * + */ + @JRubyMethod + public IRubyObject size() { + return newFixnum((long) ((BIT_SIZE + 7) / 8)); + } + + /** fix_zero_p + * + */ + @JRubyMethod(name = "zero?") + public IRubyObject zero_p() { + return RubyBoolean.newBoolean(getRuntime(), value == 0); + } + + @JRubyMethod + @Override + public IRubyObject id() { + if (value <= Long.MAX_VALUE / 2 && value >= Long.MIN_VALUE / 2) { + return newFixnum(2 * value + 1); + } + + return super.id(); + } + + @Override + public IRubyObject taint(ThreadContext context) { + return this; + } + + @Override + public IRubyObject freeze(ThreadContext context) { + return this; + } + + // Piece of mri rb_to_id + @Override + public String asJavaString() { + getRuntime().getWarnings().warn(ID.FIXNUMS_NOT_SYMBOLS, "do not use Fixnums as Symbols"); + + // FIXME: I think this chunk is equivalent to MRI id2name (and not our public method + // id2name). Make into method if used more than once. + RubySymbol symbol = RubySymbol.getSymbolLong(getRuntime(), value); + + if (symbol == null) { + throw getRuntime().newArgumentError("" + value + " is not a symbol"); + } + + return symbol.asJavaString(); + } + + public static RubyFixnum unmarshalFrom(UnmarshalStream input) throws java.io.IOException { + return input.getRuntime().newFixnum(input.unmarshalInt()); + } + + /* ================ + * Singleton Methods + * ================ + */ + + /** rb_fix_induced_from + * + */ + @JRubyMethod(meta = true) + public static IRubyObject induced_from(IRubyObject recv, IRubyObject other) { + return RubyNumeric.num2fix(other); + } + + @Override + public IRubyObject to_java() { + return MiniJava.javaToRuby(getRuntime(), Long.valueOf(value)); + } + + @Override + public IRubyObject as(Class javaClass) { + return MiniJava.javaToRuby(getRuntime(), coerceToJavaType(getRuntime(), this, javaClass)); + } + + private static Object coerceToJavaType(Ruby ruby, RubyFixnum self, Class javaClass) { + if (!Number.class.isAssignableFrom(javaClass)) { + throw ruby.newTypeError(javaClass.getCanonicalName() + " is not a numeric type"); + } + + TypeCoercer coercer = JAVA_COERCERS.get(javaClass); + + if (coercer == null) { + throw ruby.newTypeError("Cannot coerce Fixnum to " + javaClass.getCanonicalName()); + } + + return coercer.coerce(self); + } + + private static final Map<Class, TypeCoercer> JAVA_COERCERS = new HashMap<Class, TypeCoercer>(); + + static { + TypeCoercer intCoercer = new TypeCoercer() { + public Object coerce(IRubyObject self) { + RubyFixnum fixnum = (RubyFixnum)self; + + if (fixnum.value > Integer.MAX_VALUE) { + throw self.getRuntime().newRangeError("Fixnum " + fixnum.value + " is too large for Java int"); + } + + return Integer.valueOf((int)fixnum.value); + } + }; + JAVA_COERCERS.put(int.class, intCoercer); + JAVA_COERCERS.put(Integer.class, intCoercer); + } +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Don Schwartz <schwardo@users.sourceforge.net> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import static org.jruby.util.Numeric.f_expt; +import static org.jruby.util.Numeric.f_mul; +import static org.jruby.util.Numeric.f_to_i; +import static org.jruby.util.Numeric.frexp; +import static org.jruby.util.Numeric.ldexp; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; + +/** + * A representation of a float object + */ +@JRubyClass(name="Float", parent="Numeric", include="Precision") +public class RubyFloat extends RubyNumeric { + + public static RubyClass createFloatClass(Ruby runtime) { + RubyClass floatc = runtime.defineClass("Float", runtime.getNumeric(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setFloat(floatc); + floatc.index = ClassIndex.FLOAT; + floatc.kindOf = new RubyModule.KindOf() { + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyFloat; + } + }; + + floatc.getSingletonClass().undefineMethod("new"); + floatc.includeModule(runtime.getPrecision()); + + // Java Doubles are 64 bit long: + floatc.defineConstant("ROUNDS", RubyFixnum.newFixnum(runtime, 1)); + floatc.defineConstant("RADIX", RubyFixnum.newFixnum(runtime, 2)); + floatc.defineConstant("MANT_DIG", RubyFixnum.newFixnum(runtime, 53)); + floatc.defineConstant("DIG", RubyFixnum.newFixnum(runtime, 15)); + // Double.MAX_EXPONENT since Java 1.6 + floatc.defineConstant("MIN_EXP", RubyFixnum.newFixnum(runtime, -1021)); + // Double.MAX_EXPONENT since Java 1.6 + floatc.defineConstant("MAX_EXP", RubyFixnum.newFixnum(runtime, 1024)); + floatc.defineConstant("MIN_10_EXP", RubyFixnum.newFixnum(runtime, -307)); + floatc.defineConstant("MAX_10_EXP", RubyFixnum.newFixnum(runtime, 308)); + floatc.defineConstant("MIN", RubyFloat.newFloat(runtime, Double.MIN_VALUE)); + floatc.defineConstant("MAX", RubyFloat.newFloat(runtime, Double.MAX_VALUE)); + floatc.defineConstant("EPSILON", RubyFloat.newFloat(runtime, 2.2204460492503131e-16)); + + floatc.defineAnnotatedMethods(RubyFloat.class); + + return floatc; + } + + private final double value; + + public int getNativeTypeIndex() { + return ClassIndex.FLOAT; + } + + public RubyFloat(Ruby runtime) { + this(runtime, 0.0); + } + + public RubyFloat(Ruby runtime, double value) { + super(runtime, runtime.getFloat()); + this.value = value; + } + + public Class<?> getJavaClass() { + // this needs to be thought out more along with the changes in RubyFixnum + // since "to Object" coercion will generally want to produce the same + // type every time +// if (value >= Float.MIN_VALUE && value <= Float.MAX_VALUE) { +// return float.class; +// } + return double.class; + } + + /** Getter for property value. + * @return Value of property value. + */ + public double getValue() { + return this.value; + } + + public double getDoubleValue() { + return value; + } + + public long getLongValue() { + return (long) value; + } + + public RubyFloat convertToFloat() { + return this; + } + + protected int compareValue(RubyNumeric other) { + double otherVal = other.getDoubleValue(); + return getValue() > otherVal ? 1 : getValue() < otherVal ? -1 : 0; + } + + public static RubyFloat newFloat(Ruby runtime, double value) { + return new RubyFloat(runtime, value); + } + + /* ================ + * Instance Methods + * ================ + */ + + /** rb_flo_induced_from + * + */ + @JRubyMethod(required = 1, meta = true) + public static IRubyObject induced_from(ThreadContext context, IRubyObject recv, IRubyObject number) { + if (number instanceof RubyFixnum || number instanceof RubyBignum || number instanceof RubyRational) { + return number.callMethod(context, MethodIndex.TO_F, "to_f"); + } else if (number instanceof RubyFloat) { + return number; + } + throw recv.getRuntime().newTypeError( + "failed to convert " + number.getMetaClass() + " into Float"); + } + + private final static DecimalFormat FORMAT = new DecimalFormat("##############0.0##############", + new DecimalFormatSymbols(Locale.ENGLISH)); + + /** flo_to_s + * + */ + @JRubyMethod(name = "to_s") + public IRubyObject to_s() { + if (Double.isInfinite(value)) { + return RubyString.newString(getRuntime(), value < 0 ? "-Infinity" : "Infinity"); + } + + if (Double.isNaN(value)) { + return RubyString.newString(getRuntime(), "NaN"); + } + + String val = ""+value; + + if(val.indexOf('E') != -1) { + String v2 = FORMAT.format(value); + int ix = v2.length()-1; + while(v2.charAt(ix) == '0' && v2.charAt(ix-1) != '.') { + ix--; + } + if(ix > 15 || "0.0".equals(v2.substring(0,ix+1))) { + val = val.replaceFirst("E(\\d)","e+$1").replaceFirst("E-","e-"); + } else { + val = v2.substring(0,ix+1); + } + } + + return RubyString.newString(getRuntime(), val); + } + + /** flo_coerce + * + */ + @JRubyMethod(name = "coerce", required = 1) + public IRubyObject coerce(IRubyObject other) { + return getRuntime().newArray(RubyKernel.new_float(this, other), this); + } + + /** flo_uminus + * + */ + @JRubyMethod(name = "-@") + public IRubyObject op_uminus() { + return RubyFloat.newFloat(getRuntime(), -value); + } + + /** flo_plus + * + */ + @JRubyMethod(name = "+", required = 1) + public IRubyObject op_plus(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + return RubyFloat.newFloat(getRuntime(), value + ((RubyNumeric) other).getDoubleValue()); + default: + return coerceBin(context, "+", other); + } + } + + /** flo_minus + * + */ + @JRubyMethod(name = "-", required = 1) + public IRubyObject op_minus(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + return RubyFloat.newFloat(getRuntime(), value - ((RubyNumeric) other).getDoubleValue()); + default: + return coerceBin(context, "-", other); + } + } + + /** flo_mul + * + */ + @JRubyMethod(name = "*", required = 1) + public IRubyObject op_mul(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + return RubyFloat.newFloat( + getRuntime(), value * ((RubyNumeric) other).getDoubleValue()); + default: + return coerceBin(context, "*", other); + } + } + + /** flo_div + * + */ + @JRubyMethod(name = "/", required = 1) + public IRubyObject op_fdiv(ThreadContext context, IRubyObject other) { // don't override Numeric#div ! + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + return RubyFloat.newFloat(getRuntime(), value / ((RubyNumeric) other).getDoubleValue()); + default: + return coerceBin(context, "/", other); + } + } + + /** flo_mod + * + */ + @JRubyMethod(name = {"%", "modulo"}, required = 1) + public IRubyObject op_mod(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + double y = ((RubyNumeric) other).getDoubleValue(); + // Modelled after c ruby implementation (java /,% not same as ruby) + double x = value; + + double mod = Math.IEEEremainder(x, y); + if (y * mod < 0) { + mod += y; + } + + return RubyFloat.newFloat(getRuntime(), mod); + default: + return coerceBin(context, "%", other); + } + } + + /** flo_divmod + * + */ + @JRubyMethod(name = "divmod", required = 1) + public IRubyObject divmod(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + double y = ((RubyNumeric) other).getDoubleValue(); + double x = value; + + double mod = Math.IEEEremainder(x, y); + // MRI behavior: + if (Double.isNaN(mod)) { + throw getRuntime().newFloatDomainError("NaN"); + } + double div = Math.floor(x / y); + + if (y * mod < 0) { + mod += y; + } + final Ruby runtime = getRuntime(); + IRubyObject car = dbl2num(runtime, div); + RubyFloat cdr = RubyFloat.newFloat(runtime, mod); + return RubyArray.newArray(runtime, car, cdr); + default: + return coerceBin(context, "divmod", other); + } + } + + /** flo_pow + * + */ + @JRubyMethod(name = "**", required = 1) + public IRubyObject op_pow(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + return RubyFloat.newFloat(getRuntime(), Math.pow(value, ((RubyNumeric) other) + .getDoubleValue())); + default: + return coerceBin(context, "**", other); + } + } + + /** flo_eq + * + */ + @JRubyMethod(name = "==", required = 1) + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + if (Double.isNaN(value)) { + return getRuntime().getFalse(); + } + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + return RubyBoolean.newBoolean(getRuntime(), value == ((RubyNumeric) other) + .getDoubleValue()); + default: + // Numeric.equal + return super.op_num_equal(context, other); + } + } + + /** flo_cmp + * + */ + @JRubyMethod(name = "<=>", required = 1) + public IRubyObject op_cmp(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + double b = ((RubyNumeric) other).getDoubleValue(); + return dbl_cmp(getRuntime(), value, b); + default: + return coerceCmp(context, "<=>", other); + } + } + + /** flo_gt + * + */ + @JRubyMethod(name = ">", required = 1) + public IRubyObject op_gt(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + double b = ((RubyNumeric) other).getDoubleValue(); + return RubyBoolean.newBoolean(getRuntime(), !Double.isNaN(b) && value > b); + default: + return coerceRelOp(context, ">", other); + } + } + + /** flo_ge + * + */ + @JRubyMethod(name = ">=", required = 1) + public IRubyObject op_ge(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + double b = ((RubyNumeric) other).getDoubleValue(); + return RubyBoolean.newBoolean(getRuntime(), !Double.isNaN(b) && value >= b); + default: + return coerceRelOp(context, ">=", other); + } + } + + /** flo_lt + * + */ + @JRubyMethod(name = "<", required = 1) + public IRubyObject op_lt(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + double b = ((RubyNumeric) other).getDoubleValue(); + return RubyBoolean.newBoolean(getRuntime(), !Double.isNaN(b) && value < b); + default: + return coerceRelOp(context, "<", other); + } + } + + /** flo_le + * + */ + @JRubyMethod(name = "<=", required = 1) + public IRubyObject op_le(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + case ClassIndex.FLOAT: + double b = ((RubyNumeric) other).getDoubleValue(); + return RubyBoolean.newBoolean(getRuntime(), !Double.isNaN(b) && value <= b); + default: + return coerceRelOp(context, "<=", other); + } + } + + /** flo_eql + * + */ + @JRubyMethod(name = "eql?", required = 1) + public IRubyObject eql_p(IRubyObject other) { + if (other instanceof RubyFloat) { + double b = ((RubyFloat) other).value; + if (Double.isNaN(value) || Double.isNaN(b)) { + return getRuntime().getFalse(); + } + if (value == b) { + return getRuntime().getTrue(); + } + } + return getRuntime().getFalse(); + } + + /** flo_hash + * + */ + @JRubyMethod(name = "hash") + public RubyFixnum hash() { + return getRuntime().newFixnum(hashCode()); + } + + public final int hashCode() { + long l = Double.doubleToLongBits(value); + return (int)(l ^ l >>> 32); + } + + /** flo_fo + * + */ + @JRubyMethod(name = "to_f") + public IRubyObject to_f() { + return this; + } + + /** flo_abs + * + */ + @JRubyMethod(name = "abs") + public IRubyObject abs() { + if (Double.doubleToLongBits(value) < 0) { + return RubyFloat.newFloat(getRuntime(), Math.abs(value)); + } + return this; + } + + /** flo_zero_p + * + */ + @JRubyMethod(name = "zero?") + public IRubyObject zero_p() { + return RubyBoolean.newBoolean(getRuntime(), value == 0.0); + } + + /** flo_truncate + * + */ + @JRubyMethod(name = {"truncate", "to_i", "to_int"}) + public IRubyObject truncate() { + double f = value; + if (f > 0.0) f = Math.floor(f); + if (f < 0.0) f = Math.ceil(f); + + return dbl2num(getRuntime(), f); + } + + /** float_to_r, float_decode + * + */ + static final int DBL_MANT_DIG = 53; + static final int FLT_RADIX = 2; + @JRubyMethod(name = "to_r", compat = CompatVersion.RUBY1_9) + public IRubyObject to_r(ThreadContext context) { + long[]exp = new long[1]; + double f = frexp(value, exp); + f = ldexp(f, DBL_MANT_DIG); + long n = exp[0] - DBL_MANT_DIG; + Ruby runtime = context.getRuntime(); + IRubyObject x = f_mul(context, f_to_i(context, runtime.newFloat(f)), + f_expt(context, + RubyFixnum.newFixnum(context.getRuntime(), FLT_RADIX), + RubyFixnum.newFixnum(runtime, n))); + return x; + } + + /** floor + * + */ + @JRubyMethod(name = "floor") + public IRubyObject floor() { + return dbl2num(getRuntime(), Math.floor(value)); + } + + /** flo_ceil + * + */ + @JRubyMethod(name = "ceil") + public IRubyObject ceil() { + return dbl2num(getRuntime(), Math.ceil(value)); + } + + /** flo_round + * + */ + @JRubyMethod(name = "round") + public IRubyObject round() { + double f = value; + if (f > 0.0) { + f = Math.floor(f + 0.5); + } + if (f < 0.0) { + f = Math.ceil(f - 0.5); + } + return dbl2num(getRuntime(), f); + } + + /** flo_is_nan_p + * + */ + @JRubyMethod(name = "nan?") + public IRubyObject nan_p() { + return RubyBoolean.newBoolean(getRuntime(), Double.isNaN(value)); + } + + /** flo_is_infinite_p + * + */ + @JRubyMethod(name = "infinite?") + public IRubyObject infinite_p() { + if (Double.isInfinite(value)) { + return RubyFixnum.newFixnum(getRuntime(), value < 0 ? -1 : 1); + } + return getRuntime().getNil(); + } + + /** flo_is_finite_p + * + */ + @JRubyMethod(name = "finite?") + public IRubyObject finite_p() { + if (Double.isInfinite(value) || Double.isNaN(value)) { + return getRuntime().getFalse(); + } + return getRuntime().getTrue(); + } + + public static void marshalTo(RubyFloat aFloat, MarshalStream output) throws java.io.IOException { + output.registerLinkTarget(aFloat); + + String strValue = aFloat.toString(); + + if (Double.isInfinite(aFloat.value)) { + strValue = aFloat.value < 0 ? "-inf" : "inf"; + } else if (Double.isNaN(aFloat.value)) { + strValue = "nan"; + } + output.writeString(strValue); + } + + public static RubyFloat unmarshalFrom(UnmarshalStream input) throws java.io.IOException { + RubyFloat result = RubyFloat.newFloat(input.getRuntime(), org.jruby.util.Convert.byteListToDouble(input.unmarshalString(),false)); + input.registerLinkTarget(result); + return result; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * GC (Garbage Collection) Module + * + * Note: Since we rely on Java's memory model we can't provide the + * kind of control over garbage collection that MRI provides. + * + * @author Anders + */ +@JRubyModule(name="GC") +public class RubyGC { + public static RubyModule createGCModule(Ruby runtime) { + RubyModule result = runtime.defineModule("GC"); + runtime.setGC(result); + + result.defineAnnotatedMethods(RubyGC.class); + + return result; + } + + @JRubyMethod(module = true, visibility = Visibility.PRIVATE) + public static IRubyObject start(IRubyObject recv) { + System.gc(); + return recv.getRuntime().getNil(); + } + + @JRubyMethod + public static IRubyObject garbage_collect(IRubyObject recv) { + System.gc(); + return recv.getRuntime().getNil(); + } + + @JRubyMethod(module = true, visibility = Visibility.PRIVATE) + public static IRubyObject enable(IRubyObject recv) { + recv.getRuntime().getWarnings().warn(ID.EMPTY_IMPLEMENTATION, "GC.enable will not work on JRuby", "GC.enable"); + return recv.getRuntime().getNil(); + } + + @JRubyMethod(module = true, visibility = Visibility.PRIVATE) + public static IRubyObject disable(IRubyObject recv) { + recv.getRuntime().getWarnings().warn(ID.EMPTY_IMPLEMENTATION, "GC.disable will not work on JRuby", "GC.disable"); + return recv.getRuntime().getNil(); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Tim Azzopardi <tim@tigerfive.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2006 Michael Studman <codehaus@michaelstudman.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.util.io.STDIO; +import java.util.HashMap; +import java.util.Map; + +import org.jruby.anno.JRubyMethod; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.environment.OSEnvironmentReaderExcepton; +import org.jruby.environment.OSEnvironment; +import org.jruby.internal.runtime.ValueAccessor; +import org.jruby.javasupport.JavaUtil; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Constants; +import org.jruby.runtime.GlobalVariable; +import org.jruby.runtime.IAccessor; +import org.jruby.runtime.ReadonlyGlobalVariable; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.KCode; + +/** This class initializes global variables and constants. + * + * @author jpetersen + */ +public class RubyGlobal { + + /** + * Obligate string-keyed and string-valued hash, used for ENV and ENV_JAVA + * + */ + public static class StringOnlyRubyHash extends RubyHash { + + public StringOnlyRubyHash(Ruby runtime, Map valueMap, IRubyObject defaultValue) { + super(runtime, valueMap, defaultValue); + } + + @Override + public RubyHash to_hash() { + Ruby runtime = getRuntime(); + RubyHash hash = RubyHash.newHash(runtime); + hash.replace(runtime.getCurrentContext(), this); + return hash; + } + + @Override + public IRubyObject op_aref(ThreadContext context, IRubyObject key) { + return super.op_aref(context, key.convertToString()); + } + + @Override + public IRubyObject op_aset(ThreadContext context, IRubyObject key, IRubyObject value) { + if (!key.respondsTo("to_str")) { + throw getRuntime().newTypeError("can't convert " + key.getMetaClass() + " into String"); + } + if (!value.respondsTo("to_str") && !value.isNil()) { + throw getRuntime().newTypeError("can't convert " + value.getMetaClass() + " into String"); + } + + if (value.isNil()) { + return super.delete(context, key, org.jruby.runtime.Block.NULL_BLOCK); + } + + //return super.aset(getRuntime().newString("sadfasdF"), getRuntime().newString("sadfasdF")); + return super.op_aset(context, RuntimeHelpers.invoke(context, key, "to_str"), + value.isNil() ? getRuntime().getNil() : RuntimeHelpers.invoke(context, value, "to_str")); + } + + @JRubyMethod + @Override + public IRubyObject to_s(){ + return getRuntime().newString("ENV"); + } + } + + public static void createGlobals(ThreadContext context, Ruby runtime) { + runtime.defineGlobalConstant("TOPLEVEL_BINDING", runtime.newBinding()); + + runtime.defineGlobalConstant("TRUE", runtime.getTrue()); + runtime.defineGlobalConstant("FALSE", runtime.getFalse()); + runtime.defineGlobalConstant("NIL", runtime.getNil()); + + // define ARGV and $* for this runtime + RubyArray argvArray = runtime.newArray(); + String[] argv = runtime.getInstanceConfig().getArgv(); + for (int i = 0; i < argv.length; i++) { + argvArray.append(RubyString.newString(runtime, argv[i].getBytes())); + } + runtime.defineGlobalConstant("ARGV", argvArray); + runtime.getGlobalVariables().defineReadonly("$*", new ValueAccessor(argvArray)); + + IAccessor d = new ValueAccessor(runtime.newString( + runtime.getInstanceConfig().displayedFileName())); + runtime.getGlobalVariables().define("$PROGRAM_NAME", d); + runtime.getGlobalVariables().define("$0", d); + + // Version information: + IRubyObject version = runtime.newString(Constants.RUBY_VERSION).freeze(context); + IRubyObject release = runtime.newString(Constants.COMPILE_DATE).freeze(context); + IRubyObject platform = runtime.newString(Constants.PLATFORM).freeze(context); + IRubyObject engine = runtime.newString(Constants.ENGINE).freeze(context); + + runtime.defineGlobalConstant("RUBY_VERSION", version); + runtime.defineGlobalConstant("RUBY_PATCHLEVEL", runtime.newString(Constants.RUBY_PATCHLEVEL).freeze(context)); + runtime.defineGlobalConstant("RUBY_RELEASE_DATE", release); + runtime.defineGlobalConstant("RUBY_PLATFORM", platform); + runtime.defineGlobalConstant("RUBY_ENGINE", engine); + + runtime.defineGlobalConstant("VERSION", version); + runtime.defineGlobalConstant("RELEASE_DATE", release); + runtime.defineGlobalConstant("PLATFORM", platform); + + IRubyObject jrubyVersion = runtime.newString(Constants.VERSION).freeze(context); + runtime.defineGlobalConstant("JRUBY_VERSION", jrubyVersion); + + GlobalVariable kcodeGV = new KCodeGlobalVariable(runtime, "$KCODE", runtime.newString("NONE")); + runtime.defineVariable(kcodeGV); + runtime.defineVariable(new GlobalVariable.Copy(runtime, "$-K", kcodeGV)); + IRubyObject defaultRS = runtime.newString(runtime.getInstanceConfig().getRecordSeparator()).freeze(context); + GlobalVariable rs = new StringGlobalVariable(runtime, "$/", defaultRS); + runtime.defineVariable(rs); + runtime.setRecordSeparatorVar(rs); + runtime.getGlobalVariables().setDefaultSeparator(defaultRS); + runtime.defineVariable(new StringGlobalVariable(runtime, "$\\", runtime.getNil())); + runtime.defineVariable(new StringGlobalVariable(runtime, "$,", runtime.getNil())); + + runtime.defineVariable(new LineNumberGlobalVariable(runtime, "$.", RubyFixnum.one(runtime))); + runtime.defineVariable(new LastlineGlobalVariable(runtime, "$_")); + runtime.defineVariable(new LastExitStatusVariable(runtime, "$?")); + + runtime.defineVariable(new ErrorInfoGlobalVariable(runtime, "$!", runtime.getNil())); + runtime.defineVariable(new NonEffectiveGlobalVariable(runtime, "$=", runtime.getFalse())); + + if(runtime.getInstanceConfig().getInputFieldSeparator() == null) { + runtime.defineVariable(new GlobalVariable(runtime, "$;", runtime.getNil())); + } else { + runtime.defineVariable(new GlobalVariable(runtime, "$;", RubyRegexp.newRegexp(runtime, runtime.getInstanceConfig().getInputFieldSeparator(), 0))); + } + + Boolean verbose = runtime.getInstanceConfig().getVerbose(); + IRubyObject verboseValue = null; + if (verbose == null) { + verboseValue = runtime.getNil(); + } else if(verbose == Boolean.TRUE) { + verboseValue = runtime.getTrue(); + } else { + verboseValue = runtime.getFalse(); + } + runtime.defineVariable(new VerboseGlobalVariable(runtime, "$VERBOSE", verboseValue)); + + IRubyObject debug = runtime.newBoolean(runtime.getInstanceConfig().isDebug()); + runtime.defineVariable(new DebugGlobalVariable(runtime, "$DEBUG", debug)); + runtime.defineVariable(new DebugGlobalVariable(runtime, "$-d", debug)); + + runtime.defineVariable(new SafeGlobalVariable(runtime, "$SAFE")); + + runtime.defineVariable(new BacktraceGlobalVariable(runtime, "$@")); + + IRubyObject stdin = new RubyIO(runtime, STDIO.IN); + IRubyObject stdout = new RubyIO(runtime, STDIO.OUT); + IRubyObject stderr = new RubyIO(runtime, STDIO.ERR); + + runtime.defineVariable(new InputGlobalVariable(runtime, "$stdin", stdin)); + + runtime.defineVariable(new OutputGlobalVariable(runtime, "$stdout", stdout)); + runtime.getGlobalVariables().alias("$>", "$stdout"); + runtime.getGlobalVariables().alias("$defout", "$stdout"); + + runtime.defineVariable(new OutputGlobalVariable(runtime, "$stderr", stderr)); + runtime.getGlobalVariables().alias("$deferr", "$stderr"); + + runtime.defineGlobalConstant("STDIN", stdin); + runtime.defineGlobalConstant("STDOUT", stdout); + runtime.defineGlobalConstant("STDERR", stderr); + + runtime.defineVariable(new LoadedFeatures(runtime, "$\"")); + runtime.defineVariable(new LoadedFeatures(runtime, "$LOADED_FEATURES")); + + runtime.defineVariable(new LoadPath(runtime, "$:")); + runtime.defineVariable(new LoadPath(runtime, "$-I")); + runtime.defineVariable(new LoadPath(runtime, "$LOAD_PATH")); + + runtime.defineVariable(new MatchMatchGlobalVariable(runtime, "$&")); + runtime.defineVariable(new PreMatchGlobalVariable(runtime, "$`")); + runtime.defineVariable(new PostMatchGlobalVariable(runtime, "$'")); + runtime.defineVariable(new LastMatchGlobalVariable(runtime, "$+")); + runtime.defineVariable(new BackRefGlobalVariable(runtime, "$~")); + + // On platforms without a c-library accessable through JNA, getpid will return hashCode + // as $$ used to. Using $$ to kill processes could take down many runtimes, but by basing + // $$ on getpid() where available, we have the same semantics as MRI. + runtime.getGlobalVariables().defineReadonly("$$", new ValueAccessor(runtime.newFixnum(runtime.getPosix().getpid()))); + + // after defn of $stderr as the call may produce warnings + defineGlobalEnvConstants(runtime); + + // Fixme: Do we need the check or does Main.java not call this...they should consolidate + if (runtime.getGlobalVariables().get("$*").isNil()) { + runtime.getGlobalVariables().defineReadonly("$*", new ValueAccessor(runtime.newArray())); + } + + runtime.getGlobalVariables().defineReadonly("$-p", + new ValueAccessor(runtime.getInstanceConfig().isAssumePrinting() ? runtime.getTrue() : runtime.getNil())); + runtime.getGlobalVariables().defineReadonly("$-n", + new ValueAccessor(runtime.getInstanceConfig().isAssumeLoop() ? runtime.getTrue() : runtime.getNil())); + runtime.getGlobalVariables().defineReadonly("$-a", + new ValueAccessor(runtime.getInstanceConfig().isSplit() ? runtime.getTrue() : runtime.getNil())); + runtime.getGlobalVariables().defineReadonly("$-l", + new ValueAccessor(runtime.getInstanceConfig().isProcessLineEnds() ? runtime.getTrue() : runtime.getNil())); + + // ARGF, $< object + RubyArgsFile.initArgsFile(runtime); + } + + private static void defineGlobalEnvConstants(Ruby runtime) { + + Map environmentVariableMap = null; + OSEnvironment environment = new OSEnvironment(); + try { + environmentVariableMap = environment.getEnvironmentVariableMap(runtime); + } catch (OSEnvironmentReaderExcepton e) { + // If the environment variables are not accessible shouldn't terminate + runtime.getWarnings().warn(ID.MISCELLANEOUS, e.getMessage()); + } + + if (environmentVariableMap == null) { + // if the environment variables can't be obtained, define an empty ENV + environmentVariableMap = new HashMap(); + } + + StringOnlyRubyHash h1 = new StringOnlyRubyHash(runtime, + environmentVariableMap, runtime.getNil()); + h1.getSingletonClass().defineAnnotatedMethods(StringOnlyRubyHash.class); + runtime.defineGlobalConstant("ENV", h1); + + // Define System.getProperties() in ENV_JAVA + Map systemProps = environment.getSystemPropertiesMap(runtime); + runtime.defineGlobalConstant("ENV_JAVA", new StringOnlyRubyHash( + runtime, systemProps, runtime.getNil())); + + } + + private static class NonEffectiveGlobalVariable extends GlobalVariable { + public NonEffectiveGlobalVariable(Ruby runtime, String name, IRubyObject value) { + super(runtime, name, value); + } + + @Override + public IRubyObject set(IRubyObject value) { + runtime.getWarnings().warn(ID.INEFFECTIVE_GLOBAL, "warning: variable " + name + " is no longer effective; ignored", name); + return value; + } + + @Override + public IRubyObject get() { + runtime.getWarnings().warn(ID.INEFFECTIVE_GLOBAL, "warning: variable " + name + " is no longer effective", name); + return runtime.getFalse(); + } + } + + private static class LastExitStatusVariable extends GlobalVariable { + public LastExitStatusVariable(Ruby runtime, String name) { + super(runtime, name, runtime.getNil()); + } + + @Override + public IRubyObject get() { + IRubyObject lastExitStatus = runtime.getCurrentContext().getLastExitStatus(); + return lastExitStatus == null ? runtime.getNil() : lastExitStatus; + } + + @Override + public IRubyObject set(IRubyObject lastExitStatus) { + runtime.getCurrentContext().setLastExitStatus(lastExitStatus); + + return lastExitStatus; + } + } + + private static class MatchMatchGlobalVariable extends GlobalVariable { + public MatchMatchGlobalVariable(Ruby runtime, String name) { + super(runtime, name, runtime.getNil()); + } + + @Override + public IRubyObject get() { + return RubyRegexp.last_match(runtime.getCurrentContext().getCurrentFrame().getBackRef()); + } + } + + private static class PreMatchGlobalVariable extends GlobalVariable { + public PreMatchGlobalVariable(Ruby runtime, String name) { + super(runtime, name, runtime.getNil()); + } + + @Override + public IRubyObject get() { + return RubyRegexp.match_pre(runtime.getCurrentContext().getCurrentFrame().getBackRef()); + } + } + + private static class PostMatchGlobalVariable extends GlobalVariable { + public PostMatchGlobalVariable(Ruby runtime, String name) { + super(runtime, name, runtime.getNil()); + } + + @Override + public IRubyObject get() { + return RubyRegexp.match_post(runtime.getCurrentContext().getCurrentFrame().getBackRef()); + } + } + + private static class LastMatchGlobalVariable extends GlobalVariable { + public LastMatchGlobalVariable(Ruby runtime, String name) { + super(runtime, name, runtime.getNil()); + } + + @Override + public IRubyObject get() { + return RubyRegexp.match_last(runtime.getCurrentContext().getCurrentFrame().getBackRef()); + } + } + + private static class BackRefGlobalVariable extends GlobalVariable { + public BackRefGlobalVariable(Ruby runtime, String name) { + super(runtime, name, runtime.getNil()); + } + + @Override + public IRubyObject get() { + return RuntimeHelpers.getBackref(runtime, runtime.getCurrentContext()); + } + + @Override + public IRubyObject set(IRubyObject value) { + RuntimeHelpers.setBackref(runtime, runtime.getCurrentContext(), value); + return value; + } + } + + // Accessor methods. + + private static class LineNumberGlobalVariable extends GlobalVariable { + public LineNumberGlobalVariable(Ruby runtime, String name, RubyFixnum value) { + super(runtime, name, value); + } + + @Override + public IRubyObject set(IRubyObject value) { + RubyArgsFile.setCurrentLineNumber(runtime.getGlobalVariables().get("$<"),RubyNumeric.fix2int(value)); + return super.set(value); + } + } + + private static class ErrorInfoGlobalVariable extends GlobalVariable { + public ErrorInfoGlobalVariable(Ruby runtime, String name, IRubyObject value) { + super(runtime, name, null); + set(value); + } + + @Override + public IRubyObject set(IRubyObject value) { + if (!value.isNil() && + !runtime.getException().isInstance(value) && + !(JavaUtil.isJavaObject(value) && JavaUtil.unwrapJavaObject(value) instanceof Exception)) { + throw runtime.newTypeError("assigning non-exception to $!"); + } + + return runtime.getCurrentContext().setErrorInfo(value); + } + + @Override + public IRubyObject get() { + return runtime.getCurrentContext().getErrorInfo(); + } + } + + // FIXME: move out of this class! + public static class StringGlobalVariable extends GlobalVariable { + public StringGlobalVariable(Ruby runtime, String name, IRubyObject value) { + super(runtime, name, value); + } + + @Override + public IRubyObject set(IRubyObject value) { + if (!value.isNil() && ! (value instanceof RubyString)) { + throw runtime.newTypeError("value of " + name() + " must be a String"); + } + return super.set(value); + } + } + + public static class KCodeGlobalVariable extends GlobalVariable { + public KCodeGlobalVariable(Ruby runtime, String name, IRubyObject value) { + super(runtime, name, value); + } + + @Override + public IRubyObject get() { + return runtime.getKCode().kcode(runtime); + } + + @Override + public IRubyObject set(IRubyObject value) { + runtime.setKCode(KCode.create(runtime, value.convertToString().toString())); + return value; + } + } + + private static class SafeGlobalVariable extends GlobalVariable { + public SafeGlobalVariable(Ruby runtime, String name) { + super(runtime, name, null); + } + + @Override + public IRubyObject get() { + return runtime.newFixnum(runtime.getSafeLevel()); + } + + @Override + public IRubyObject set(IRubyObject value) { +// int level = RubyNumeric.fix2int(value); +// if (level < runtime.getSafeLevel()) { +// throw runtime.newSecurityError("tried to downgrade safe level from " + +// runtime.getSafeLevel() + " to " + level); +// } +// runtime.setSafeLevel(level); + // thread.setSafeLevel(level); + runtime.getWarnings().warn(ID.SAFE_NOT_SUPPORTED, "SAFE levels are not supported in JRuby"); + return RubyFixnum.newFixnum(runtime, runtime.getSafeLevel()); + } + } + + private static class VerboseGlobalVariable extends GlobalVariable { + public VerboseGlobalVariable(Ruby runtime, String name, IRubyObject initialValue) { + super(runtime, name, initialValue); + set(initialValue); + } + + @Override + public IRubyObject get() { + return runtime.getVerbose(); + } + + @Override + public IRubyObject set(IRubyObject newValue) { + if (newValue.isNil()) { + runtime.setVerbose(newValue); + } else { + runtime.setVerbose(runtime.newBoolean(newValue.isTrue())); + } + + return newValue; + } + } + + private static class DebugGlobalVariable extends GlobalVariable { + public DebugGlobalVariable(Ruby runtime, String name, IRubyObject initialValue) { + super(runtime, name, initialValue); + set(initialValue); + } + + @Override + public IRubyObject get() { + return runtime.getDebug(); + } + + @Override + public IRubyObject set(IRubyObject newValue) { + if (newValue.isNil()) { + runtime.setDebug(newValue); + } else { + runtime.setDebug(runtime.newBoolean(newValue.isTrue())); + } + + return newValue; + } + } + + private static class BacktraceGlobalVariable extends GlobalVariable { + public BacktraceGlobalVariable(Ruby runtime, String name) { + super(runtime, name, null); + } + + @Override + public IRubyObject get() { + IRubyObject errorInfo = runtime.getGlobalVariables().get("$!"); + IRubyObject backtrace = errorInfo.isNil() ? runtime.getNil() : errorInfo.callMethod(errorInfo.getRuntime().getCurrentContext(), "backtrace"); + //$@ returns nil if $!.backtrace is not an array + if (!(backtrace instanceof RubyArray)) { + backtrace = runtime.getNil(); + } + return backtrace; + } + + @Override + public IRubyObject set(IRubyObject value) { + if (runtime.getGlobalVariables().get("$!").isNil()) { + throw runtime.newArgumentError("$! not set."); + } + runtime.getGlobalVariables().get("$!").callMethod(value.getRuntime().getCurrentContext(), "set_backtrace", value); + return value; + } + } + + private static class LastlineGlobalVariable extends GlobalVariable { + public LastlineGlobalVariable(Ruby runtime, String name) { + super(runtime, name, null); + } + + @Override + public IRubyObject get() { + return RuntimeHelpers.getLastLine(runtime, runtime.getCurrentContext()); + } + + @Override + public IRubyObject set(IRubyObject value) { + RuntimeHelpers.setLastLine(runtime, runtime.getCurrentContext(), value); + return value; + } + } + + private static class InputGlobalVariable extends GlobalVariable { + public InputGlobalVariable(Ruby runtime, String name, IRubyObject value) { + super(runtime, name, value); + } + + @Override + public IRubyObject set(IRubyObject value) { + if (value == get()) { + return value; + } + + return super.set(value); + } + } + + private static class OutputGlobalVariable extends GlobalVariable { + public OutputGlobalVariable(Ruby runtime, String name, IRubyObject value) { + super(runtime, name, value); + } + + @Override + public IRubyObject set(IRubyObject value) { + if (value == get()) { + return value; + } + if (value instanceof RubyIO) { + RubyIO io = (RubyIO)value; + + // HACK: in order to have stdout/err act like ttys and flush always, + // we set anything assigned to stdout/stderr to sync + io.getHandler().setSync(true); + } + + if (!value.respondsTo("write")) { + throw runtime.newTypeError(name() + " must have write method, " + + value.getType().getName() + " given"); + } + + return super.set(value); + } + } + + private static class LoadPath extends ReadonlyGlobalVariable { + public LoadPath(Ruby runtime, String name) { + super(runtime, name, null); + } + + /** + * @see org.jruby.runtime.GlobalVariable#get() + */ + @Override + public IRubyObject get() { + return runtime.getLoadService().getLoadPath(); + } + } + + private static class LoadedFeatures extends ReadonlyGlobalVariable { + public LoadedFeatures(Ruby runtime, String name) { + super(runtime, name, null); + } + + /** + * @see org.jruby.runtime.GlobalVariable#get() + */ + @Override + public IRubyObject get() { + return runtime.getLoadService().getLoadedFeatures(); + } + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2006 Ola Bini <Ola.Bini@ki.se> + * Copyright (C) 2006 Tim Azzopardi <tim@tigerfive.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2007 MenTaLguY <mental@rydia.net> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; +import java.util.AbstractCollection; +import java.util.AbstractSet; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Set; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.javasupport.JavaUtil; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.ByteList; +import org.jruby.util.TypeConverter; + +// Design overview: +// +// RubyHash is implemented as hash table with a singly-linked list of +// RubyHash.RubyHashEntry objects for each bucket. RubyHashEntry objects +// are also kept in a doubly-linked list which reflects their insertion +// order and is used for iteration. For simplicity, this latter list is +// circular; a dummy RubyHashEntry, RubyHash.head, is used to mark the +// ends of the list. +// +// When an entry is removed from the table, it is also removed from the +// doubly-linked list. However, while the reference to the previous +// RubyHashEntry is cleared (to mark the entry as dead), the reference +// to the next RubyHashEntry is preserved so that iterators are not +// invalidated: any iterator with a reference to a dead entry can climb +// back up into the list of live entries by chasing next references until +// it finds a live entry (or head). +// +// Ordinarily, this scheme would require O(N) time to clear a hash (since +// each RubyHashEntry would need to be visited and unlinked from the +// iteration list), but RubyHash also maintains a generation count. Every +// time the hash is cleared, the doubly-linked list is simply discarded and +// the generation count incremented. Iterators check to see whether the +// generation count has changed; if it has, they reset themselves back to +// the new start of the list. +// +// This design means that iterators are never invalidated by changes to the +// hashtable, and they do not need to modify the structure during their +// lifecycle. +// + +/** Implementation of the Hash class. + * + * Concurrency: no synchronization is required among readers, but + * all users must synchronize externally with writers. + * + */ +@JRubyClass(name = "Hash", include="Enumerable") +public class RubyHash extends RubyObject implements Map { + + public static RubyClass createHashClass(Ruby runtime) { + RubyClass hashc = runtime.defineClass("Hash", runtime.getObject(), HASH_ALLOCATOR); + runtime.setHash(hashc); + hashc.index = ClassIndex.HASH; + hashc.kindOf = new RubyModule.KindOf() { + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyHash; + } + }; + + hashc.includeModule(runtime.getEnumerable()); + + hashc.defineAnnotatedMethods(RubyHash.class); + + return hashc; + } + + private final static ObjectAllocator HASH_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyHash(runtime, klass); + } + }; + + public int getNativeTypeIndex() { + return ClassIndex.HASH; + } + + /** rb_hash_s_create + * + */ + @JRubyMethod(name = "[]", rest = true, frame = true, meta = true) + public static IRubyObject create(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + RubyClass klass = (RubyClass) recv; + Ruby runtime = context.getRuntime(); + RubyHash hash; + + if (args.length == 1) { + IRubyObject tmp = TypeConverter.convertToTypeWithCheck( + args[0], runtime.getHash(), MethodIndex.TO_HASH, "to_hash"); + + if (!tmp.isNil()) { + RubyHash otherHash = (RubyHash) tmp; + return new RubyHash(runtime, klass, otherHash); + } + } + + if ((args.length & 1) != 0) { + throw runtime.newArgumentError("odd number of args for Hash"); + } + + hash = (RubyHash)klass.allocate(); + for (int i=0; i < args.length; i+=2) hash.op_aset(context, args[i], args[i+1]); + + return hash; + } + + /** rb_hash_new + * + */ + public static final RubyHash newHash(Ruby runtime) { + return new RubyHash(runtime); + } + + /** rb_hash_new + * + */ + public static final RubyHash newHash(Ruby runtime, Map valueMap, IRubyObject defaultValue) { + assert defaultValue != null; + + return new RubyHash(runtime, valueMap, defaultValue); + } + + private RubyHashEntry[] table; + private int size = 0; + private int threshold; + + private static final int PROCDEFAULT_HASH_F = 1 << 10; + + private IRubyObject ifNone; + + private RubyHash(Ruby runtime, RubyClass klass, RubyHash other) { + super(runtime, klass); + this.ifNone = runtime.getNil(); + threshold = INITIAL_THRESHOLD; + table = other.internalCopyTable(head); + size = other.size; + } + + public RubyHash(Ruby runtime, RubyClass klass) { + super(runtime, klass); + this.ifNone = runtime.getNil(); + alloc(); + } + + public RubyHash(Ruby runtime) { + this(runtime, runtime.getNil()); + } + + public RubyHash(Ruby runtime, IRubyObject defaultValue) { + super(runtime, runtime.getHash()); + this.ifNone = defaultValue; + alloc(); + } + + /* + * Constructor for internal usage (mainly for Array#|, Array#&, Array#- and Array#uniq) + * it doesn't initialize ifNone field + */ + RubyHash(Ruby runtime, boolean objectSpace) { + super(runtime, runtime.getHash(), objectSpace); + alloc(); + } + + // TODO should this be deprecated ? (to be efficient, internals should deal with RubyHash directly) + public RubyHash(Ruby runtime, Map valueMap, IRubyObject defaultValue) { + super(runtime, runtime.getHash()); + this.ifNone = defaultValue; + alloc(); + + for (Iterator iter = valueMap.entrySet().iterator();iter.hasNext();) { + Map.Entry e = (Map.Entry)iter.next(); + internalPut((IRubyObject)e.getKey(), (IRubyObject)e.getValue()); + } + } + + private final void alloc() { + threshold = INITIAL_THRESHOLD; + generation++; + head.nextAdded = head.prevAdded = head; + table = new RubyHashEntry[MRI_HASH_RESIZE ? MRI_INITIAL_CAPACITY : JAVASOFT_INITIAL_CAPACITY]; + } + + /* ============================ + * Here are hash internals + * (This could be extracted to a separate class but it's not too large though) + * ============================ + */ + + private static final int MRI_PRIMES[] = { + 8 + 3, 16 + 3, 32 + 5, 64 + 3, 128 + 3, 256 + 27, 512 + 9, 1024 + 9, 2048 + 5, 4096 + 3, + 8192 + 27, 16384 + 43, 32768 + 3, 65536 + 45, 131072 + 29, 262144 + 3, 524288 + 21, 1048576 + 7, + 2097152 + 17, 4194304 + 15, 8388608 + 9, 16777216 + 43, 33554432 + 35, 67108864 + 15, + 134217728 + 29, 268435456 + 3, 536870912 + 11, 1073741824 + 85, 0 + }; + + private static final int JAVASOFT_INITIAL_CAPACITY = 8; // 16 ? + private static final int MRI_INITIAL_CAPACITY = MRI_PRIMES[0]; + + private static final int INITIAL_THRESHOLD = JAVASOFT_INITIAL_CAPACITY - (JAVASOFT_INITIAL_CAPACITY >> 2); + private static final int MAXIMUM_CAPACITY = 1 << 30; + + private static final RubyHashEntry NO_ENTRY = new RubyHashEntry(); + private int generation = 0; // generation count for O(1) clears + private final RubyHashEntry head = new RubyHashEntry(); + { head.prevAdded = head.nextAdded = head; } + + static final class RubyHashEntry implements Map.Entry { + private IRubyObject key; + private IRubyObject value; + private RubyHashEntry next; + private RubyHashEntry prevAdded; + private RubyHashEntry nextAdded; + private int hash; + + RubyHashEntry() { + key = NEVER; + } + + RubyHashEntry(int h, IRubyObject k, IRubyObject v, RubyHashEntry e, RubyHashEntry head) { + key = k; value = v; next = e; hash = h; + prevAdded = head.prevAdded; + nextAdded = head; + nextAdded.prevAdded = this; + prevAdded.nextAdded = this; + } + + public void detach() { + if (prevAdded != null) { + prevAdded.nextAdded = nextAdded; + nextAdded.prevAdded = prevAdded; + prevAdded = null; + } + } + + public boolean isLive() { + return prevAdded != null; + } + + public Object getKey() { + return key; + } + public Object getJavaifiedKey(){ + return JavaUtil.convertRubyToJava(key); + } + + public Object getValue() { + return value; + } + public Object getJavaifiedValue() { + return JavaUtil.convertRubyToJava(value); + } + + public Object setValue(Object value) { + IRubyObject oldValue = this.value; + if (value instanceof IRubyObject) { + this.value = (IRubyObject)value; + } else { + throw new UnsupportedOperationException("directEntrySet() doesn't support setValue for non IRubyObject instance entries, convert them manually or use entrySet() instead"); + } + return oldValue; + } + + public boolean equals(Object other){ + if(!(other instanceof RubyHashEntry)) return false; + RubyHashEntry otherEntry = (RubyHashEntry)other; + if(key == otherEntry.key || key.eql(otherEntry.key)){ + if(value == otherEntry.value || value.equals(otherEntry.value)) return true; + } + return false; + } + + public int hashCode(){ + return key.hashCode() ^ value.hashCode(); + } + } + + private static int JavaSoftHashValue(int h) { + h ^= (h >>> 20) ^ (h >>> 12); + return h ^ (h >>> 7) ^ (h >>> 4); + } + + private static int JavaSoftBucketIndex(final int h, final int length) { + return h & (length - 1); + } + + private static int MRIHashValue(int h) { + return h & HASH_SIGN_BIT_MASK; + } + + private static final int HASH_SIGN_BIT_MASK = ~(1 << 31); + private static int MRIBucketIndex(final int h, final int length) { + return (h % length); + } + + private final void resize(int newCapacity) { + final RubyHashEntry[] oldTable = table; + final RubyHashEntry[] newTable = new RubyHashEntry[newCapacity]; + for (int j = 0; j < oldTable.length; j++) { + RubyHashEntry entry = oldTable[j]; + oldTable[j] = null; + while (entry != null) { + RubyHashEntry next = entry.next; + int i = bucketIndex(entry.hash, newCapacity); + entry.next = newTable[i]; + newTable[i] = entry; + entry = next; + } + } + table = newTable; + } + + private final void JavaSoftCheckResize() { + if (size > threshold) { + int oldCapacity = table.length; + if (oldCapacity == MAXIMUM_CAPACITY) { + threshold = Integer.MAX_VALUE; + return; + } + int newCapacity = table.length << 1; + resize(newCapacity); + threshold = newCapacity - (newCapacity >> 2); + } + } + + private static final int MIN_CAPA = 8; + private static final int ST_DEFAULT_MAX_DENSITY = 5; + private final void MRICheckResize() { + if (size / table.length > ST_DEFAULT_MAX_DENSITY) { + int forSize = table.length + 1; // size + 1; + for (int i=0, newCapacity = MIN_CAPA; i < MRI_PRIMES.length; i++, newCapacity <<= 1) { + if (newCapacity > forSize) { + resize(MRI_PRIMES[i]); + return; + } + } + return; // suboptimal for large hashes (> 1073741824 + 85 entries) not very likely to happen + } + } + // ------------------------------ + private static boolean MRI_HASH = true; + private static boolean MRI_HASH_RESIZE = true; + + private static int hashValue(final int h) { + return MRI_HASH ? MRIHashValue(h) : JavaSoftHashValue(h); + } + + private static int bucketIndex(final int h, final int length) { + return MRI_HASH ? MRIBucketIndex(h, length) : JavaSoftBucketIndex(h, length); + } + + private void checkResize() { + if (MRI_HASH_RESIZE) MRICheckResize(); else JavaSoftCheckResize(); + } + // ------------------------------ + public static long collisions = 0; + + // put implementation + + private final void internalPut(final IRubyObject key, final IRubyObject value) { + internalPut(key, value, true); + } + + private final void internalPut(final IRubyObject key, final IRubyObject value, final boolean checkForExisting) { + checkResize(); + final int hash = hashValue(key.hashCode()); + final int i = bucketIndex(hash, table.length); + + // if (table[i] != null) collisions++; + + if (checkForExisting) { + for (RubyHashEntry entry = table[i]; entry != null; entry = entry.next) { + IRubyObject k; + if (entry.hash == hash && ((k = entry.key) == key || key.eql(k))) { + entry.value = value; + return; + } + } + } + + table[i] = new RubyHashEntry(hash, key, value, table[i], head); + size++; + } + + // get implementation + + private final IRubyObject internalGet(IRubyObject key) { // specialized for value + return internalGetEntry(key).value; + } + + private final RubyHashEntry internalGetEntry(IRubyObject key) { + final int hash = hashValue(key.hashCode()); + for (RubyHashEntry entry = table[bucketIndex(hash, table.length)]; entry != null; entry = entry.next) { + IRubyObject k; + if (entry.hash == hash && ((k = entry.key) == key || key.eql(k))) return entry; + } + return NO_ENTRY; + } + + // delete implementation + + + private final RubyHashEntry internalDelete(final IRubyObject key) { + return internalDelete(hashValue(key.hashCode()), MATCH_KEY, key); + } + + private final RubyHashEntry internalDeleteEntry(final RubyHashEntry entry) { + // n.b. we need to recompute the hash in case the key object was modified + return internalDelete(hashValue(entry.key.hashCode()), MATCH_ENTRY, entry); + } + + private final RubyHashEntry internalDelete(final int hash, final EntryMatchType matchType, final Object obj) { + final int i = bucketIndex(hash, table.length); + + RubyHashEntry entry = table[i]; + if (entry != null) { + RubyHashEntry prior = null; + for (; entry != null; prior = entry, entry = entry.next) { + if (entry.hash == hash && matchType.matches(entry, obj)) { + if (prior != null) { + prior.next = entry.next; + } else { + table[i] = entry.next; + } + entry.detach(); + size--; + return entry; + } + } + } + + return NO_ENTRY; + } + + private static abstract class EntryMatchType { + public abstract boolean matches(final RubyHashEntry entry, final Object obj); + } + + private static final EntryMatchType MATCH_KEY = new EntryMatchType() { + public boolean matches(final RubyHashEntry entry, final Object obj) { + final IRubyObject key = entry.key; + return obj == key || (((IRubyObject)obj).eql(key)); + } + }; + + private static final EntryMatchType MATCH_ENTRY = new EntryMatchType() { + public boolean matches(final RubyHashEntry entry, final Object obj) { + return entry.equals(obj); + } + }; + + private final RubyHashEntry[] internalCopyTable(RubyHashEntry destHead) { + RubyHashEntry[]newTable = new RubyHashEntry[table.length]; + + for (RubyHashEntry entry = head.nextAdded; entry != head; entry = entry.nextAdded) { + int i = bucketIndex(entry.hash, table.length); + newTable[i] = new RubyHashEntry(entry.hash, entry.key, entry.value, newTable[i], destHead); + } + return newTable; + } + + public static abstract class Visitor { + public abstract void visit(IRubyObject key, IRubyObject value); + } + + public void visitAll(Visitor visitor) { + int startGeneration = generation; + for (RubyHashEntry entry = head.nextAdded; entry != head; entry = entry.nextAdded) { + if (startGeneration != generation) { + startGeneration = generation; + entry = head.nextAdded; + if (entry == head) break; + } + if (entry.isLive()) visitor.visit(entry.key, entry.value); + } + } + + /* ============================ + * End of hash internals + * ============================ + */ + + /* ================ + * Instance Methods + * ================ + */ + + /** rb_hash_initialize + * + */ + @JRubyMethod(name = "initialize", optional = 1, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, final Block block) { + modify(); + + if (block.isGiven()) { + if (args.length > 0) throw getRuntime().newArgumentError("wrong number of arguments"); + ifNone = getRuntime().newProc(Block.Type.PROC, block); + flags |= PROCDEFAULT_HASH_F; + } else { + Arity.checkArgumentCount(getRuntime(), args, 0, 1); + if (args.length == 1) ifNone = args[0]; + } + return this; + } + + /** rb_hash_default + * + */ + @Deprecated + public IRubyObject default_value_get(ThreadContext context, IRubyObject[] args) { + switch (args.length) { + case 0: return default_value_get(context); + case 1: return default_value_get(context, args[0]); + default: throw context.getRuntime().newArgumentError(args.length, 1); + } + } + @JRubyMethod(name = "default", frame = true) + public IRubyObject default_value_get(ThreadContext context) { + if ((flags & PROCDEFAULT_HASH_F) != 0) { + return getRuntime().getNil(); + } + return ifNone; + } + @JRubyMethod(name = "default", frame = true) + public IRubyObject default_value_get(ThreadContext context, IRubyObject arg) { + if ((flags & PROCDEFAULT_HASH_F) != 0) { + return RuntimeHelpers.invoke(context, ifNone, "call", this, arg); + } + return ifNone; + } + + /** rb_hash_set_default + * + */ + @JRubyMethod(name = "default=", required = 1) + public IRubyObject default_value_set(final IRubyObject defaultValue) { + modify(); + + ifNone = defaultValue; + flags &= ~PROCDEFAULT_HASH_F; + + return ifNone; + } + + /** rb_hash_default_proc + * + */ + @JRubyMethod(name = "default_proc", frame = true) + public IRubyObject default_proc() { + return (flags & PROCDEFAULT_HASH_F) != 0 ? ifNone : getRuntime().getNil(); + } + + /** rb_hash_modify + * + */ + public void modify() { + testFrozen("hash"); + if (isTaint() && getRuntime().getSafeLevel() >= 4) { + throw getRuntime().newSecurityError("Insecure: can't modify hash"); + } + } + + /** inspect_hash + * + */ + private IRubyObject inspectHash(final ThreadContext context) { + final ByteList buffer = new ByteList(); + buffer.append('{'); + final boolean[] firstEntry = new boolean[1]; + + firstEntry[0] = true; + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + if (!firstEntry[0]) buffer.append(',').append(' '); + + buffer.append(inspect(context, key).getByteList()); + buffer.append('=').append('>'); + buffer.append(inspect(context, value).getByteList()); + firstEntry[0] = false; + } + }); + buffer.append('}'); + return getRuntime().newString(buffer); + } + + /** rb_hash_inspect + * + */ + @JRubyMethod(name = "inspect") + public IRubyObject inspect(ThreadContext context) { + if (size == 0) return getRuntime().newString("{}"); + if (getRuntime().isInspecting(this)) return getRuntime().newString("{...}"); + + try { + getRuntime().registerInspecting(this); + return inspectHash(context); + } finally { + getRuntime().unregisterInspecting(this); + } + } + + /** rb_hash_size + * + */ + @JRubyMethod(name = {"size", "length"}) + public RubyFixnum rb_size() { + return getRuntime().newFixnum(size); + } + + /** rb_hash_empty_p + * + */ + @JRubyMethod(name = "empty?") + public RubyBoolean empty_p() { + return size == 0 ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + /** rb_hash_to_a + * + */ + @JRubyMethod(name = "to_a") + public RubyArray to_a() { + final Ruby runtime = getRuntime(); + final RubyArray result = RubyArray.newArray(runtime, size); + + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + result.append(RubyArray.newArray(runtime, key, value)); + } + }); + + result.setTaint(isTaint()); + return result; + } + + /** rb_hash_to_s & to_s_hash + * + */ + @JRubyMethod(name = "to_s") + public IRubyObject to_s() { + if (getRuntime().isInspecting(this)) return getRuntime().newString("{...}"); + try { + getRuntime().registerInspecting(this); + return to_a().to_s(); + } finally { + getRuntime().unregisterInspecting(this); + } + } + + /** rb_hash_rehash + * + */ + @JRubyMethod(name = "rehash") + public RubyHash rehash() { + modify(); + final RubyHashEntry[] oldTable = table; + final RubyHashEntry[] newTable = new RubyHashEntry[oldTable.length]; + for (int j = 0; j < oldTable.length; j++) { + RubyHashEntry entry = oldTable[j]; + oldTable[j] = null; + while (entry != null) { + RubyHashEntry next = entry.next; + entry.hash = entry.key.hashCode(); // update the hash value + int i = bucketIndex(entry.hash, newTable.length); + entry.next = newTable[i]; + newTable[i] = entry; + entry = next; + } + } + table = newTable; + return this; + } + + /** rb_hash_to_hash + * + */ + @JRubyMethod(name = "to_hash") + public RubyHash to_hash() { + return this; + } + + public RubyHash convertToHash() { + return this; + } + + public final void fastASet(IRubyObject key, IRubyObject value) { + internalPut(key, value); + } + + @Deprecated + public IRubyObject op_aset(IRubyObject key, IRubyObject value) { + return op_aset(getRuntime().getCurrentContext(), key, value); + } + + /** rb_hash_aset + * + */ + @JRubyMethod(name = {"[]=", "store"}, required = 2) + public IRubyObject op_aset(ThreadContext context, IRubyObject key, IRubyObject value) { + modify(); + + if (!(key instanceof RubyString)) { + internalPut(key, value); + } else { + final RubyHashEntry entry = internalGetEntry(key); + if (entry != NO_ENTRY) { + entry.value = value; + } else { + RubyString realKey = (RubyString)key; + + if (!realKey.isFrozen()) { + realKey = realKey.strDup(context.getRuntime(), realKey.getMetaClass().getRealClass());; + realKey.setFrozen(true); + } + + internalPut(realKey, value, false); + } + } + + return value; + } + + /** + * Note: this is included as a compatibility measure for AR-JDBC + * @deprecated use RubyHash.op_aset instead + */ + public IRubyObject aset(IRubyObject key, IRubyObject value) { + return op_aset(getRuntime().getCurrentContext(), key, value); + } + + /** + * Note: this is included as a compatibility measure for Mongrel+JRuby + * @deprecated use RubyHash.op_aref instead + */ + public IRubyObject aref(IRubyObject key) { + return op_aref(getRuntime().getCurrentContext(), key); + } + + public final IRubyObject fastARef(IRubyObject key) { // retuns null when not found to avoid unnecessary getRuntime().getNil() call + return internalGet(key); + } + + /** rb_hash_aref + * + */ + @JRubyMethod(name = "[]", required = 1) + public IRubyObject op_aref(ThreadContext context, IRubyObject key) { + IRubyObject value; + return ((value = internalGet(key)) == null) ? callMethod(context, MethodIndex.DEFAULT, "default", key) : value; + } + + /** rb_hash_fetch + * + */ + @JRubyMethod(name = "fetch", required = 1, optional = 1, frame = true) + public IRubyObject fetch(ThreadContext context, IRubyObject[] args, Block block) { + if (args.length == 2 && block.isGiven()) { + getRuntime().getWarnings().warn(ID.BLOCK_BEATS_DEFAULT_VALUE, "block supersedes default value argument"); + } + + IRubyObject value; + if ((value = internalGet(args[0])) == null) { + if (block.isGiven()) return block.yield(context, args[0]); + if (args.length == 1) throw getRuntime().newIndexError("key not found"); + return args[1]; + } + return value; + } + + /** rb_hash_has_key + * + */ + @JRubyMethod(name = {"has_key?", "key?", "include?", "member?"}, required = 1) + public RubyBoolean has_key_p(IRubyObject key) { + return internalGetEntry(key) == NO_ENTRY ? getRuntime().getFalse() : getRuntime().getTrue(); + } + + private class Found extends RuntimeException {} + + private boolean hasValue(final ThreadContext context, final IRubyObject expected) { + try { + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + if (equalInternal(context, value, expected)) { + throw new Found(); + } + } + }); + return false; + } catch (Found found) { + return true; + } + } + + /** rb_hash_has_value + * + */ + @JRubyMethod(name = {"has_value?", "value?"}, required = 1) + public RubyBoolean has_value_p(ThreadContext context, IRubyObject expected) { + return getRuntime().newBoolean(hasValue(context, expected)); + } + + /** rb_hash_each + * + */ + @JRubyMethod(name = "each", frame = true) + public RubyHash each(final ThreadContext context, final Block block) { + final Ruby runtime = getRuntime(); + + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + // rb_assoc_new equivalent + block.yield(context, RubyArray.newArray(runtime, key, value), null, null, false); + } + }); + + return this; + } + + /** rb_hash_each_pair + * + */ + @JRubyMethod(name = "each_pair", frame = true) + public RubyHash each_pair(final ThreadContext context, final Block block) { + final Ruby runtime = getRuntime(); + + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + // rb_yield_values(2,...) equivalent + block.yield(context, RubyArray.newArray(runtime, key, value), null, null, true); + } + }); + + return this; + } + + /** rb_hash_each_value + * + */ + @JRubyMethod(name = "each_value", frame = true) + public RubyHash each_value(final ThreadContext context, final Block block) { + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + block.yield(context, value); + } + }); + + return this; + } + + /** rb_hash_each_key + * + */ + @JRubyMethod(name = "each_key", frame = true) + public RubyHash each_key(final ThreadContext context, final Block block) { + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + block.yield(context, key); + } + }); + + return this; + } + + /** rb_hash_sort + * + */ + @JRubyMethod(name = "sort", frame = true) + public RubyArray sort(Block block) { + return to_a().sort_bang(block); + } + + private static class FoundKey extends RuntimeException { + public IRubyObject key; + FoundKey(IRubyObject key) { + super(); + this.key = key; + } + } + + /** rb_hash_index + * + */ + @JRubyMethod(name = "index", required = 1) + public IRubyObject index(ThreadContext context, IRubyObject expected) { + IRubyObject key = internalIndex(context, expected); + if (key != null) { + return key; + } else { + return getRuntime().getNil(); + } + } + + private IRubyObject internalIndex(final ThreadContext context, final IRubyObject expected) { + try { + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + if (equalInternal(context, value, expected)) { + throw new FoundKey(key); + } + } + }); + return null; + } catch (FoundKey found) { + return found.key; + } + } + + /** rb_hash_indexes + * + */ + @JRubyMethod(name = {"indexes", "indices"}, rest = true) + public RubyArray indices(ThreadContext context, IRubyObject[] indices) { + return values_at(context, indices); + } + + /** rb_hash_keys + * + */ + @JRubyMethod(name = "keys") + public RubyArray keys() { + final Ruby runtime = getRuntime(); + final RubyArray keys = RubyArray.newArray(runtime, size); + + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + keys.append(key); + } + }); + + return keys; + } + + /** rb_hash_values + * + */ + @JRubyMethod(name = "values") + public RubyArray rb_values() { + final RubyArray values = RubyArray.newArray(getRuntime(), size); + + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + values.append(value); + } + }); + + return values; + } + + /** rb_hash_equal + * + */ + + private static final boolean EQUAL_CHECK_DEFAULT_VALUE = false; + + private static class Mismatch extends RuntimeException {} + + @Override + @JRubyMethod(name = "==", required = 1) + public IRubyObject op_equal(final ThreadContext context, final IRubyObject other) { + if (this == other) return getRuntime().getTrue(); + if (!(other instanceof RubyHash)) { + if (other.respondsTo("to_hash") && equalInternal(context, other, this)) return getRuntime().getTrue(); + return getRuntime().getFalse(); + } + + final RubyHash otherHash = (RubyHash)other; + if (size != otherHash.size) return getRuntime().getFalse(); + + final Ruby runtime = getRuntime(); + + if (EQUAL_CHECK_DEFAULT_VALUE) { + if (!equalInternal(context, ifNone, otherHash.ifNone) && + (flags & PROCDEFAULT_HASH_F) != (otherHash.flags & PROCDEFAULT_HASH_F)) return runtime.getFalse(); + } + + try { + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + IRubyObject otherValue = otherHash.internalGet(key); + if (otherValue == null || !equalInternal(context, value, otherValue)) throw new Mismatch(); + } + }); + return runtime.getTrue(); + } catch (Mismatch e) { + return runtime.getFalse(); + } + } + + /** rb_hash_shift + * + */ + @JRubyMethod(name = "shift") + public IRubyObject shift(ThreadContext context) { + modify(); + + RubyHashEntry entry = head.nextAdded; + if (entry != head) { + RubyArray result = RubyArray.newArray(getRuntime(), entry.key, entry.value); + internalDeleteEntry(entry); + return result; + } + + if ((flags & PROCDEFAULT_HASH_F) != 0) { + return RuntimeHelpers.invoke(context, ifNone, "call", this, getRuntime().getNil()); + } else { + return ifNone; + } + } + + public final boolean fastDelete(IRubyObject key) { + return internalDelete(key) != NO_ENTRY; + } + + /** rb_hash_delete + * + */ + @JRubyMethod(name = "delete", required = 1, frame = true) + public IRubyObject delete(ThreadContext context, IRubyObject key, Block block) { + modify(); + + final RubyHashEntry entry = internalDelete(key); + if (entry != NO_ENTRY) return entry.value; + + if (block.isGiven()) return block.yield(context, key); + return getRuntime().getNil(); + } + + /** rb_hash_select + * + */ + @JRubyMethod(name = "select", frame = true) + public IRubyObject select(final ThreadContext context, final Block block) { + final RubyArray result = getRuntime().newArray(); + final Ruby runtime = getRuntime(); + + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + if (block.yield(context, runtime.newArray(key, value), null, null, true).isTrue()) { + result.append(runtime.newArray(key, value)); + } + } + }); + + return result; + } + + /** rb_hash_delete_if + * + */ + @JRubyMethod(name = "delete_if", frame = true) + public RubyHash delete_if(final ThreadContext context, final Block block) { + modify(); + + final Ruby runtime = getRuntime(); + final RubyHash self = this; + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + if (block.yield(context, RubyArray.newArray(runtime, key, value), null, null, true).isTrue()) { + self.delete(context, key, block); + } + } + }); + + return this; + } + + /** rb_hash_reject + * + */ + @JRubyMethod(name = "reject", frame = true) + public RubyHash reject(ThreadContext context, Block block) { + return ((RubyHash)dup()).delete_if(context, block); + } + + /** rb_hash_reject_bang + * + */ + @JRubyMethod(name = "reject!", frame = true) + public IRubyObject reject_bang(ThreadContext context, Block block) { + int n = size; + delete_if(context, block); + if (n == size) return getRuntime().getNil(); + return this; + } + + /** rb_hash_clear + * + */ + @JRubyMethod(name = "clear") + public RubyHash rb_clear() { + modify(); + + if (size > 0) { + alloc(); + size = 0; + } + + return this; + } + + /** rb_hash_invert + * + */ + @JRubyMethod(name = "invert") + public RubyHash invert(final ThreadContext context) { + final RubyHash result = newHash(getRuntime()); + + visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + result.op_aset(context, value, key); + } + }); + + return result; + } + + /** rb_hash_update + * + */ + @JRubyMethod(name = {"merge!", "update"}, required = 1, frame = true) + public RubyHash merge_bang(final ThreadContext context, final IRubyObject other, final Block block) { + modify(); + + final Ruby runtime = getRuntime(); + final RubyHash otherHash = other.convertToHash(); + final RubyHash self = this; + otherHash.visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + if (block.isGiven()) { + IRubyObject existing = self.internalGet(key); + if (existing != null) + value = block.yield(context, RubyArray.newArrayNoCopy(runtime, new IRubyObject[]{key, existing, value})); + } + self.op_aset(context, key, value); + } + }); + + return this; + } + + /** rb_hash_merge + * + */ + @JRubyMethod(name = "merge", required = 1, frame = true) + public RubyHash merge(ThreadContext context, IRubyObject other, Block block) { + return ((RubyHash)dup()).merge_bang(context, other, block); + } + + /** rb_hash_replace + * + */ + @JRubyMethod(name = "initialize_copy", required = 1, visibility = Visibility.PRIVATE) + public RubyHash initialize_copy(ThreadContext context, IRubyObject other) { + return replace(context, other); + } + + /** rb_hash_replace + * + */ + @JRubyMethod(name = "replace", required = 1) + public RubyHash replace(final ThreadContext context, IRubyObject other) { + final RubyHash otherHash = other.convertToHash(); + + if (this == otherHash) return this; + + rb_clear(); + + final RubyHash self = this; + otherHash.visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + self.op_aset(context, key, value); + } + }); + + ifNone = otherHash.ifNone; + + if ((otherHash.flags & PROCDEFAULT_HASH_F) != 0) { + flags |= PROCDEFAULT_HASH_F; + } else { + flags &= ~PROCDEFAULT_HASH_F; + } + + return this; + } + + /** rb_hash_values_at + * + */ + @JRubyMethod(name = "values_at", rest = true) + public RubyArray values_at(ThreadContext context, IRubyObject[] args) { + RubyArray result = RubyArray.newArray(getRuntime(), args.length); + for (int i = 0; i < args.length; i++) { + result.append(op_aref(context, args[i])); + } + return result; + } + + public boolean hasDefaultProc() { + return (flags & PROCDEFAULT_HASH_F) != 0; + } + + public IRubyObject getIfNone(){ + return ifNone; + } + + private static class VisitorIOException extends RuntimeException { + VisitorIOException(Throwable cause) { + super(cause); + } + } + + // FIXME: Total hack to get flash in Rails marshalling/unmarshalling in session ok...We need + // to totally change marshalling to work with overridden core classes. + public static void marshalTo(final RubyHash hash, final MarshalStream output) throws IOException { + output.registerLinkTarget(hash); + output.writeInt(hash.size); + try { + hash.visitAll(new Visitor() { + public void visit(IRubyObject key, IRubyObject value) { + try { + output.dumpObject(key); + output.dumpObject(value); + } catch (IOException e) { + throw new VisitorIOException(e); + } + } + }); + } catch (VisitorIOException e) { + throw (IOException)e.getCause(); + } + + if (!hash.ifNone.isNil()) output.dumpObject(hash.ifNone); + } + + public static RubyHash unmarshalFrom(UnmarshalStream input, boolean defaultValue) throws IOException { + RubyHash result = newHash(input.getRuntime()); + input.registerLinkTarget(result); + int size = input.unmarshalInt(); + ThreadContext context = input.getRuntime().getCurrentContext(); + for (int i = 0; i < size; i++) { + result.op_aset(context, input.unmarshalObject(), input.unmarshalObject()); + } + if (defaultValue) result.default_value_set(input.unmarshalObject()); + return result; + } + + public Class getJavaClass() { + return Map.class; + } + + // Satisfy java.util.Set interface (for Java integration) + + public int size() { + return size; + } + + public boolean isEmpty() { + return size == 0; + } + + public boolean containsKey(Object key) { + return internalGet(JavaUtil.convertJavaToRuby(getRuntime(), key)) != null; + } + + public boolean containsValue(Object value) { + return hasValue(getRuntime().getCurrentContext(), JavaUtil.convertJavaToRuby(getRuntime(), value)); + } + + public Object get(Object key) { + return JavaUtil.convertRubyToJava(internalGet(JavaUtil.convertJavaToRuby(getRuntime(), key))); + } + + public Object put(Object key, Object value) { + internalPut(JavaUtil.convertJavaToRuby(getRuntime(), key), JavaUtil.convertJavaToRuby(getRuntime(), value)); + return value; + } + + public Object remove(Object key) { + IRubyObject rubyKey = JavaUtil.convertJavaToRuby(getRuntime(), key); + return internalDelete(rubyKey).value; + } + + public void putAll(Map map) { + Ruby runtime = getRuntime(); + for (Iterator iter = map.keySet().iterator(); iter.hasNext();) { + Object key = iter.next(); + internalPut(JavaUtil.convertJavaToRuby(runtime, key), JavaUtil.convertJavaToRuby(runtime, map.get(key))); + } + } + + public void clear() { + rb_clear(); + } + + public boolean equals(Object other) { + if (!(other instanceof RubyHash)) return false; + if (this == other) return true; + return op_equal(getRuntime().getCurrentContext(), (RubyHash)other).isTrue() ? true : false; + } + + public Set keySet() { + return new BaseSet(KEY_VIEW); + } + + public Set directKeySet() { + return new BaseSet(DIRECT_KEY_VIEW); + } + + public Collection values() { + return new BaseCollection(VALUE_VIEW); + } + + public Collection directValues() { + return new BaseCollection(DIRECT_VALUE_VIEW); + } + + public Set entrySet() { + return new BaseSet(ENTRY_VIEW); + } + + public Set directEntrySet() { + return new BaseSet(DIRECT_ENTRY_VIEW); + } + + private class BaseSet extends AbstractSet { + final EntryView view; + + public BaseSet(EntryView view) { + this.view = view; + } + + public Iterator iterator() { + return new BaseIterator(view); + } + + public boolean contains(Object o) { + return view.contains(RubyHash.this, o); + } + + public void clear() { + RubyHash.this.clear(); + } + + public int size() { + return RubyHash.this.size; + } + + public boolean remove(Object o) { + return view.remove(RubyHash.this, o); + } + } + + private class BaseCollection extends AbstractCollection { + final EntryView view; + + public BaseCollection(EntryView view) { + this.view = view; + } + + public Iterator iterator() { + return new BaseIterator(view); + } + + public boolean contains(Object o) { + return view.contains(RubyHash.this, o); + } + + public void clear() { + RubyHash.this.clear(); + } + + public int size() { + return RubyHash.this.size; + } + + public boolean remove(Object o) { + return view.remove(RubyHash.this, o); + } + } + + private class BaseIterator implements Iterator { + final private EntryView view; + private RubyHashEntry entry; + private boolean peeking; + private int startGeneration; + + public BaseIterator(EntryView view) { + this.view = view; + this.entry = head; + this.startGeneration = generation; + } + + private void advance(boolean consume) { + if (!peeking) { + do { + if (startGeneration != generation) { + startGeneration = generation; + entry = head; + } + entry = entry.nextAdded; + } while (entry != head && !entry.isLive()); + } + peeking = !consume; + } + + public Object next() { + advance(true); + if (entry == head) { + peeking = true; // remain where we are + throw new NoSuchElementException(); + } + return view.convertEntry(getRuntime(), entry); + } + + // once hasNext has been called, we commit to next() returning + // the entry it found, even if it were subsequently deleted + public boolean hasNext() { + advance(false); + return entry != head; + } + + public void remove() { + if (entry == head) { + throw new IllegalStateException("Iterator out of range"); + } + internalDeleteEntry(entry); + } + } + + private static abstract class EntryView { + public abstract Object convertEntry(Ruby runtime, RubyHashEntry value); + public abstract boolean contains(RubyHash hash, Object o); + public abstract boolean remove(RubyHash hash, Object o); + } + + private static final EntryView DIRECT_KEY_VIEW = new EntryView() { + public Object convertEntry(Ruby runtime, RubyHashEntry entry) { + return entry.key; + } + public boolean contains(RubyHash hash, Object o) { + if (!(o instanceof IRubyObject)) return false; + return hash.internalGet((IRubyObject)o) != null; + } + public boolean remove(RubyHash hash, Object o) { + if (!(o instanceof IRubyObject)) return false; + return hash.internalDelete((IRubyObject)o) != NO_ENTRY; + } + }; + + private static final EntryView KEY_VIEW = new EntryView() { + public Object convertEntry(Ruby runtime, RubyHashEntry entry) { + return JavaUtil.convertRubyToJava(entry.key, Object.class); + } + public boolean contains(RubyHash hash, Object o) { + return hash.containsKey(o); + } + public boolean remove(RubyHash hash, Object o) { + return hash.remove(o) != null; + } + }; + + private static final EntryView DIRECT_VALUE_VIEW = new EntryView() { + public Object convertEntry(Ruby runtime, RubyHashEntry entry) { + return entry.value; + } + public boolean contains(RubyHash hash, Object o) { + if (!(o instanceof IRubyObject)) return false; + IRubyObject obj = (IRubyObject)o; + return hash.hasValue(obj.getRuntime().getCurrentContext(), obj); + } + public boolean remove(RubyHash hash, Object o) { + if (!(o instanceof IRubyObject)) return false; + IRubyObject obj = (IRubyObject) o; + IRubyObject key = hash.internalIndex(obj.getRuntime().getCurrentContext(), obj); + if (key == null) return false; + return hash.internalDelete(key) != NO_ENTRY; + } + }; + + private final EntryView VALUE_VIEW = new EntryView() { + public Object convertEntry(Ruby runtime, RubyHashEntry entry) { + return JavaUtil.convertRubyToJava(entry.value, Object.class); + } + public boolean contains(RubyHash hash, Object o) { + return hash.containsValue(o); + } + public boolean remove(RubyHash hash, Object o) { + IRubyObject value = JavaUtil.convertJavaToRuby(hash.getRuntime(), o); + IRubyObject key = hash.internalIndex(hash.getRuntime().getCurrentContext(), value); + if (key == null) return false; + return hash.internalDelete(key) != NO_ENTRY; + } + }; + + private final EntryView DIRECT_ENTRY_VIEW = new EntryView() { + public Object convertEntry(Ruby runtime, RubyHashEntry entry) { + return entry; + } + public boolean contains(RubyHash hash, Object o) { + if (!(o instanceof RubyHashEntry)) return false; + RubyHashEntry entry = (RubyHashEntry)o; + RubyHashEntry candidate = internalGetEntry(entry.key); + return candidate != NO_ENTRY && entry.equals(candidate); + } + public boolean remove(RubyHash hash, Object o) { + if (!(o instanceof RubyHashEntry)) return false; + return hash.internalDeleteEntry((RubyHashEntry)o) != NO_ENTRY; + } + }; + + private final EntryView ENTRY_VIEW = new EntryView() { + public Object convertEntry(Ruby runtime, RubyHashEntry entry) { + return new ConvertingEntry(runtime, entry); + } + public boolean contains(RubyHash hash, Object o) { + if (!(o instanceof ConvertingEntry)) return false; + ConvertingEntry entry = (ConvertingEntry)o; + RubyHashEntry candidate = hash.internalGetEntry(entry.entry.key); + return candidate != NO_ENTRY && entry.entry.equals(candidate); + } + public boolean remove(RubyHash hash, Object o) { + if (!(o instanceof ConvertingEntry)) return false; + ConvertingEntry entry = (ConvertingEntry)o; + return hash.internalDeleteEntry(entry.entry) != NO_ENTRY; + } + }; + + private static class ConvertingEntry implements Map.Entry { + private final RubyHashEntry entry; + private final Ruby runtime; + + public ConvertingEntry(Ruby runtime, RubyHashEntry entry) { + this.entry = entry; + this.runtime = runtime; + } + + public Object getKey() { + return JavaUtil.convertRubyToJava(entry.key, Object.class); + } + public Object getValue() { + return JavaUtil.convertRubyToJava(entry.value, Object.class); + } + public Object setValue(Object o) { + return entry.setValue(JavaUtil.convertJavaToRuby(runtime, o)); + } + + public boolean equals(Object o) { + if (!(o instanceof ConvertingEntry)) { + return false; + } + ConvertingEntry other = (ConvertingEntry)o; + return entry.equals(other.entry); + } + public int hashCode() { + return entry.hashCode(); + } + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2007 Koichiro Ohba <koichiro@meadowy.org> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CodingErrorAction; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.MalformedInputException; +import java.nio.charset.UnmappableCharacterException; +import java.nio.charset.UnsupportedCharsetException; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.Arity; + +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import org.jruby.util.ByteList; + +@JRubyClass(name="Iconv") +public class RubyIconv extends RubyObject { + //static private final String TRANSLIT = "//translit"; + static private final String IGNORE = "//ignore"; + + private CharsetDecoder fromEncoding; + private CharsetEncoder toEncoding; + + public RubyIconv(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + private static final ObjectAllocator ICONV_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyIconv(runtime, klass); + } + }; + + @JRubyModule(name="Iconv::Failure") + public static class Failure {} + @JRubyClass(name="Iconv::IllegalSequence", parent="ArgumentError", include="Iconv::Failure") + public static class IllegalSequence {} + @JRubyClass(name="Iconv::InvalidCharacter", parent="ArgumentError", include="Iconv::Failure") + public static class InvalidCharacter {} + @JRubyClass(name="Iconv::InvalidEncoding", parent="ArgumentError", include="Iconv::Failure") + public static class InvalidEncoding {} + @JRubyClass(name="Iconv::OutOfRange", parent="ArgumentError", include="Iconv::Failure") + public static class OutOfRange {} + @JRubyClass(name="Iconv::BrokenLibrary", parent="ArgumentError", include="Iconv::Failure") + public static class BrokenLibrary {} + + public static void createIconv(Ruby runtime) { + RubyClass iconvClass = runtime.defineClass("Iconv", runtime.getObject(), ICONV_ALLOCATOR); + + iconvClass.defineAnnotatedMethods(RubyIconv.class); + + RubyModule failure = iconvClass.defineModuleUnder("Failure"); + RubyClass argumentError = runtime.getArgumentError(); + + String[] iconvErrors = {"IllegalSequence", "InvalidCharacter", "InvalidEncoding", + "OutOfRange", "BrokenLibrary"}; + + for (int i = 0; i < iconvErrors.length; i++) { + RubyClass subClass = iconvClass.defineClassUnder(iconvErrors[i], argumentError, RubyFailure.ICONV_FAILURE_ALLOCATOR); + subClass.defineAnnotatedMethods(RubyFailure.class); + subClass.includeModule(failure); + } + } + + public static class RubyFailure extends RubyException { + private IRubyObject success; + private IRubyObject failed; + + public static RubyFailure newInstance(Ruby runtime, RubyClass excptnClass, String msg) { + return new RubyFailure(runtime, excptnClass, msg); + } + + protected static final ObjectAllocator ICONV_FAILURE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyFailure(runtime, klass); + } + }; + + protected RubyFailure(Ruby runtime, RubyClass rubyClass) { + this(runtime, rubyClass, null); + } + + public RubyFailure(Ruby runtime, RubyClass rubyClass, String message) { + super(runtime, rubyClass, message); + } + + @JRubyMethod(name = "initialize", required = 1, optional = 2, frame = true) + public IRubyObject initialize(IRubyObject[] args, Block block) { + super.initialize(args, block); + success = args.length >= 2 ? args[1] : getRuntime().getNil(); + failed = args.length == 3 ? args[2] : getRuntime().getNil(); + + return this; + } + + @JRubyMethod(name = "success") + public IRubyObject success() { + return success; + } + + @JRubyMethod(name = "failed") + public IRubyObject failed() { + return failed; + } + + @JRubyMethod(name = "inspect") + public IRubyObject inspect() { + RubyModule rubyClass = getMetaClass(); + StringBuilder buffer = new StringBuilder("#<"); + buffer.append(rubyClass.getName()).append(": ").append(success.inspect().toString()); + buffer.append(", ").append(failed.inspect().toString()).append(">"); + + return getRuntime().newString(buffer.toString()); + } + } + + private static String getCharset(String encoding) { + int index = encoding.indexOf("//"); + if (index == -1) return encoding; + return encoding.substring(0, index); + } + + /* Currently dead code, but useful when we figure out how to actually perform translit. + private static boolean isTranslit(String encoding) { + return encoding.toLowerCase().indexOf(TRANSLIT) != -1 ? true : false; + }*/ + + private static boolean isIgnore(String encoding) { + return encoding.toLowerCase().indexOf(IGNORE) != -1 ? true : false; + } + + @JRubyMethod(name = "open", required = 2, frame = true, meta = true) + public static IRubyObject open(ThreadContext context, IRubyObject recv, IRubyObject to, IRubyObject from, Block block) { + Ruby runtime = context.getRuntime(); + + RubyIconv iconv = newIconv(context, recv, to, from); + + if (!block.isGiven()) return iconv; + + IRubyObject result = runtime.getNil(); + try { + result = block.yield(context, iconv); + } finally { + iconv.close(); + } + + return result; + } + + private static RubyIconv newIconv(ThreadContext context, IRubyObject recv, + IRubyObject to, IRubyObject from) { + RubyClass klazz = (RubyClass)recv; + + return (RubyIconv) klazz.newInstance( + context, new IRubyObject[] {to, from}, Block.NULL_BLOCK); + } + + @JRubyMethod(name = "initialize", required = 2, frame = true) + public IRubyObject initialize(IRubyObject arg1, IRubyObject arg2, Block unusedBlock) { + Ruby runtime = getRuntime(); + if (!arg1.respondsTo("to_str")) { + throw runtime.newTypeError("can't convert " + arg1.getMetaClass() + " into String"); + } + if (!arg2.respondsTo("to_str")) { + throw runtime.newTypeError("can't convert " + arg2.getMetaClass() + " into String"); + } + + String to = arg1.convertToString().toString(); + String from = arg2.convertToString().toString(); + + try { + + fromEncoding = Charset.forName(getCharset(from)).newDecoder(); + toEncoding = Charset.forName(getCharset(to)).newEncoder(); + + if (!isIgnore(from)) fromEncoding.onUnmappableCharacter(CodingErrorAction.REPORT); + if (!isIgnore(to)) toEncoding.onUnmappableCharacter(CodingErrorAction.REPORT); + } catch (IllegalCharsetNameException e) { + throw runtime.newInvalidEncoding("invalid encoding"); + } catch (UnsupportedCharsetException e) { + throw runtime.newInvalidEncoding("invalid encoding"); + } catch (Exception e) { + throw runtime.newSystemCallError(e.toString()); + } + + return this; + } + + @JRubyMethod(name = "close") + public IRubyObject close() { + toEncoding = null; + fromEncoding = null; + return RubyString.newEmptyString(getRuntime()); + } + + @JRubyMethod + public IRubyObject iconv(IRubyObject str) { + return iconv(str, 0, -1); + } + + @JRubyMethod + public IRubyObject iconv(IRubyObject str, IRubyObject startArg) { + int start = 0; + if (!startArg.isNil()) start = RubyNumeric.fix2int(startArg); + return iconv(str, start, -1); + } + + @JRubyMethod + public IRubyObject iconv(IRubyObject str, IRubyObject startArg, IRubyObject endArg) { + int start = 0; + int end = -1; + + if (!startArg.isNil()) start = RubyNumeric.fix2int(startArg); + if (!endArg.isNil()) end = RubyNumeric.fix2int(endArg); + + return iconv(str, start, end); + } + + private IRubyObject iconv(IRubyObject str, int start, int end) { + if (str.isNil()) { + fromEncoding.reset(); + toEncoding.reset(); + return RubyString.newEmptyString(getRuntime()); + } + + return _iconv(str.convertToString(), start, end); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one, two or three arguments. + */ + public IRubyObject iconv(IRubyObject[] args) { + switch (args.length) { + case 1: + return iconv(args[0]); + case 2: + return iconv(args[0], args[1]); + case 3: + return iconv(args[0], args[1], args[2]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + // FIXME: We are assuming that original string will be raw bytes. If -Ku is provided + // this will not be true, but that is ok for now. Deal with that when someone needs it. + private IRubyObject _iconv(RubyString str, int start, int end) { + if (fromEncoding == null) { + throw getRuntime().newArgumentError("closed iconv"); + } + + ByteList bytes = str.getByteList(); + + // treat start and end as start...end for end >= 0, start..end for end < 0 + if (start < 0) { + start += bytes.length(); + } + + if (end < 0) { + end += 1 + bytes.length(); + } else if (end > bytes.length()) { + end = bytes.length(); + } + + if (start < 0 || end < start) { // invalid ranges result in an empty string + return RubyString.newEmptyString(getRuntime()); + } + + ByteBuffer buf = ByteBuffer.wrap(bytes.unsafeBytes(), bytes.begin() + start, end - start); + + try { + CharBuffer cbuf = fromEncoding.decode(buf); + buf = toEncoding.encode(cbuf); + } catch (MalformedInputException e) { + } catch (UnmappableCharacterException e) { + } catch (CharacterCodingException e) { + throw getRuntime().newInvalidEncoding("invalid sequence"); + } catch (IllegalStateException e) { + } + byte[] arr = buf.array(); + + return getRuntime().newString(new ByteList(arr, 0, buf.limit())); + } + + @JRubyMethod(name = "iconv", required = 2, rest = true, meta = true) + public static IRubyObject iconv(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block unusedBlock) { + return convertWithArgs(context, recv, args, "iconv"); + } + + @JRubyMethod(name = "conv", required = 3, rest = true, meta = true) + public static IRubyObject conv(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block unusedBlock) { + return convertWithArgs(context, recv, args, "conv").join(context, RubyString.newEmptyString(recv.getRuntime())); + } + + @JRubyMethod(name = "charset_map", meta= true) + public static IRubyObject charset_map_get(IRubyObject recv) { + return recv.getRuntime().getCharsetMap(); + } + + private static String mapCharset(ThreadContext context, IRubyObject val) { + RubyHash charset = val.getRuntime().getCharsetMap(); + if (charset.size() > 0) { + RubyString key = val.callMethod(context, "downcase").convertToString(); + IRubyObject tryVal = charset.fastARef(key); + if (tryVal != null) val = tryVal; + } + + return val.convertToString().toString(); + } + + public static RubyArray convertWithArgs(ThreadContext context, IRubyObject recv, IRubyObject[] args, String function) { + assert args.length >= 2; + + RubyArray array = context.getRuntime().newArray(args.length - 2); + RubyIconv iconv = newIconv(context, recv, args[0], args[1]); + + try { + for (int i = 2; i < args.length; i++) { + array.append(iconv.iconv(args[i])); + } + } finally { + iconv.close(); + } + + return array; + } + + /* + private static IRubyObject convert(String fromEncoding, String toEncoding, RubyString original) + throws UnsupportedEncodingException { + // Get all bytes from PLAIN string pretend they are not encoded in any way. + byte[] string = original.getBytes(); + // Now create a string pretending it is from fromEncoding + string = new String(string, fromEncoding).getBytes(toEncoding); + // Finally recode back to PLAIN + return RubyString.newString(original.getRuntime(), string); + } + */ +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Nick Sieger <nicksieger@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import java.util.Set; +import java.util.StringTokenizer; +import org.jruby.ast.executable.Script; +import org.jruby.exceptions.MainExitException; +import org.jruby.runtime.Constants; +import org.jruby.runtime.load.LoadService; +import org.jruby.util.ClassCache; +import org.jruby.util.JRubyFile; +import org.jruby.util.KCode; +import org.jruby.util.NormalizedFile; +import org.jruby.util.SafePropertyAccessor; +import org.objectweb.asm.Opcodes; + +public class RubyInstanceConfig { + + /** + * The max count of active methods eligible for JIT-compilation. + */ + private static final int JIT_MAX_METHODS_LIMIT = 4096; + + /** + * The max size of JIT-compiled methods (full class size) allowed. + */ + private static final int JIT_MAX_SIZE_LIMIT = Integer.MAX_VALUE; + + /** + * The JIT threshold to the specified method invocation count. + */ + private static final int JIT_THRESHOLD = 50; + + /** The version to use for generated classes. Set to current JVM version by default */ + public static final int JAVA_VERSION; + + /** + * Default size for chained compilation. + */ + private static final int CHAINED_COMPILE_LINE_COUNT_DEFAULT = 500; + + /** + * The number of lines at which a method, class, or block body is split into + * chained methods (to dodge 64k method-size limit in JVM). + */ + public static final int CHAINED_COMPILE_LINE_COUNT + = SafePropertyAccessor.getInt("jruby.compile.chainsize", CHAINED_COMPILE_LINE_COUNT_DEFAULT); + + public enum CompileMode { + JIT, FORCE, OFF; + + public boolean shouldPrecompileCLI() { + switch (this) { + case JIT: case FORCE: + return true; + } + return false; + } + + public boolean shouldJIT() { + switch (this) { + case JIT: case FORCE: + return true; + } + return false; + } + + public boolean shouldPrecompileAll() { + return this == FORCE; + } + } + private InputStream input = System.in; + private PrintStream output = System.out; + private PrintStream error = System.err; + private Profile profile = Profile.DEFAULT; + private boolean objectSpaceEnabled + = SafePropertyAccessor.getBoolean("jruby.objectspace.enabled", false); + + private CompileMode compileMode = CompileMode.JIT; + private boolean runRubyInProcess = true; + private String currentDirectory; + private Map environment; + private String[] argv = {}; + + private final boolean jitLogging; + private final boolean jitLoggingVerbose; + private final int jitLogEvery; + private final int jitThreshold; + private final int jitMax; + private final int jitMaxSize; + private final boolean samplingEnabled; + private CompatVersion compatVersion; + + private ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + private ClassLoader loader = contextLoader == null ? RubyInstanceConfig.class.getClassLoader() : contextLoader; + + private ClassCache<Script> classCache; + + // from CommandlineParser + private List<String> loadPaths = new ArrayList<String>(); + private Set<String> excludedMethods = new HashSet<String>(); + private StringBuffer inlineScript = new StringBuffer(); + private boolean hasInlineScript = false; + private String scriptFileName = null; + private List<String> requiredLibraries = new ArrayList<String>(); + private boolean benchmarking = false; + private boolean argvGlobalsOn = false; + private boolean assumeLoop = false; + private boolean assumePrinting = false; + private Map optionGlobals = new HashMap(); + private boolean processLineEnds = false; + private boolean split = false; + // This property is a Boolean, to allow three values, so it can match MRI's nil, false and true + private Boolean verbose = Boolean.FALSE; + private boolean debug = false; + private boolean showVersion = false; + private boolean showBytecode = false; + private boolean showCopyright = false; + private boolean endOfArguments = false; + private boolean shouldRunInterpreter = true; + private boolean shouldPrintUsage = false; + private boolean shouldPrintProperties=false; + private boolean yarv = false; + private boolean rubinius = false; + private boolean yarvCompile = false; + private KCode kcode = KCode.NONE; + private String recordSeparator = "\n"; + private boolean shouldCheckSyntax = false; + private String inputFieldSeparator = null; + private boolean managementEnabled = true; + + private int safeLevel = 0; + + private String jrubyHome; + + public static final boolean FASTEST_COMPILE_ENABLED + = SafePropertyAccessor.getBoolean("jruby.compile.fastest"); + public static final boolean BOXED_COMPILE_ENABLED + = FASTEST_COMPILE_ENABLED + || SafePropertyAccessor.getBoolean("jruby.compile.boxed"); + public static final boolean FASTOPS_COMPILE_ENABLED + = FASTEST_COMPILE_ENABLED + || SafePropertyAccessor.getBoolean("jruby.compile.fastops"); + public static final boolean FRAMELESS_COMPILE_ENABLED + = FASTEST_COMPILE_ENABLED + || SafePropertyAccessor.getBoolean("jruby.compile.frameless"); + public static final boolean POSITIONLESS_COMPILE_ENABLED + = FASTEST_COMPILE_ENABLED + || SafePropertyAccessor.getBoolean("jruby.compile.positionless"); + public static final boolean THREADLESS_COMPILE_ENABLED + = FASTEST_COMPILE_ENABLED + || SafePropertyAccessor.getBoolean("jruby.compile.threadless"); + public static final boolean LAZYHANDLES_COMPILE = SafePropertyAccessor.getBoolean("jruby.compile.lazyHandles", false); + public static final boolean FORK_ENABLED + = SafePropertyAccessor.getBoolean("jruby.fork.enabled"); + public static final boolean POOLING_ENABLED + = SafePropertyAccessor.getBoolean("jruby.thread.pool.enabled"); + public static final int POOL_MAX + = SafePropertyAccessor.getInt("jruby.thread.pool.max", Integer.MAX_VALUE); + public static final int POOL_MIN + = SafePropertyAccessor.getInt("jruby.thread.pool.min", 0); + public static final int POOL_TTL + = SafePropertyAccessor.getInt("jruby.thread.pool.ttl", 60); + + public static final boolean NATIVE_NET_PROTOCOL + = SafePropertyAccessor.getBoolean("jruby.native.net.protocol", false); + + public static boolean FULL_TRACE_ENABLED + = SafePropertyAccessor.getBoolean("jruby.debug.fullTrace", false); + + public static final String COMPILE_EXCLUDE + = SafePropertyAccessor.getProperty("jruby.jit.exclude"); + public static boolean nativeEnabled = true; + + + public static interface LoadServiceCreator { + LoadService create(Ruby runtime); + + LoadServiceCreator DEFAULT = new LoadServiceCreator() { + public LoadService create(Ruby runtime) { + return new LoadService(runtime); + } + }; + } + + private LoadServiceCreator creator = LoadServiceCreator.DEFAULT; + + + static { + String specVersion = null; + try { + specVersion = System.getProperty("jruby.bytecode.version"); + if (specVersion == null) { + specVersion = System.getProperty("java.specification.version"); + } + if (System.getProperty("jruby.native.enabled") != null) { + nativeEnabled = Boolean.getBoolean("jruby.native.enabled"); + } + } catch (SecurityException se) { + nativeEnabled = false; + specVersion = "1.5"; + } + + if (specVersion.equals("1.5")) { + JAVA_VERSION = Opcodes.V1_5; + } else { + JAVA_VERSION = Opcodes.V1_6; + } + } + + public int characterIndex = 0; + + public RubyInstanceConfig() { + if (Ruby.isSecurityRestricted()) + currentDirectory = "/"; + else { + currentDirectory = JRubyFile.getFileProperty("user.dir"); + } + + samplingEnabled = SafePropertyAccessor.getBoolean("jruby.sampling.enabled", false); + String compatString = SafePropertyAccessor.getProperty("jruby.compat.version", "RUBY1_8"); + if (compatString.equalsIgnoreCase("RUBY1_8")) { + compatVersion = CompatVersion.RUBY1_8; + } else if (compatString.equalsIgnoreCase("RUBY1_9")) { + compatVersion = CompatVersion.RUBY1_9; + } else { + System.err.println("Compatibility version `" + compatString + "' invalid; use RUBY1_8 or RUBY1_9. Using RUBY1_8."); + compatVersion = CompatVersion.RUBY1_8; + } + + if (Ruby.isSecurityRestricted()) { + compileMode = CompileMode.OFF; + jitLogging = false; + jitLoggingVerbose = false; + jitLogEvery = 0; + jitThreshold = -1; + jitMax = 0; + jitMaxSize = -1; + managementEnabled = false; + } else { + String threshold = SafePropertyAccessor.getProperty("jruby.jit.threshold"); + String max = SafePropertyAccessor.getProperty("jruby.jit.max"); + String maxSize = SafePropertyAccessor.getProperty("jruby.jit.maxsize"); + + if (COMPILE_EXCLUDE != null) { + String[] elements = COMPILE_EXCLUDE.split(","); + for (String element : elements) excludedMethods.add(element); + } + + managementEnabled = SafePropertyAccessor.getBoolean("jruby.management.enabled", true); + runRubyInProcess = SafePropertyAccessor.getBoolean("jruby.launch.inproc", true); + boolean jitProperty = SafePropertyAccessor.getProperty("jruby.jit.enabled") != null; + if (jitProperty) { + error.print("jruby.jit.enabled property is deprecated; use jruby.compile.mode=(OFF|JIT|FORCE) for -C, default, and +C flags"); + compileMode = SafePropertyAccessor.getBoolean("jruby.jit.enabled") ? CompileMode.JIT : CompileMode.OFF; + } else { + String jitModeProperty = SafePropertyAccessor.getProperty("jruby.compile.mode", "JIT"); + + if (jitModeProperty.equals("OFF")) { + compileMode = CompileMode.OFF; + } else if (jitModeProperty.equals("JIT")) { + compileMode = CompileMode.JIT; + } else if (jitModeProperty.equals("FORCE")) { + compileMode = CompileMode.FORCE; + } else { + error.print("jruby.compile.mode property must be OFF, JIT, FORCE, or unset; defaulting to JIT"); + compileMode = CompileMode.JIT; + } + } + jitLogging = SafePropertyAccessor.getBoolean("jruby.jit.logging"); + jitLoggingVerbose = SafePropertyAccessor.getBoolean("jruby.jit.logging.verbose"); + String logEvery = SafePropertyAccessor.getProperty("jruby.jit.logEvery"); + jitLogEvery = logEvery == null ? 0 : Integer.parseInt(logEvery); + jitThreshold = threshold == null ? + JIT_THRESHOLD : Integer.parseInt(threshold); + jitMax = max == null ? + JIT_MAX_METHODS_LIMIT : Integer.parseInt(max); + jitMaxSize = maxSize == null ? + JIT_MAX_SIZE_LIMIT : Integer.parseInt(maxSize); + } + + // default ClassCache using jitMax as a soft upper bound + classCache = new ClassCache<Script>(loader, jitMax); + + if (FORK_ENABLED) { + error.print("WARNING: fork is highly unlikely to be safe or stable on the JVM. Have fun!\n"); + } + } + + public LoadServiceCreator getLoadServiceCreator() { + return creator; + } + + public void setLoadServiceCreator(LoadServiceCreator creator) { + this.creator = creator; + } + + public LoadService createLoadService(Ruby runtime) { + return this.creator.create(runtime); + } + + public String getBasicUsageHelp() { + StringBuilder sb = new StringBuilder(); + sb + .append("Usage: jruby [switches] [--] [programfile] [arguments]\n") + .append(" -0[octal] specify record separator (\0, if no argument)\n") + .append(" -a autosplit mode with -n or -p (splits $_ into $F)\n") + .append(" -b benchmark mode, times the script execution\n") + .append(" -c check syntax only\n") + .append(" -Cdirectory cd to directory, before executing your script\n") + .append(" -d set debugging flags (set $DEBUG to true)\n") + .append(" -e 'command' one line of script. Several -e's allowed. Omit [programfile]\n") + .append(" -Fpattern split() pattern for autosplit (-a)\n") + //.append(" -i[extension] edit ARGV files in place (make backup if extension supplied)\n") + .append(" -Idirectory specify $LOAD_PATH directory (may be used more than once)\n") + .append(" -J[java option] pass an option on to the JVM (e.g. -J-Xmx512m)\n") + .append(" use --properties to list JRuby properties\n") + .append(" run 'java -help' for a list of other Java options\n") + .append(" -Kkcode specifies code-set (e.g. -Ku for Unicode\n") + .append(" -l enable line ending processing\n") + .append(" -n assume 'while gets(); ... end' loop around your script\n") + .append(" -p assume loop like -n but print line also like sed\n") + .append(" -rlibrary require the library, before executing your script\n") + .append(" -s enable some switch parsing for switches after script name\n") + .append(" -S look for the script in bin or using PATH environment variable\n") + .append(" -T[level] turn on tainting checks\n") + .append(" -v print version number, then turn on verbose mode\n") + .append(" -w turn warnings on for your script\n") + .append(" -W[level] set warning level; 0=silence, 1=medium, 2=verbose (default)\n") + //.append(" -x[directory] strip off text before #!ruby line and perhaps cd to directory\n") + .append(" -X[option] enable extended option (omit option to list)\n") + .append(" --copyright print the copyright\n") + .append(" --debug sets the execution mode most suitable for debugger functionality\n") + .append(" --jdb runs JRuby process under JDB\n") + .append(" --properties List all configuration Java properties (pass -J-Dproperty=value)\n") + .append(" --sample run with profiling using the JVM's sampling profiler\n") + .append(" --client use the non-optimizing \"client\" JVM (improves startup; default)\n") + .append(" --server use the optimizing \"server\" JVM (improves perf)\n") + .append(" --manage enable remote JMX management and monitoring of the VM and JRuby\n") + .append(" --1.8 specify Ruby 1.8.x compatibility (default)\n") + .append(" --1.9 specify Ruby 1.9.x compatibility\n") + .append(" --bytecode show the JVM bytecode produced by compiling specified code\n") + .append(" --version print the version\n"); + + return sb.toString(); + } + + public String getExtendedHelp() { + StringBuilder sb = new StringBuilder(); + sb + .append("These flags are for extended JRuby options.\n") + .append("Specify them by passing -X<option>\n") + .append(" -O run with ObjectSpace disabled (default; improves performance)\n") + .append(" +O run with ObjectSpace enabled (reduces performance)\n") + .append(" -C disable all compilation\n") + .append(" +C force compilation of all scripts before they are run (except eval)\n") + .append(" -y read a YARV-compiled Ruby script and run that (EXPERIMENTAL)\n") + .append(" -Y compile a Ruby script into YARV bytecodes and run this (EXPERIMENTAL)\n") + .append(" -R read a Rubinius-compiled Ruby script and run that (EXPERIMENTAL)\n"); + + return sb.toString(); + } + + public String getPropertyHelp() { + StringBuilder sb = new StringBuilder(); + sb + .append("These properties can be used to alter runtime behavior for perf or compatibility.\n") + .append("Specify them by passing -J-D<property>=<value>\n") + .append("\nCOMPILER SETTINGS:\n") + .append(" jruby.compile.mode=JIT|FORCE|OFF\n") + .append(" Set compilation mode. JIT is default; FORCE compiles all, OFF disables\n") + .append(" jruby.compile.fastest=true|false\n") + .append(" (EXPERIMENTAL) Turn on all experimental compiler optimizations\n") + .append(" jruby.compile.boxed=true|false\n") + .append(" (EXPERIMENTAL) Use boxed variables; this can speed up some methods. Default is false\n") + .append(" jruby.compile.frameless=true|false\n") + .append(" (EXPERIMENTAL) Turn on frameless compilation where possible\n") + .append(" jruby.compile.positionless=true|false\n") + .append(" (EXPERIMENTAL) Turn on compilation that avoids updating Ruby position info. Default is false\n") + .append(" jruby.compile.threadless=true|false\n") + .append(" (EXPERIMENTAL) Turn on compilation without polling for \"unsafe\" thread events. Default is false\n") + .append(" jruby.compile.fastops=true|false\n") + .append(" (EXPERIMENTAL) Turn on fast operators for Fixnum. Default is false\n") + .append(" jruby.compile.chainsize=<line count>\n") + .append(" Set the number of lines at which compiled bodies are \"chained\". Default is " + CHAINED_COMPILE_LINE_COUNT_DEFAULT + "\n") + .append(" jruby.compile.lazyHandles=true|false\n") + .append(" Generate method bindings (handles) for compiled methods lazily. Default is false.") + .append("\nJIT SETTINGS:\n") + .append(" jruby.jit.threshold=<invocation count>\n") + .append(" Set the JIT threshold to the specified method invocation count. Default is " + JIT_THRESHOLD + ".\n") + .append(" jruby.jit.max=<method count>\n") + .append(" Set the max count of active methods eligible for JIT-compilation.\n") + .append(" Default is " + JIT_MAX_METHODS_LIMIT + " per runtime. A value of 0 disables JIT, -1 disables max.\n") + .append(" jruby.jit.maxsize=<jitted method size (full .class)>\n") + .append(" Set the maximum full-class byte size allowed for jitted methods. Default is Integer.MAX_VALUE\n") + .append(" jruby.jit.logging=true|false\n") + .append(" Enable JIT logging (reports successful compilation). Default is false\n") + .append(" jruby.jit.logging.verbose=true|false\n") + .append(" Enable verbose JIT logging (reports failed compilation). Default is false\n") + .append(" jruby.jit.logEvery=<method count>\n") + .append(" Log a message every n methods JIT compiled. Default is 0 (off).\n") + .append(" jruby.jit.exclude=<ClsOrMod,ClsOrMod::method_name,-::method_name>\n") + .append(" Exclude methods from JIT by class/module short name, c/m::method_name,\n") + .append(" or -::method_name for anon/singleton classes/modules. Comma-delimited.\n") + .append("\nNATIVE SUPPORT:\n") + .append(" jruby.native.enabled=true|false\n") + .append(" Enable/disable native extensions (like JNA for non-Java APIs; Default is true\n") + .append(" (This affects all JRuby instances in a given JVM)\n") + .append(" jruby.native.verbose=true|false\n") + .append(" Enable verbose logging of native extension loading. Default is false.\n") + .append(" jruby.fork.enabled=true|false\n") + .append(" (EXPERIMENTAL, maybe dangerous) Enable fork(2) on platforms that support it.\n") + .append("\nTHREAD POOLING:\n") + .append(" jruby.thread.pool.enabled=true|false\n") + .append(" Enable reuse of native backing threads via a thread pool. Default is false.\n") + .append(" jruby.thread.pool.min=<min thread count>\n") + .append(" The minimum number of threads to keep alive in the pool. Default is 0.\n") + .append(" jruby.thread.pool.max=<max thread count>\n") + .append(" The maximum number of threads to allow in the pool. Default is unlimited.\n") + .append(" jruby.thread.pool.ttl=<time to live, in seconds>\n") + .append(" The maximum number of seconds to keep alive an idle thread. Default is 60.\n") + .append("\nMISCELLANY:\n") + .append(" jruby.compat.version=RUBY1_8|RUBY1_9\n") + .append(" Specify the major Ruby version to be compatible with; Default is RUBY1_8\n") + .append(" jruby.objectspace.enabled=true|false\n") + .append(" Enable or disable ObjectSpace.each_object (default is disabled)\n") + .append(" jruby.launch.inproc=true|false\n") + .append(" Set in-process launching of e.g. system('ruby ...'). Default is true\n") + .append(" jruby.bytecode.version=1.5|1.6\n") + .append(" Set bytecode version for JRuby to generate. Default is current JVM version.\n") + .append(" jruby.management.enabled=true|false\n") + .append(" Set whether JMX management is enabled. Default is true.\n") + .append(" jruby.debug.fullTrace=true|false\n") + .append(" Set whether full traces are enabled (c-call/c-return). Default is false.\n"); + + return sb.toString(); + } + + public String getVersionString() { + String ver = Constants.RUBY_VERSION; + switch (compatVersion) { + case RUBY1_8: + ver = Constants.RUBY_VERSION; + break; + case RUBY1_9: + ver = Constants.RUBY1_9_VERSION; + break; + } + + String fullVersion = String.format( + "jruby %s (ruby %s patchlevel %s) (%s rev %s) [%s-java]\n", + Constants.VERSION, ver, Constants.RUBY_PATCHLEVEL, + Constants.COMPILE_DATE, Constants.REVISION, + SafePropertyAccessor.getProperty("os.arch", "unknown") + ); + + return fullVersion; + } + + public String getCopyrightString() { + return "JRuby - Copyright (C) 2001-2008 The JRuby Community (and contribs)\n"; + } + + public void processArguments(String[] arguments) { + new ArgumentProcessor(arguments).processArguments(); + } + + public CompileMode getCompileMode() { + return compileMode; + } + + public void setCompileMode(CompileMode compileMode) { + this.compileMode = compileMode; + } + + public boolean isJitLogging() { + return jitLogging; + } + + public boolean isJitLoggingVerbose() { + return jitLoggingVerbose; + } + + public int getJitLogEvery() { + return jitLogEvery; + } + + public boolean isSamplingEnabled() { + return samplingEnabled; + } + + public int getJitThreshold() { + return jitThreshold; + } + + public int getJitMax() { + return jitMax; + } + + public int getJitMaxSize() { + return jitMaxSize; + } + + public boolean isRunRubyInProcess() { + return runRubyInProcess; + } + + public void setRunRubyInProcess(boolean flag) { + this.runRubyInProcess = flag; + } + + public void setInput(InputStream newInput) { + input = newInput; + } + + public InputStream getInput() { + return input; + } + + public CompatVersion getCompatVersion() { + return compatVersion; + } + + public void setOutput(PrintStream newOutput) { + output = newOutput; + } + + public PrintStream getOutput() { + return output; + } + + public void setError(PrintStream newError) { + error = newError; + } + + public PrintStream getError() { + return error; + } + + public void setCurrentDirectory(String newCurrentDirectory) { + currentDirectory = newCurrentDirectory; + } + + public String getCurrentDirectory() { + return currentDirectory; + } + + public void setProfile(Profile newProfile) { + profile = newProfile; + } + + public Profile getProfile() { + return profile; + } + + public void setObjectSpaceEnabled(boolean newObjectSpaceEnabled) { + objectSpaceEnabled = newObjectSpaceEnabled; + } + + public boolean isObjectSpaceEnabled() { + return objectSpaceEnabled; + } + + public void setEnvironment(Map newEnvironment) { + environment = newEnvironment; + } + + public Map getEnvironment() { + return environment; + } + + public ClassLoader getLoader() { + return loader; + } + + public void setLoader(ClassLoader loader) { + // Setting the loader needs to reset the class cache + if(this.loader != loader) { + this.classCache = new ClassCache<Script>(loader, this.classCache.getMax()); + } + this.loader = loader; + } + + public String[] getArgv() { + return argv; + } + + public void setArgv(String[] argv) { + this.argv = argv; + } + + public String getJRubyHome() { + if (jrubyHome == null) { + if (Ruby.isSecurityRestricted()) { + return "SECURITY RESTRICTED"; + } + jrubyHome = verifyHome(SafePropertyAccessor.getProperty("jruby.home", + SafePropertyAccessor.getProperty("user.home") + "/.jruby")); + + try { + // This comment also in rbConfigLibrary + // Our shell scripts pass in non-canonicalized paths, but even if we didn't + // anyone who did would become unhappy because Ruby apps expect no relative + // operators in the pathname (rubygems, for example). + jrubyHome = new NormalizedFile(jrubyHome).getCanonicalPath(); + } catch (IOException e) { } + + jrubyHome = new NormalizedFile(jrubyHome).getAbsolutePath(); + } + return jrubyHome; + } + + public void setJRubyHome(String home) { + jrubyHome = verifyHome(home); + } + + // We require the home directory to be absolute + private String verifyHome(String home) { + if (home.equals(".")) { + home = System.getProperty("user.dir"); + } + if (!home.startsWith("file:")) { + NormalizedFile f = new NormalizedFile(home); + if (!f.isAbsolute()) { + home = f.getAbsolutePath(); + } + f.mkdirs(); + } + return home; + } + + private class ArgumentProcessor { + private String[] arguments; + private int argumentIndex = 0; + + public ArgumentProcessor(String[] arguments) { + this.arguments = arguments; + } + + public void processArguments() { + while (argumentIndex < arguments.length && isInterpreterArgument(arguments[argumentIndex])) { + processArgument(); + argumentIndex++; + } + + if (!hasInlineScript && scriptFileName == null) { + if (argumentIndex < arguments.length) { + setScriptFileName(arguments[argumentIndex]); //consume the file name + argumentIndex++; + } + } + + processArgv(); + } + + private void processArgv() { + List<String> arglist = new ArrayList<String>(); + for (; argumentIndex < arguments.length; argumentIndex++) { + String arg = arguments[argumentIndex]; + if (argvGlobalsOn && arg.startsWith("-")) { + arg = arg.substring(1); + if (arg.indexOf('=') > 0) { + String[] keyvalue = arg.split("=", 2); + optionGlobals.put(keyvalue[0], keyvalue[1]); + } else { + optionGlobals.put(arg, null); + } + } else { + argvGlobalsOn = false; + arglist.add(arg); + } + } + + // Remaining arguments are for the script itself + argv = arglist.toArray(new String[arglist.size()]); + } + + private boolean isInterpreterArgument(String argument) { + return (argument.charAt(0) == '-' || argument.charAt(0) == '+') && !endOfArguments; + } + + private String getArgumentError(String additionalError) { + return "jruby: invalid argument\n" + additionalError + "\n"; + } + + private void processArgument() { + String argument = arguments[argumentIndex]; + FOR : for (characterIndex = 1; characterIndex < argument.length(); characterIndex++) { + switch (argument.charAt(characterIndex)) { + case '0': { + String temp = grabOptionalValue(); + if (null == temp) { + recordSeparator = "\u0000"; + } else if (temp.equals("0")) { + recordSeparator = "\n\n"; + } else if (temp.equals("777")) { + recordSeparator = "\uFFFF"; // Specify something that can't separate + } else { + try { + int val = Integer.parseInt(temp, 8); + recordSeparator = "" + (char) val; + } catch (Exception e) { + MainExitException mee = new MainExitException(1, getArgumentError(" -0 must be followed by either 0, 777, or a valid octal value")); + mee.setUsageError(true); + throw mee; + } + } + break FOR; + } + case 'a': + split = true; + break; + case 'b': + benchmarking = true; + break; + case 'c': + shouldCheckSyntax = true; + break; + case 'C': + try { + String saved = grabValue(getArgumentError(" -C must be followed by a directory expression")); + File base = new File(currentDirectory); + File newDir = new File(saved); + if (newDir.isAbsolute()) { + currentDirectory = newDir.getCanonicalPath(); + } else { + currentDirectory = new File(base, newDir.getPath()).getCanonicalPath(); + } + if (!(new File(currentDirectory).isDirectory())) { + MainExitException mee = new MainExitException(1, "jruby: Can't chdir to " + saved + " (fatal)"); + mee.setUsageError(true); + throw mee; + } + } catch (IOException e) { + MainExitException mee = new MainExitException(1, getArgumentError(" -C must be followed by a valid directory")); + mee.setUsageError(true); + throw mee; + } + break; + case 'd': + debug = true; + verbose = Boolean.TRUE; + break; + case 'e': + inlineScript.append(grabValue(getArgumentError(" -e must be followed by an expression to evaluate"))); + inlineScript.append('\n'); + hasInlineScript = true; + break FOR; + case 'F': + inputFieldSeparator = grabValue(getArgumentError(" -F must be followed by a pattern for input field separation")); + break; + case 'h': + shouldPrintUsage = true; + shouldRunInterpreter = false; + break; + // FIXME: -i flag not supported +// case 'i' : +// break; + case 'I': + String s = grabValue(getArgumentError("-I must be followed by a directory name to add to lib path")); + String[] ls = s.split(java.io.File.pathSeparator); + for (int i = 0; i < ls.length; i++) { + loadPaths.add(ls[i]); + } + break FOR; + case 'K': + // FIXME: No argument seems to work for -K in MRI plus this should not + // siphon off additional args 'jruby -K ~/scripts/foo'. Also better error + // processing. + String eArg = grabValue(getArgumentError("provide a value for -K")); + kcode = KCode.create(null, eArg); + break; + case 'l': + processLineEnds = true; + break; + case 'n': + assumeLoop = true; + break; + case 'p': + assumePrinting = true; + assumeLoop = true; + break; + case 'r': + requiredLibraries.add(grabValue(getArgumentError("-r must be followed by a package to require"))); + break FOR; + case 's' : + argvGlobalsOn = true; + break; + case 'S': + runBinScript(); + break FOR; + case 'T' :{ + String temp = grabOptionalValue(); + int value = 1; + + if(temp!=null) { + try { + value = Integer.parseInt(temp, 8); + } catch(Exception e) { + value = 1; + } + } + + safeLevel = value; + + break FOR; + } + case 'v': + verbose = Boolean.TRUE; + setShowVersion(true); + break; + case 'w': + verbose = Boolean.TRUE; + break; + case 'W': { + String temp = grabOptionalValue(); + int value = 2; + if (null != temp) { + if (temp.equals("2")) { + value = 2; + } else if (temp.equals("1")) { + value = 1; + } else if (temp.equals("0")) { + value = 0; + } else { + MainExitException mee = new MainExitException(1, getArgumentError(" -W must be followed by either 0, 1, 2 or nothing")); + mee.setUsageError(true); + throw mee; + } + } + switch (value) { + case 0: + verbose = null; + break; + case 1: + verbose = Boolean.FALSE; + break; + case 2: + verbose = Boolean.TRUE; + break; + } + + + break FOR; + } + // FIXME: -x flag not supported +// case 'x' : +// break; + case 'X': + String extendedOption = grabOptionalValue(); + + if (extendedOption == null) { + throw new MainExitException(0, "jruby: missing extended option, listing available options\n" + getExtendedHelp()); + } else if (extendedOption.equals("-O")) { + objectSpaceEnabled = false; + } else if (extendedOption.equals("+O")) { + objectSpaceEnabled = true; + } else if (extendedOption.equals("-C")) { + compileMode = CompileMode.OFF; + } else if (extendedOption.equals("+C")) { + compileMode = CompileMode.FORCE; + } else if (extendedOption.equals("-y")) { + yarv = true; + } else if (extendedOption.equals("-Y")) { + yarvCompile = true; + } else if (extendedOption.equals("-R")) { + rubinius = true; + } else { + MainExitException mee = + new MainExitException(1, "jruby: invalid extended option " + extendedOption + " (-X will list valid options)\n"); + mee.setUsageError(true); + + throw mee; + } + break FOR; + case '-': + if (argument.equals("--command") || argument.equals("--bin")) { + characterIndex = argument.length(); + runBinScript(); + break; + } else if (argument.equals("--compat")) { + characterIndex = argument.length(); + compatVersion = CompatVersion.getVersionFromString(grabValue(getArgumentError("--compat must be RUBY1_8 or RUBY1_9"))); + if (compatVersion == null) { + compatVersion = CompatVersion.RUBY1_8; + } + break FOR; + } else if (argument.equals("--copyright")) { + setShowCopyright(true); + shouldRunInterpreter = false; + break FOR; + } else if (argument.equals("--debug")) { + compileMode = CompileMode.OFF; + FULL_TRACE_ENABLED = true; + System.setProperty("jruby.reflection", "true"); + break FOR; + } else if (argument.equals("--jdb")) { + debug = true; + verbose = Boolean.TRUE; + break; + } else if (argument.equals("--help")) { + shouldPrintUsage = true; + shouldRunInterpreter = false; + break; + } else if (argument.equals("--properties")) { + shouldPrintProperties = true; + shouldRunInterpreter = false; + break; + } else if (argument.equals("--version")) { + setShowVersion(true); + break FOR; + } else if (argument.equals("--bytecode")) { + setShowBytecode(true); + break FOR; + } else { + if (argument.equals("--")) { + // ruby interpreter compatibilty + // Usage: ruby [switches] [--] [programfile] [arguments]) + endOfArguments = true; + break; + } + } + default: + throw new MainExitException(1, "jruby: unknown option " + argument); + } + } + } + + private void runBinScript() { + String scriptName = grabValue("jruby: provide a bin script to execute"); + if (scriptName.equals("irb")) { + scriptName = "jirb"; + } + + scriptFileName = scriptName; + + if (!new File(scriptFileName).exists()) { + try { + String jrubyHome = JRubyFile.create(System.getProperty("user.dir"), JRubyFile.getFileProperty("jruby.home")).getCanonicalPath(); + scriptFileName = JRubyFile.create(jrubyHome + JRubyFile.separator + "bin", scriptName).getCanonicalPath(); + } catch (IOException io) { + MainExitException mee = new MainExitException(1, "jruby: Can't determine script filename"); + mee.setUsageError(true); + throw mee; + } + } + + // route 'gem' through ruby code in case we're running out of the complete jar + if (scriptName.equals("gem") || !new File(scriptFileName).exists()) { + requiredLibraries.add("jruby/commands"); + inlineScript.append("JRuby::Commands." + scriptName); + inlineScript.append("\n"); + hasInlineScript = true; + } + endOfArguments = true; + } + + private String grabValue(String errorMessage) { + characterIndex++; + if (characterIndex < arguments[argumentIndex].length()) { + return arguments[argumentIndex].substring(characterIndex); + } + argumentIndex++; + if (argumentIndex < arguments.length) { + return arguments[argumentIndex]; + } + + MainExitException mee = new MainExitException(1, errorMessage); + mee.setUsageError(true); + + throw mee; + } + + private String grabOptionalValue() { + characterIndex++; + if (characterIndex < arguments[argumentIndex].length()) { + return arguments[argumentIndex].substring(characterIndex); + } + return null; + } + } + + public byte[] inlineScript() { + return inlineScript.toString().getBytes(); + } + + public List<String> requiredLibraries() { + return requiredLibraries; + } + + public List<String> loadPaths() { + return loadPaths; + } + + public boolean shouldRunInterpreter() { + if(isShowVersion() && (hasInlineScript || scriptFileName != null)) { + return true; + } + return isShouldRunInterpreter(); + } + + public boolean shouldPrintUsage() { + return shouldPrintUsage; + } + + public boolean shouldPrintProperties() { + return shouldPrintProperties; + } + + private boolean isSourceFromStdin() { + return getScriptFileName() == null; + } + + public boolean isInlineScript() { + return hasInlineScript; + } + + public InputStream getScriptSource() { + try { + // KCode.NONE is used because KCODE does not affect parse in Ruby 1.8 + // if Ruby 2.0 encoding pragmas are implemented, this will need to change + if (hasInlineScript) { + return new ByteArrayInputStream(inlineScript()); + } else if (isSourceFromStdin()) { + // can't use -v and stdin + if (isShowVersion()) { + return null; + } + return getInput(); + } else { + File file = JRubyFile.create(getCurrentDirectory(), getScriptFileName()); + return new BufferedInputStream(new FileInputStream(file)); + } + } catch (IOException e) { + throw new MainExitException(1, "Error opening script file: " + e.getMessage()); + } + } + + public String displayedFileName() { + if (hasInlineScript) { + if (scriptFileName != null) { + return scriptFileName; + } else { + return "-e"; + } + } else if (isSourceFromStdin()) { + return "-"; + } else { + return getScriptFileName(); + } + } + + private void setScriptFileName(String scriptFileName) { + this.scriptFileName = scriptFileName; + } + + public String getScriptFileName() { + return scriptFileName; + } + + public boolean isBenchmarking() { + return benchmarking; + } + + public boolean isAssumeLoop() { + return assumeLoop; + } + + public boolean isAssumePrinting() { + return assumePrinting; + } + + public boolean isProcessLineEnds() { + return processLineEnds; + } + + public boolean isSplit() { + return split; + } + + public boolean isVerbose() { + return verbose == Boolean.TRUE; + } + + public Boolean getVerbose() { + return verbose; + } + + public boolean isDebug() { + return debug; + } + + public boolean isShowVersion() { + return showVersion; + } + + public boolean isShowBytecode() { + return showBytecode; + } + + public boolean isShowCopyright() { + return showCopyright; + } + + protected void setShowVersion(boolean showVersion) { + this.showVersion = showVersion; + } + + protected void setShowBytecode(boolean showBytecode) { + this.showBytecode = showBytecode; + } + + protected void setShowCopyright(boolean showCopyright) { + this.showCopyright = showCopyright; + } + + public boolean isShouldRunInterpreter() { + return shouldRunInterpreter; + } + + public boolean isShouldCheckSyntax() { + return shouldCheckSyntax; + } + + public boolean isYARVEnabled() { + return yarv; + } + + public String getInputFieldSeparator() { + return inputFieldSeparator; + } + + public boolean isRubiniusEnabled() { + return rubinius; + } + + public boolean isYARVCompileEnabled() { + return yarvCompile; + } + + public KCode getKCode() { + return kcode; + } + + public String getRecordSeparator() { + return recordSeparator; + } + + public int getSafeLevel() { + return safeLevel; + } + + public void setRecordSeparator(String recordSeparator) { + this.recordSeparator = recordSeparator; + } + + public ClassCache getClassCache() { + return classCache; + } + + public void setClassCache(ClassCache classCache) { + this.classCache = classCache; + } + + public Map getOptionGlobals() { + return optionGlobals; + } + + public boolean isManagementEnabled() { + return managementEnabled; + } + + public Set getExcludedMethods() { + return excludedMethods; + } + +} +/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Charles O Nutter <headius@headius.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.Block; +import org.jruby.runtime.BlockBody; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; + +/** Implementation of the Integer class. + * + * @author jpetersen + */ +@JRubyClass(name="Integer", parent="Numeric", include="Precision") +public abstract class RubyInteger extends RubyNumeric { + + public static RubyClass createIntegerClass(Ruby runtime) { + RubyClass integer = runtime.defineClass("Integer", runtime.getNumeric(), + ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setInteger(integer); + integer.kindOf = new RubyModule.KindOf() { + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyInteger; + } + }; + + integer.getSingletonClass().undefineMethod("new"); + + integer.includeModule(runtime.getPrecision()); + + integer.defineAnnotatedMethods(RubyInteger.class); + + return integer; + } + + public RubyInteger(Ruby runtime, RubyClass rubyClass) { + super(runtime, rubyClass); + } + + public RubyInteger(Ruby runtime, RubyClass rubyClass, boolean useObjectSpace) { + super(runtime, rubyClass, useObjectSpace); + } + + public RubyInteger convertToInteger() { + return this; + } + + // conversion + protected RubyFloat toFloat() { + return RubyFloat.newFloat(getRuntime(), getDoubleValue()); + } + + /* ================ + * Instance Methods + * ================ + */ + + /** int_int_p + * + */ + @JRubyMethod(name = "integer?") + public IRubyObject integer_p() { + return getRuntime().getTrue(); + } + + /** int_upto + * + */ + @JRubyMethod(name = "upto", frame = true) + public IRubyObject upto(ThreadContext context, IRubyObject to, Block block) { + final Ruby runtime = getRuntime(); + + if (this instanceof RubyFixnum && to instanceof RubyFixnum) { + RubyFixnum toFixnum = (RubyFixnum) to; + final long toValue = toFixnum.getLongValue(); + final long fromValue = getLongValue(); + + if (block.getBody().getArgumentType() == BlockBody.ZERO_ARGS) { + final IRubyObject nil = runtime.getNil(); + for (long i = fromValue; i <= toValue; i++) { + block.yield(context, nil); + } + } else { + for (long i = fromValue; i <= toValue; i++) { + block.yield(context, RubyFixnum.newFixnum(runtime, i)); + } + } + } else { + RubyNumeric i = this; + + while (true) { + if (i.callMethod(context, MethodIndex.OP_GT, ">", to).isTrue()) { + break; + } + block.yield(context, i); + i = (RubyNumeric) i.callMethod(context, MethodIndex.OP_PLUS, "+", RubyFixnum.one(runtime)); + } + } + return this; + } + + /** int_downto + * + */ + // TODO: Make callCoerced work in block context...then fix downto, step, and upto. + @JRubyMethod(name = "downto", frame = true) + public IRubyObject downto(ThreadContext context, IRubyObject to, Block block) { + final Ruby runtime = getRuntime(); + + if (this instanceof RubyFixnum && to instanceof RubyFixnum) { + RubyFixnum toFixnum = (RubyFixnum) to; + final long toValue = toFixnum.getLongValue(); + if (block.getBody().getArgumentType() == BlockBody.ZERO_ARGS) { + final IRubyObject nil = runtime.getNil(); + for (long i = getLongValue(); i >= toValue; i--) { + block.yield(context, nil); + } + } else { + for (long i = getLongValue(); i >= toValue; i--) { + block.yield(context, RubyFixnum.newFixnum(getRuntime(), i)); + } + } + } else { + RubyNumeric i = this; + + while (true) { + if (i.callMethod(context, MethodIndex.OP_LT, "<", to).isTrue()) { + break; + } + block.yield(context, i); + i = (RubyNumeric) i.callMethod(context, MethodIndex.OP_MINUS, "-", RubyFixnum.one(getRuntime())); + } + } + return this; + } + + @JRubyMethod(name = "times", frame = true) + public IRubyObject times(ThreadContext context, Block block) { + final Ruby runtime = context.getRuntime(); + + if (this instanceof RubyFixnum) { + final long value = getLongValue(); + if (block.getBody().getArgumentType() == BlockBody.ZERO_ARGS) { + final IRubyObject nil = runtime.getNil(); + for (long i = 0; i < value; i++) { + block.yield(context, nil); + } + } else { + for (long i = 0; i < value; i++) { + block.yield(context, RubyFixnum.newFixnum(runtime, i)); + } + } + } else { + RubyNumeric i = RubyFixnum.zero(runtime); + while (true) { + if (!i.callMethod(context, MethodIndex.OP_LT, "<", this).isTrue()) { + break; + } + block.yield(context, i); + i = (RubyNumeric) i.callMethod(context, MethodIndex.OP_PLUS, "+", RubyFixnum.one(runtime)); + } + } + + return this; + } + + /** int_succ + * + */ + @JRubyMethod(name = {"succ", "next"}) + public IRubyObject succ(ThreadContext context) { + if (this instanceof RubyFixnum) { + return RubyFixnum.newFixnum(getRuntime(), getLongValue() + 1L); + } else { + return callMethod(context, MethodIndex.OP_PLUS, "+", RubyFixnum.one(getRuntime())); + } + } + + /** int_chr + * + */ + @JRubyMethod(name = "chr") + public RubyString chr() { + if (getLongValue() < 0 || getLongValue() > 0xff) { + throw getRuntime().newRangeError(this.toString() + " out of char range"); + } + return RubyString.newString(getRuntime(), new ByteList(new byte[]{(byte)getLongValue()}, false)); + } + + /** int_to_i + * + */ + @JRubyMethod(name = {"to_i", "to_int", "floor", "ceil", "round", "truncate"}) + public RubyInteger to_i() { + return this; + } + + /** integer_to_r + * + */ + @JRubyMethod(name = "to_r", compat = CompatVersion.RUBY1_9) + public IRubyObject to_r(ThreadContext context) { + return RubyRational.newRationalCanonicalize(context, this); + } + + + @JRubyMethod(name = {"odd?"}) + public static RubyBoolean odd_p(ThreadContext context, IRubyObject recv) { + if(recv.callMethod(context, "%", recv.getRuntime().newFixnum(2)) != RubyFixnum.zero(recv.getRuntime())) { + return recv.getRuntime().getTrue(); + } + return recv.getRuntime().getFalse(); + } + + @JRubyMethod(name = {"even?"}) + public static RubyBoolean even_p(ThreadContext context, IRubyObject recv) { + if(recv.callMethod(context, "%", recv.getRuntime().newFixnum(2)) == RubyFixnum.zero(recv.getRuntime())) { + return recv.getRuntime().getTrue(); + } + return recv.getRuntime().getFalse(); + } + + @JRubyMethod + public static IRubyObject pred(ThreadContext context, IRubyObject recv) { + return recv.callMethod(context, "-", recv.getRuntime().newFixnum(1)); + } + + + /* ================ + * Singleton Methods + * ================ + */ + + /** rb_int_induced_from + * + */ + @JRubyMethod(name = "induced_from", meta = true) + public static IRubyObject induced_from(ThreadContext context, IRubyObject recv, IRubyObject other) { + if (other instanceof RubyFixnum || other instanceof RubyBignum) { + return other; + } else if (other instanceof RubyFloat || other instanceof RubyRational) { + return other.callMethod(context, MethodIndex.TO_I, "to_i"); + } else { + throw recv.getRuntime().newTypeError( + "failed to convert " + other.getMetaClass().getName() + " into Integer"); + } + } +} +/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2006 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Evan Buswell <ebuswell@gmail.com> + * Copyright (C) 2007 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.EOFException; +import java.io.FileDescriptor; +import java.io.FilterInputStream; +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.nio.channels.Channel; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.Pipe; +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import java.util.concurrent.atomic.AtomicInteger; +import org.jruby.anno.FrameField; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.exceptions.RaiseException; +import org.jruby.ext.posix.util.FieldAccess; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallType; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.io.Stream; +import org.jruby.util.io.ModeFlags; +import org.jruby.util.ShellLauncher; +import org.jruby.util.TypeConverter; +import org.jruby.util.io.BadDescriptorException; +import org.jruby.util.io.ChannelStream; +import org.jruby.util.io.InvalidValueException; +import org.jruby.util.io.PipeException; +import org.jruby.util.io.FileExistsException; +import org.jruby.util.io.STDIO; +import org.jruby.util.io.OpenFile; +import org.jruby.util.io.ChannelDescriptor; + +import static org.jruby.CompatVersion.*; + +/** + * + * @author jpetersen + */ +@JRubyClass(name="IO", include="Enumerable") +public class RubyIO extends RubyObject { + protected OpenFile openFile; + protected List<RubyThread> blockingThreads; + + public void registerDescriptor(ChannelDescriptor descriptor) { + getRuntime().getDescriptors().put(new Integer(descriptor.getFileno()), new WeakReference<ChannelDescriptor>(descriptor)); + } + + public void unregisterDescriptor(int aFileno) { + getRuntime().getDescriptors().remove(new Integer(aFileno)); + } + + public ChannelDescriptor getDescriptorByFileno(int aFileno) { + Reference<ChannelDescriptor> reference = getRuntime().getDescriptors().get(new Integer(aFileno)); + if (reference == null) { + return null; + } + return reference.get(); + } + + // FIXME can't use static; would interfere with other runtimes in the same JVM + protected static AtomicInteger filenoIndex = new AtomicInteger(2); + + public static int getNewFileno() { + return filenoIndex.incrementAndGet(); + } + + // This should only be called by this and RubyFile. + // It allows this object to be created without a IOHandler. + public RubyIO(Ruby runtime, RubyClass type) { + super(runtime, type); + + openFile = new OpenFile(); + } + + public RubyIO(Ruby runtime, OutputStream outputStream) { + super(runtime, runtime.getIO()); + + // We only want IO objects with valid streams (better to error now). + if (outputStream == null) { + throw runtime.newIOError("Opening invalid stream"); + } + + openFile = new OpenFile(); + + try { + openFile.setMainStream(new ChannelStream(runtime, new ChannelDescriptor(Channels.newChannel(outputStream), getNewFileno(), new FileDescriptor()))); + } catch (InvalidValueException e) { + throw getRuntime().newErrnoEINVALError(); + } + + openFile.setMode(OpenFile.WRITABLE | OpenFile.APPEND); + + registerDescriptor(openFile.getMainStream().getDescriptor()); + } + + public RubyIO(Ruby runtime, InputStream inputStream) { + super(runtime, runtime.getIO()); + + if (inputStream == null) { + throw runtime.newIOError("Opening invalid stream"); + } + + openFile = new OpenFile(); + + try { + openFile.setMainStream(new ChannelStream(runtime, new ChannelDescriptor(Channels.newChannel(inputStream), getNewFileno(), new FileDescriptor()))); + } catch (InvalidValueException e) { + throw getRuntime().newErrnoEINVALError(); + } + + openFile.setMode(OpenFile.READABLE); + + registerDescriptor(openFile.getMainStream().getDescriptor()); + } + + public RubyIO(Ruby runtime, Channel channel) { + super(runtime, runtime.getIO()); + + // We only want IO objects with valid streams (better to error now). + if (channel == null) { + throw runtime.newIOError("Opening invalid stream"); + } + + openFile = new OpenFile(); + + try { + openFile.setMainStream(new ChannelStream(runtime, new ChannelDescriptor(channel, getNewFileno(), new FileDescriptor()))); + } catch (InvalidValueException e) { + throw getRuntime().newErrnoEINVALError(); + } + + openFile.setMode(openFile.getMainStream().getModes().getOpenFileFlags()); + + registerDescriptor(openFile.getMainStream().getDescriptor()); + } + + public RubyIO(Ruby runtime, ShellLauncher.POpenProcess process, ModeFlags modes) { + super(runtime, runtime.getIO()); + + openFile = new OpenFile(); + + openFile.setMode(modes.getOpenFileFlags() | OpenFile.SYNC); + openFile.setProcess(process); + + try { + if (openFile.isReadable()) { + Channel inChannel; + if (process.getInput() != null) { + // NIO-based + inChannel = process.getInput(); + } else { + // Stream-based + inChannel = Channels.newChannel(process.getInputStream()); + } + + ChannelDescriptor main = new ChannelDescriptor( + inChannel, + getNewFileno(), + new FileDescriptor()); + main.setCanBeSeekable(false); + + openFile.setMainStream(new ChannelStream(getRuntime(), main)); + registerDescriptor(main); + } + + if (openFile.isWritable()) { + Channel outChannel; + if (process.getOutput() != null) { + // NIO-based + outChannel = process.getOutput(); + } else { + outChannel = Channels.newChannel(process.getOutputStream()); + } + + ChannelDescriptor pipe = new ChannelDescriptor( + outChannel, + getNewFileno(), + new FileDescriptor()); + pipe.setCanBeSeekable(false); + + if (openFile.getMainStream() != null) { + openFile.setPipeStream(new ChannelStream(getRuntime(), pipe)); + } else { + openFile.setMainStream(new ChannelStream(getRuntime(), pipe)); + } + + registerDescriptor(pipe); + } + } catch (InvalidValueException e) { + throw getRuntime().newErrnoEINVALError(); + } + } + + public RubyIO(Ruby runtime, STDIO stdio) { + super(runtime, runtime.getIO()); + + openFile = new OpenFile(); + + try { + switch (stdio) { + case IN: + openFile.setMainStream( + new ChannelStream( + runtime, + // special constructor that accepts stream, not channel + new ChannelDescriptor(runtime.getIn(), 0, new ModeFlags(ModeFlags.RDONLY), FileDescriptor.in), + FileDescriptor.in)); + break; + case OUT: + openFile.setMainStream( + new ChannelStream( + runtime, + new ChannelDescriptor(Channels.newChannel(runtime.getOut()), 1, new ModeFlags(ModeFlags.WRONLY | ModeFlags.APPEND), FileDescriptor.out), + FileDescriptor.out)); + openFile.getMainStream().setSync(true); + break; + case ERR: + openFile.setMainStream( + new ChannelStream( + runtime, + new ChannelDescriptor(Channels.newChannel(runtime.getErr()), 2, new ModeFlags(ModeFlags.WRONLY | ModeFlags.APPEND), FileDescriptor.err), + FileDescriptor.err)); + openFile.getMainStream().setSync(true); + break; + } + } catch (InvalidValueException ex) { + throw getRuntime().newErrnoEINVALError(); + } + + openFile.setMode(openFile.getMainStream().getModes().getOpenFileFlags()); + + registerDescriptor(openFile.getMainStream().getDescriptor()); + } + + public static RubyIO newIO(Ruby runtime, Channel channel) { + return new RubyIO(runtime, channel); + } + + public OpenFile getOpenFile() { + return openFile; + } + + protected OpenFile getOpenFileChecked() { + openFile.checkClosed(getRuntime()); + return openFile; + } + + private static ObjectAllocator IO_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyIO(runtime, klass); + } + }; + + public static RubyClass createIOClass(Ruby runtime) { + RubyClass ioClass = runtime.defineClass("IO", runtime.getObject(), IO_ALLOCATOR); + ioClass.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyIO; + } + }; + + ioClass.includeModule(runtime.getEnumerable()); + + // TODO: Implement tty? and isatty. We have no real capability to + // determine this from java, but if we could set tty status, then + // we could invoke jruby differently to allow stdin to return true + // on this. This would allow things like cgi.rb to work properly. + + ioClass.defineAnnotatedMethods(RubyIO.class); + + // Constants for seek + ioClass.fastSetConstant("SEEK_SET", runtime.newFixnum(Stream.SEEK_SET)); + ioClass.fastSetConstant("SEEK_CUR", runtime.newFixnum(Stream.SEEK_CUR)); + ioClass.fastSetConstant("SEEK_END", runtime.newFixnum(Stream.SEEK_END)); + + return ioClass; + } + + public OutputStream getOutStream() { + return getOpenFileChecked().getMainStream().newOutputStream(); + } + + public InputStream getInStream() { + return getOpenFileChecked().getMainStream().newInputStream(); + } + + public Channel getChannel() { + if (getOpenFileChecked().getMainStream() instanceof ChannelStream) { + return ((ChannelStream) openFile.getMainStream()).getDescriptor().getChannel(); + } else { + return null; + } + } + + public Stream getHandler() { + return getOpenFileChecked().getMainStream(); + } + + @JRubyMethod(name = "reopen", required = 1, optional = 1) + public IRubyObject reopen(ThreadContext context, IRubyObject[] args) throws InvalidValueException { + Ruby runtime = context.getRuntime(); + + if (args.length < 1) { + throw runtime.newArgumentError("wrong number of arguments"); + } + + IRubyObject tmp = TypeConverter.convertToTypeWithCheck(args[0], runtime.getIO(), + MethodIndex.getIndex("to_io"), "to_io"); + + if (!tmp.isNil()) { + try { + RubyIO ios = (RubyIO) tmp; + + if (ios.openFile == this.openFile) { + return this; + } + + OpenFile originalFile = ios.getOpenFileChecked(); + OpenFile selfFile = getOpenFileChecked(); + + long pos = 0; + if (originalFile.isReadable()) { + pos = originalFile.getMainStream().fgetpos(); + } + + if (originalFile.getPipeStream() != null) { + originalFile.getPipeStream().fflush(); + } else if (originalFile.isWritable()) { + originalFile.getMainStream().fflush(); + } + + if (selfFile.isWritable()) { + selfFile.getWriteStream().fflush(); + } + + selfFile.setMode(originalFile.getMode()); + selfFile.setProcess(originalFile.getProcess()); + selfFile.setLineNumber(originalFile.getLineNumber()); + selfFile.setPath(originalFile.getPath()); + selfFile.setFinalizer(originalFile.getFinalizer()); + + ChannelDescriptor selfDescriptor = selfFile.getMainStream().getDescriptor(); + ChannelDescriptor originalDescriptor = originalFile.getMainStream().getDescriptor(); + + // confirm we're not reopening self's channel + if (selfDescriptor.getChannel() != originalDescriptor.getChannel()) { + // check if we're a stdio IO, and ensure we're not badly mutilated + if (selfDescriptor.getFileno() >=0 && selfDescriptor.getFileno() <= 2) { + selfFile.getMainStream().clearerr(); + + // dup2 new fd into self to preserve fileno and references to it + originalDescriptor.dup2Into(selfDescriptor); + + // re-register, since fileno points at something new now + registerDescriptor(selfDescriptor); + } else { + Stream pipeFile = selfFile.getPipeStream(); + int mode = selfFile.getMode(); + selfFile.getMainStream().fclose(); + selfFile.setPipeStream(null); + + // TODO: turn off readable? am I reading this right? + // This only seems to be used while duping below, since modes gets + // reset to actual modes afterward + //fptr->mode &= (m & FMODE_READABLE) ? ~FMODE_READABLE : ~FMODE_WRITABLE; + + if (pipeFile != null) { + selfFile.setMainStream(ChannelStream.fdopen(runtime, originalDescriptor, new ModeFlags())); + selfFile.setPipeStream(pipeFile); + } else { + selfFile.setMainStream( + new ChannelStream( + runtime, + originalDescriptor.dup2(selfDescriptor.getFileno()))); + + // re-register the descriptor + registerDescriptor(selfFile.getMainStream().getDescriptor()); + + // since we're not actually duping the incoming channel into our handler, we need to + // copy the original sync behavior from the other handler + selfFile.getMainStream().setSync(selfFile.getMainStream().isSync()); + } + selfFile.setMode(mode); + } + + // TODO: anything threads attached to original fd are notified of the close... + // see rb_thread_fd_close + + if (originalFile.isReadable() && pos >= 0) { + selfFile.seek(pos, Stream.SEEK_SET); + originalFile.seek(pos, Stream.SEEK_SET); + } + } + + if (selfFile.getPipeStream() != null && selfDescriptor.getFileno() != selfFile.getPipeStream().getDescriptor().getFileno()) { + int fd = selfFile.getPipeStream().getDescriptor().getFileno(); + + if (originalFile.getPipeStream() == null) { + selfFile.getPipeStream().fclose(); + selfFile.setPipeStream(null); + } else if (fd != originalFile.getPipeStream().getDescriptor().getFileno()) { + selfFile.getPipeStream().fclose(); + ChannelDescriptor newFD2 = originalFile.getPipeStream().getDescriptor().dup2(fd); + selfFile.setPipeStream(ChannelStream.fdopen(runtime, newFD2, getIOModes(runtime, "w"))); + + // re-register, since fileno points at something new now + registerDescriptor(newFD2); + } + } + + // TODO: restore binary mode + // if (fptr->mode & FMODE_BINMODE) { + // rb_io_binmode(io); + // } + + // TODO: set our metaclass to target's class (i.e. scary!) + + } catch (IOException ex) { // TODO: better error handling + throw runtime.newIOError("could not reopen: " + ex.getMessage()); + } catch (BadDescriptorException ex) { + throw runtime.newIOError("could not reopen: " + ex.getMessage()); + } catch (PipeException ex) { + throw runtime.newIOError("could not reopen: " + ex.getMessage()); + } + } else { + IRubyObject pathString = args[0].convertToString(); + + // TODO: check safe, taint on incoming string + + if (openFile == null) { + openFile = new OpenFile(); + } + + try { + ModeFlags modes; + if (args.length > 1) { + IRubyObject modeString = args[1].convertToString(); + modes = getIOModes(runtime, modeString.toString()); + + openFile.setMode(modes.getOpenFileFlags()); + } else { + modes = getIOModes(runtime, "r"); + } + + String path = pathString.toString(); + + // Ruby code frequently uses a platform check to choose "NUL:" on windows + // but since that check doesn't work well on JRuby, we help it out + + openFile.setPath(path); + + if (openFile.getMainStream() == null) { + try { + openFile.setMainStream(ChannelStream.fopen(runtime, path, modes)); + } catch (FileExistsException fee) { + throw runtime.newErrnoEEXISTError(path); + } + + registerDescriptor(openFile.getMainStream().getDescriptor()); + if (openFile.getPipeStream() != null) { + openFile.getPipeStream().fclose(); + unregisterDescriptor(openFile.getPipeStream().getDescriptor().getFileno()); + openFile.setPipeStream(null); + } + return this; + } else { + // TODO: This is an freopen in MRI, this is close, but not quite the same + openFile.getMainStream().freopen(path, getIOModes(runtime, openFile.getModeAsString(runtime))); + + // re-register + registerDescriptor(openFile.getMainStream().getDescriptor()); + + if (openFile.getPipeStream() != null) { + // TODO: pipe handler to be reopened with path and "w" mode + } + } + } catch (PipeException pe) { + throw runtime.newErrnoEPIPEError(); + } catch (IOException ex) { + throw runtime.newIOErrorFromException(ex); + } catch (BadDescriptorException ex) { + throw runtime.newErrnoEBADFError(); + } catch (InvalidValueException e) { + throw runtime.newErrnoEINVALError(); + } + } + + // A potentially previously close IO is being 'reopened'. + return this; + } + + public static ModeFlags getIOModes(Ruby runtime, String modesString) throws InvalidValueException { + return new ModeFlags(getIOModesIntFromString(runtime, modesString)); + } + + public static int getIOModesIntFromString(Ruby runtime, String modesString) { + int modes = 0; + int length = modesString.length(); + + if (length == 0) { + throw runtime.newArgumentError("illegal access mode"); + } + + switch (modesString.charAt(0)) { + case 'r' : + modes |= ModeFlags.RDONLY; + break; + case 'a' : + modes |= ModeFlags.APPEND | ModeFlags.WRONLY | ModeFlags.CREAT; + break; + case 'w' : + modes |= ModeFlags.WRONLY | ModeFlags.TRUNC | ModeFlags.CREAT; + break; + default : + throw runtime.newArgumentError("illegal access mode " + modes); + } + + for (int n = 1; n < length; n++) { + switch (modesString.charAt(n)) { + case 'b': + modes |= ModeFlags.BINARY; + break; + case '+': + modes = (modes & ~ModeFlags.ACCMODE) | ModeFlags.RDWR; + break; + default: + throw runtime.newArgumentError("illegal access mode " + modes); + } + } + + return modes; + } + + private static ByteList getSeparatorFromArgs(Ruby runtime, IRubyObject[] args, int idx) { + IRubyObject sepVal; + + if (args.length > idx) { + sepVal = args[idx]; + } else { + sepVal = runtime.getRecordSeparatorVar().get(); + } + + ByteList separator = sepVal.isNil() ? null : sepVal.convertToString().getByteList(); + + if (separator != null && separator.realSize == 0) { + separator = Stream.PARAGRAPH_DELIMETER; + } + + return separator; + } + + private ByteList getSeparatorForGets(Ruby runtime, IRubyObject[] args) { + return getSeparatorFromArgs(runtime, args, 0); + } + + public IRubyObject getline(Ruby runtime, ByteList separator) { + try { + OpenFile myOpenFile = getOpenFileChecked(); + + myOpenFile.checkReadable(runtime); + myOpenFile.setReadBuffered(); + + boolean isParagraph = separator == Stream.PARAGRAPH_DELIMETER; + separator = (separator == Stream.PARAGRAPH_DELIMETER) ? + Stream.PARAGRAPH_SEPARATOR : separator; + + if (isParagraph) { + swallow('\n'); + } + + if (separator == null) { + IRubyObject str = readAll(null); + if (((RubyString)str).getByteList().length() == 0) { + return runtime.getNil(); + } + incrementLineno(runtime, myOpenFile); + return str; + } else if (separator.length() == 1) { + return getlineFast(runtime, separator.get(0)); + } else { + Stream readStream = myOpenFile.getMainStream(); + int c = -1; + int n = -1; + int newline = separator.get(separator.length() - 1) & 0xFF; + + ByteList buf = new ByteList(0); + boolean update = false; + + while (true) { + do { + readCheck(readStream); + readStream.clearerr(); + + try { + n = readStream.getline(buf, (byte) newline); + c = buf.length() > 0 ? buf.get(buf.length() - 1) & 0xff : -1; + } catch (EOFException e) { + n = -1; + } + + if (n == -1) { + if (!readStream.isBlocking() && (readStream instanceof ChannelStream)) { + if(!(waitReadable(((ChannelStream)readStream).getDescriptor()))) { + throw runtime.newIOError("bad file descriptor: " + openFile.getPath()); + } + + continue; + } else { + break; + } + } + + update = true; + } while (c != newline); // loop until we see the nth separator char + + // if we hit EOF, we're done + if (n == -1) { + break; + } + + // if we've found the last char of the separator, + // and we've found at least as many characters as separator length, + // and the last n characters of our buffer match the separator, we're done + if (c == newline && buf.length() >= separator.length() && + 0 == ByteList.memcmp(buf.unsafeBytes(), buf.begin + buf.realSize - separator.length(), separator.unsafeBytes(), separator.begin, separator.realSize)) { + break; + } + } + + if (isParagraph) { + if (c != -1) { + swallow('\n'); + } + } + + if (!update) { + return runtime.getNil(); + } else { + incrementLineno(runtime, myOpenFile); + RubyString str = RubyString.newString(runtime, buf); + str.setTaint(true); + + return str; + } + } + } catch (PipeException ex) { + throw runtime.newErrnoEPIPEError(); + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } catch (EOFException e) { + return runtime.getNil(); + } catch (BadDescriptorException e) { + throw runtime.newErrnoEBADFError(); + } catch (IOException e) { + throw runtime.newIOError(e.getMessage()); + } + } + + private void incrementLineno(Ruby runtime, OpenFile myOpenFile) { + int lineno = myOpenFile.getLineNumber() + 1; + myOpenFile.setLineNumber(lineno); + runtime.getGlobalVariables().set("$.", runtime.newFixnum(lineno)); + // this is for a range check, near as I can tell + RubyNumeric.int2fix(runtime, myOpenFile.getLineNumber()); + } + + protected boolean swallow(int term) throws IOException, BadDescriptorException { + Stream readStream = openFile.getMainStream(); + int c; + + do { + readCheck(readStream); + + try { + c = readStream.fgetc(); + } catch (EOFException e) { + c = -1; + } + + if (c != term) { + readStream.ungetc(c); + return true; + } + } while (c != -1); + + return false; + } + + public IRubyObject getlineFast(Ruby runtime, int delim) throws IOException, BadDescriptorException { + Stream readStream = openFile.getMainStream(); + int c = -1; + + ByteList buf = new ByteList(0); + boolean update = false; + do { + readCheck(readStream); + readStream.clearerr(); + int n; + try { + n = readStream.getline(buf, (byte) delim); + c = buf.length() > 0 ? buf.get(buf.length() - 1) & 0xff : -1; + } catch (EOFException e) { + n = -1; + } + + if (n == -1) { + if (!readStream.isBlocking() && (readStream instanceof ChannelStream)) { + if(!(waitReadable(((ChannelStream)readStream).getDescriptor()))) { + throw runtime.newIOError("bad file descriptor: " + openFile.getPath()); + } + continue; + } else { + break; + } + } + + update = true; + } while (c != delim); + + if (!update) { + return runtime.getNil(); + } else { + incrementLineno(runtime, openFile); + RubyString str = RubyString.newString(runtime, buf); + str.setTaint(true); + return str; + } + } + // IO class methods. + + @JRubyMethod(name = {"new", "for_fd"}, rest = true, frame = true, meta = true) + public static IRubyObject newInstance(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + RubyClass klass = (RubyClass)recv; + + if (block.isGiven()) { + String className = klass.getName(); + context.getRuntime().getWarnings().warn( + ID.BLOCK_NOT_ACCEPTED, + className + "::new() does not take block; use " + className + "::open() instead", + className + "::open()"); + } + + return klass.newInstance(context, args, block); + } + + @JRubyMethod(name = "initialize", required = 1, optional = 1, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, Block unusedBlock) { + int argCount = args.length; + ModeFlags modes; + + int fileno = RubyNumeric.fix2int(args[0]); + + try { + ChannelDescriptor descriptor = getDescriptorByFileno(fileno); + + if (descriptor == null) { + throw getRuntime().newErrnoEBADFError(); + } + + descriptor.checkOpen(); + + if (argCount == 2) { + if (args[1] instanceof RubyFixnum) { + modes = new ModeFlags(RubyFixnum.fix2long(args[1])); + } else { + modes = getIOModes(getRuntime(), args[1].convertToString().toString()); + } + } else { + // use original modes + modes = descriptor.getOriginalModes(); + } + + openFile.setMode(modes.getOpenFileFlags()); + + openFile.setMainStream(fdopen(descriptor, modes)); + } catch (BadDescriptorException ex) { + throw getRuntime().newErrnoEBADFError(); + } catch (InvalidValueException ive) { + throw getRuntime().newErrnoEINVALError(); + } + + return this; + } + + protected Stream fdopen(ChannelDescriptor existingDescriptor, ModeFlags modes) throws InvalidValueException { + // See if we already have this descriptor open. + // If so then we can mostly share the handler (keep open + // file, but possibly change the mode). + + if (existingDescriptor == null) { + // redundant, done above as well + + // this seems unlikely to happen unless it's a totally bogus fileno + // ...so do we even need to bother trying to create one? + + // IN FACT, we should probably raise an error, yes? + throw getRuntime().newErrnoEBADFError(); + +// if (mode == null) { +// mode = "r"; +// } +// +// try { +// openFile.setMainStream(streamForFileno(getRuntime(), fileno)); +// } catch (BadDescriptorException e) { +// throw getRuntime().newErrnoEBADFError(); +// } catch (IOException e) { +// throw getRuntime().newErrnoEBADFError(); +// } +// //modes = new IOModes(getRuntime(), mode); +// +// registerStream(openFile.getMainStream()); + } else { + // We are creating a new IO object that shares the same + // IOHandler (and fileno). + return ChannelStream.fdopen(getRuntime(), existingDescriptor, modes); + } + } + + @JRubyMethod(name = "open", required = 1, optional = 2, frame = true, meta = true) + public static IRubyObject open(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = context.getRuntime(); + RubyClass klass = (RubyClass)recv; + + RubyIO io = (RubyIO)klass.newInstance(context, args, block); + + if (block.isGiven()) { + try { + return block.yield(context, io); + } finally { + try { + io.getMetaClass().invoke(context, io, "close", IRubyObject.NULL_ARRAY, CallType.FUNCTIONAL, Block.NULL_BLOCK); + } catch (RaiseException re) { + RubyException rubyEx = re.getException(); + if (rubyEx.kind_of_p(context, runtime.getStandardError()).isTrue()) { + // MRI behavior: swallow StandardErorrs + } else { + throw re; + } + } + } + } + + return io; + } + + // This appears to be some windows-only mode. On a java platform this is a no-op + @JRubyMethod(name = "binmode") + public IRubyObject binmode() { + return this; + } + + /** @deprecated will be removed in 1.2 */ + protected void checkInitialized() { + if (openFile == null) { + throw getRuntime().newIOError("uninitialized stream"); + } + } + + /** @deprecated will be removed in 1.2 */ + protected void checkClosed() { + if (openFile.getMainStream() == null && openFile.getPipeStream() == null) { + throw getRuntime().newIOError("closed stream"); + } + } + + @JRubyMethod(name = "syswrite", required = 1) + public IRubyObject syswrite(ThreadContext context, IRubyObject obj) { + Ruby runtime = context.getRuntime(); + + try { + RubyString string = obj.asString(); + OpenFile myOpenFile = getOpenFileChecked(); + + myOpenFile.checkWritable(runtime); + + Stream writeStream = myOpenFile.getWriteStream(); + + if (myOpenFile.isWriteBuffered()) { + runtime.getWarnings().warn(ID.SYSWRITE_BUFFERED_IO, "syswrite for buffered IO"); + } + + if (!writeStream.getDescriptor().isWritable()) { + myOpenFile.checkClosed(runtime); + } + + int read = writeStream.getDescriptor().write(string.getByteList()); + + if (read == -1) { + // TODO? I think this ends up propagating from normal Java exceptions + // sys_fail(openFile.getPath()) + } + + return runtime.newFixnum(read); + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } catch (PipeException ex) { + throw runtime.newErrnoEPIPEError(); + } catch (BadDescriptorException e) { + throw runtime.newErrnoEBADFError(); + } catch (IOException e) { + throw runtime.newSystemCallError(e.getMessage()); + } + } + + @JRubyMethod(name = "write_nonblock", required = 1) + public IRubyObject write_nonblock(ThreadContext context, IRubyObject obj) { + // MRI behavior: always check whether the file is writable + // or not, even if we are to write 0 bytes. + OpenFile myOpenFile = getOpenFileChecked(); + try { + myOpenFile.checkWritable(context.getRuntime()); + } catch (IOException ex) { + throw context.getRuntime().newIOErrorFromException(ex); + } catch (BadDescriptorException ex) { + throw context.getRuntime().newErrnoEBADFError(); + } catch (InvalidValueException ex) { + throw context.getRuntime().newErrnoEINVALError(); + } catch (PipeException ex) { + throw context.getRuntime().newErrnoEPIPEError(); + } + + // TODO: Obviously, we're not doing a non-blocking write here + return write(context, obj); + } + + /** io_write + * + */ + @JRubyMethod(name = "write", required = 1) + public IRubyObject write(ThreadContext context, IRubyObject obj) { + Ruby runtime = context.getRuntime(); + + runtime.secure(4); + + RubyString str = obj.asString(); + + // TODO: Ruby reuses this logic for other "write" behavior by checking if it's an IO and calling write again + + if (str.getByteList().length() == 0) { + return runtime.newFixnum(0); + } + + try { + OpenFile myOpenFile = getOpenFileChecked(); + + myOpenFile.checkWritable(runtime); + + int written = fwrite(str.getByteList()); + + if (written == -1) { + // TODO: sys fail + } + + // if not sync, we switch to write buffered mode + if (!myOpenFile.isSync()) { + myOpenFile.setWriteBuffered(); + } + + return runtime.newFixnum(written); + } catch (IOException ex) { + throw runtime.newIOErrorFromException(ex); + } catch (BadDescriptorException ex) { + throw runtime.newErrnoEBADFError(); + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } catch (PipeException ex) { + throw runtime.newErrnoEPIPEError(); + } + } + + protected boolean waitWritable(ChannelDescriptor descriptor) throws IOException { + Channel channel = descriptor.getChannel(); + if (channel == null || !(channel instanceof SelectableChannel)) { + return false; + } + + Selector selector = Selector.open(); + + ((SelectableChannel) channel).configureBlocking(false); + int real_ops = ((SelectableChannel) channel).validOps() & SelectionKey.OP_WRITE; + SelectionKey key = ((SelectableChannel) channel).keyFor(selector); + + if (key == null) { + ((SelectableChannel) channel).register(selector, real_ops, descriptor); + } else { + key.interestOps(key.interestOps()|real_ops); + } + + while(selector.select() == 0); + + for (Iterator i = selector.selectedKeys().iterator(); i.hasNext(); ) { + SelectionKey skey = (SelectionKey) i.next(); + if ((skey.interestOps() & skey.readyOps() & (SelectionKey.OP_WRITE)) != 0) { + if(skey.attachment() == descriptor) { + return true; + } + } + } + return false; + } + + protected boolean waitReadable(ChannelDescriptor descriptor) throws IOException { + Channel channel = descriptor.getChannel(); + if (channel == null || !(channel instanceof SelectableChannel)) { + return false; + } + + Selector selector = Selector.open(); + + ((SelectableChannel) channel).configureBlocking(false); + int real_ops = ((SelectableChannel) channel).validOps() & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT); + SelectionKey key = ((SelectableChannel) channel).keyFor(selector); + + if (key == null) { + ((SelectableChannel) channel).register(selector, real_ops, descriptor); + } else { + key.interestOps(key.interestOps()|real_ops); + } + + while(selector.select() == 0); + + for (Iterator i = selector.selectedKeys().iterator(); i.hasNext(); ) { + SelectionKey skey = (SelectionKey) i.next(); + if ((skey.interestOps() & skey.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0) { + if(skey.attachment() == descriptor) { + return true; + } + } + } + return false; + } + + protected int fwrite(ByteList buffer) { + int n, r, l, offset = 0; + boolean eagain = false; + Stream writeStream = openFile.getWriteStream(); + + int len = buffer.length(); + + if ((n = len) <= 0) return n; + + try { + if (openFile.isSync()) { + openFile.fflush(writeStream); + + // TODO: why is this guarded? + // if (!rb_thread_fd_writable(fileno(f))) { + // rb_io_check_closed(fptr); + // } + + while(offset<len) { + l = n; + + // TODO: Something about pipe buffer length here + + r = writeStream.getDescriptor().write(buffer,offset,l); + + if(r == len) { + return len; //Everything written + } + + if (0 <= r) { + offset += r; + n -= r; + eagain = true; + } + + if(eagain && waitWritable(writeStream.getDescriptor())) { + openFile.checkClosed(getRuntime()); + if(offset >= buffer.length()) { + return -1; + } + eagain = false; + } else { + return -1; + } + } + + + // TODO: all this stuff...some pipe logic, some async thread stuff + // retry: + // l = n; + // if (PIPE_BUF < l && + // !rb_thread_critical && + // !rb_thread_alone() && + // wsplit_p(fptr)) { + // l = PIPE_BUF; + // } + // TRAP_BEG; + // r = write(fileno(f), RSTRING(str)->ptr+offset, l); + // TRAP_END; + // if (r == n) return len; + // if (0 <= r) { + // offset += r; + // n -= r; + // errno = EAGAIN; + // } + // if (rb_io_wait_writable(fileno(f))) { + // rb_io_check_closed(fptr); + // if (offset < RSTRING(str)->len) + // goto retry; + // } + // return -1L; + } + + // TODO: handle errors in buffered write by retrying until finished or file is closed + return writeStream.fwrite(buffer); + // while (errno = 0, offset += (r = fwrite(RSTRING(str)->ptr+offset, 1, n, f)), (n -= r) > 0) { + // if (ferror(f) + // ) { + // if (rb_io_wait_writable(fileno(f))) { + // rb_io_check_closed(fptr); + // clearerr(f); + // if (offset < RSTRING(str)->len) + // continue; + // } + // return -1L; + // } + // } + +// return len - n; + } catch (IOException ex) { + throw getRuntime().newIOErrorFromException(ex); + } catch (BadDescriptorException ex) { + throw getRuntime().newErrnoEBADFError(); + } + } + + /** rb_io_addstr + * + */ + @JRubyMethod(name = "<<", required = 1) + public IRubyObject op_append(ThreadContext context, IRubyObject anObject) { + // Claims conversion is done via 'to_s' in docs. + callMethod(context, "write", anObject); + + return this; + } + + @JRubyMethod(name = "fileno", alias = "to_i") + public RubyFixnum fileno(ThreadContext context) { + return context.getRuntime().newFixnum(getOpenFileChecked().getMainStream().getDescriptor().getFileno()); + } + + /** Returns the current line number. + * + * @return the current line number. + */ + @JRubyMethod(name = "lineno") + public RubyFixnum lineno(ThreadContext context) { + return context.getRuntime().newFixnum(getOpenFileChecked().getLineNumber()); + } + + /** Sets the current line number. + * + * @param newLineNumber The new line number. + */ + @JRubyMethod(name = "lineno=", required = 1) + public RubyFixnum lineno_set(ThreadContext context, IRubyObject newLineNumber) { + getOpenFileChecked().setLineNumber(RubyNumeric.fix2int(newLineNumber)); + + return context.getRuntime().newFixnum(getOpenFileChecked().getLineNumber()); + } + + /** Returns the current sync mode. + * + * @return the current sync mode. + */ + @JRubyMethod(name = "sync") + public RubyBoolean sync(ThreadContext context) { + return context.getRuntime().newBoolean(getOpenFileChecked().getMainStream().isSync()); + } + + /** + * <p>Return the process id (pid) of the process this IO object + * spawned. If no process exists (popen was not called), then + * nil is returned. This is not how it appears to be defined + * but ruby 1.8 works this way.</p> + * + * @return the pid or nil + */ + @JRubyMethod(name = "pid") + public IRubyObject pid(ThreadContext context) { + OpenFile myOpenFile = getOpenFileChecked(); + + if (myOpenFile.getProcess() == null) { + return context.getRuntime().getNil(); + } + + // Of course this isn't particularly useful. + int pid = myOpenFile.getProcess().hashCode(); + + return context.getRuntime().newFixnum(pid); + } + + /** + * @deprecated + * @return + */ + public boolean writeDataBuffered() { + return openFile.getMainStream().writeDataBuffered(); + } + + @JRubyMethod(name = {"pos", "tell"}) + public RubyFixnum pos(ThreadContext context) { + try { + return context.getRuntime().newFixnum(getOpenFileChecked().getMainStream().fgetpos()); + } catch (InvalidValueException ex) { + throw context.getRuntime().newErrnoEINVALError(); + } catch (BadDescriptorException bde) { + throw context.getRuntime().newErrnoEBADFError(); + } catch (PipeException e) { + throw context.getRuntime().newErrnoESPIPEError(); + } catch (IOException e) { + throw context.getRuntime().newIOError(e.getMessage()); + } + } + + @JRubyMethod(name = "pos=", required = 1) + public RubyFixnum pos_set(ThreadContext context, IRubyObject newPosition) { + long offset = RubyNumeric.num2long(newPosition); + + if (offset < 0) { + throw context.getRuntime().newSystemCallError("Negative seek offset"); + } + + OpenFile myOpenFile = getOpenFileChecked(); + + try { + myOpenFile.getMainStream().lseek(offset, Stream.SEEK_SET); + } catch (BadDescriptorException e) { + throw context.getRuntime().newErrnoEBADFError(); + } catch (InvalidValueException e) { + throw context.getRuntime().newErrnoEINVALError(); + } catch (PipeException e) { + throw context.getRuntime().newErrnoESPIPEError(); + } catch (IOException e) { + throw context.getRuntime().newIOError(e.getMessage()); + } + + myOpenFile.getMainStream().clearerr(); + + return context.getRuntime().newFixnum(offset); + } + + /** Print some objects to the stream. + * + */ + @JRubyMethod(name = "print", rest = true, reads = FrameField.LASTLINE) + public IRubyObject print(ThreadContext context, IRubyObject[] args) { + if (args.length == 0) { + args = new IRubyObject[] { context.getCurrentFrame().getLastLine() }; + } + + Ruby runtime = context.getRuntime(); + IRubyObject fs = runtime.getGlobalVariables().get("$,"); + IRubyObject rs = runtime.getGlobalVariables().get("$\\"); + + for (int i = 0; i < args.length; i++) { + if (i > 0 && !fs.isNil()) { + callMethod(context, "write", fs); + } + if (args[i].isNil()) { + callMethod(context, "write", runtime.newString("nil")); + } else { + callMethod(context, "write", args[i]); + } + } + if (!rs.isNil()) { + callMethod(context, "write", rs); + } + + return runtime.getNil(); + } + + @JRubyMethod(name = "printf", required = 1, rest = true) + public IRubyObject printf(ThreadContext context, IRubyObject[] args) { + callMethod(context, "write", RubyKernel.sprintf(context, this, args)); + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "putc", required = 1, backtrace = true) + public IRubyObject putc(ThreadContext context, IRubyObject object) { + int c = RubyNumeric.num2chr(object); + + try { + getOpenFileChecked().getMainStream().fputc(c); + } catch (BadDescriptorException e) { + return RubyFixnum.zero(context.getRuntime()); + } catch (IOException e) { + return RubyFixnum.zero(context.getRuntime()); + } + + return object; + } + + public RubyFixnum seek(ThreadContext context, IRubyObject[] args) { + long offset = RubyNumeric.num2long(args[0]); + int whence = Stream.SEEK_SET; + + if (args.length > 1) { + whence = RubyNumeric.fix2int(args[1].convertToInteger()); + } + + return doSeek(context, offset, whence); + } + + @JRubyMethod(name = "seek") + public RubyFixnum seek(ThreadContext context, IRubyObject arg0) { + long offset = RubyNumeric.num2long(arg0); + int whence = Stream.SEEK_SET; + + return doSeek(context, offset, whence); + } + + @JRubyMethod(name = "seek") + public RubyFixnum seek(ThreadContext context, IRubyObject arg0, IRubyObject arg1) { + long offset = RubyNumeric.num2long(arg0); + int whence = RubyNumeric.fix2int(arg1.convertToInteger()); + + return doSeek(context, offset, whence); + } + + private RubyFixnum doSeek(ThreadContext context, long offset, int whence) { + OpenFile myOpenFile = getOpenFileChecked(); + + try { + myOpenFile.seek(offset, whence); + } catch (BadDescriptorException ex) { + throw context.getRuntime().newErrnoEBADFError(); + } catch (InvalidValueException e) { + throw context.getRuntime().newErrnoEINVALError(); + } catch (PipeException e) { + throw context.getRuntime().newErrnoESPIPEError(); + } catch (IOException e) { + throw context.getRuntime().newIOError(e.getMessage()); + } + + myOpenFile.getMainStream().clearerr(); + + return RubyFixnum.zero(context.getRuntime()); + } + + // This was a getOpt with one mandatory arg, but it did not work + // so I am parsing it for now. + @JRubyMethod(name = "sysseek", required = 1, optional = 1) + public RubyFixnum sysseek(ThreadContext context, IRubyObject[] args) { + long offset = RubyNumeric.num2long(args[0]); + long pos; + int whence = Stream.SEEK_SET; + + if (args.length > 1) { + whence = RubyNumeric.fix2int(args[1].convertToInteger()); + } + + OpenFile myOpenFile = getOpenFileChecked(); + + try { + + if (myOpenFile.isReadable() && myOpenFile.isReadBuffered()) { + throw context.getRuntime().newIOError("sysseek for buffered IO"); + } + if (myOpenFile.isWritable() && myOpenFile.isWriteBuffered()) { + context.getRuntime().getWarnings().warn(ID.SYSSEEK_BUFFERED_IO, "sysseek for buffered IO"); + } + + pos = myOpenFile.getMainStream().getDescriptor().lseek(offset, whence); + } catch (BadDescriptorException ex) { + throw context.getRuntime().newErrnoEBADFError(); + } catch (InvalidValueException e) { + throw context.getRuntime().newErrnoEINVALError(); + } catch (PipeException e) { + throw context.getRuntime().newErrnoESPIPEError(); + } catch (IOException e) { + throw context.getRuntime().newIOError(e.getMessage()); + } + + myOpenFile.getMainStream().clearerr(); + + return context.getRuntime().newFixnum(pos); + } + + @JRubyMethod(name = "rewind") + public RubyFixnum rewind(ThreadContext context) { + OpenFile myOpenfile = getOpenFileChecked(); + + try { + myOpenfile.getMainStream().lseek(0L, Stream.SEEK_SET); + myOpenfile.getMainStream().clearerr(); + + // TODO: This is some goofy global file value from MRI..what to do? +// if (io == current_file) { +// gets_lineno -= fptr->lineno; +// } + } catch (BadDescriptorException e) { + throw context.getRuntime().newErrnoEBADFError(); + } catch (InvalidValueException e) { + throw context.getRuntime().newErrnoEINVALError(); + } catch (PipeException e) { + throw context.getRuntime().newErrnoESPIPEError(); + } catch (IOException e) { + throw context.getRuntime().newIOError(e.getMessage()); + } + + // Must be back on first line on rewind. + myOpenfile.setLineNumber(0); + + return RubyFixnum.zero(context.getRuntime()); + } + + @JRubyMethod(name = "fsync") + public RubyFixnum fsync(ThreadContext context) { + Ruby runtime = context.getRuntime(); + + try { + OpenFile myOpenFile = getOpenFileChecked(); + + myOpenFile.checkWritable(runtime); + + myOpenFile.getWriteStream().sync(); + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } catch (PipeException ex) { + throw runtime.newErrnoEPIPEError(); + } catch (IOException e) { + throw runtime.newIOError(e.getMessage()); + } catch (BadDescriptorException e) { + throw runtime.newErrnoEBADFError(); + } + + return RubyFixnum.zero(runtime); + } + + /** Sets the current sync mode. + * + * @param newSync The new sync mode. + */ + @JRubyMethod(name = "sync=", required = 1) + public IRubyObject sync_set(IRubyObject newSync) { + getOpenFileChecked().setSync(newSync.isTrue()); + getOpenFileChecked().getMainStream().setSync(newSync.isTrue()); + + return this; + } + + @JRubyMethod(name = {"eof?", "eof"}) + public RubyBoolean eof_p(ThreadContext context) { + Ruby runtime = context.getRuntime(); + + try { + OpenFile myOpenFile = getOpenFileChecked(); + + myOpenFile.checkReadable(runtime); + myOpenFile.setReadBuffered(); + + if (myOpenFile.getMainStream().feof()) { + return runtime.getTrue(); + } + + if (myOpenFile.getMainStream().readDataBuffered()) { + return runtime.getFalse(); + } + + readCheck(myOpenFile.getMainStream()); + + myOpenFile.getMainStream().clearerr(); + + int c = myOpenFile.getMainStream().fgetc(); + + if (c != -1) { + myOpenFile.getMainStream().ungetc(c); + return runtime.getFalse(); + } + + myOpenFile.checkClosed(runtime); + + myOpenFile.getMainStream().clearerr(); + + return runtime.getTrue(); + } catch (PipeException ex) { + throw runtime.newErrnoEPIPEError(); + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } catch (BadDescriptorException e) { + throw runtime.newErrnoEBADFError(); + } catch (IOException e) { + throw runtime.newIOError(e.getMessage()); + } + } + + @JRubyMethod(name = {"tty?", "isatty"}) + public RubyBoolean tty_p(ThreadContext context) { + return context.getRuntime().newBoolean(context.getRuntime().getPosix().isatty(getOpenFileChecked().getMainStream().getDescriptor().getFileDescriptor())); + } + + @JRubyMethod(name = "initialize_copy", required = 1) + @Override + public IRubyObject initialize_copy(IRubyObject original){ + Ruby runtime = getRuntime(); + + if (this == original) return this; + + RubyIO originalIO = (RubyIO) TypeConverter.convertToTypeWithCheck(original, runtime.getIO(), MethodIndex.TO_IO, "to_io"); + + OpenFile originalFile = originalIO.getOpenFileChecked(); + OpenFile newFile = openFile; + + try { + // TODO: I didn't see where MRI has this check, but it seems to be the right place + originalFile.checkClosed(runtime); + + if (originalFile.getPipeStream() != null) { + originalFile.getPipeStream().fflush(); + originalFile.getMainStream().lseek(0, Stream.SEEK_CUR); + } else if (originalFile.isWritable()) { + originalFile.getMainStream().fflush(); + } else { + originalFile.getMainStream().lseek(0, Stream.SEEK_CUR); + } + + newFile.setMode(originalFile.getMode()); + newFile.setProcess(originalFile.getProcess()); + newFile.setLineNumber(originalFile.getLineNumber()); + newFile.setPath(originalFile.getPath()); + newFile.setFinalizer(originalFile.getFinalizer()); + + ModeFlags modes; + if (newFile.isReadable()) { + if (newFile.isWritable()) { + if (newFile.getPipeStream() != null) { + modes = new ModeFlags(ModeFlags.RDONLY); + } else { + modes = new ModeFlags(ModeFlags.RDWR); + } + } else { + modes = new ModeFlags(ModeFlags.RDONLY); + } + } else { + if (newFile.isWritable()) { + modes = new ModeFlags(ModeFlags.WRONLY); + } else { + modes = originalFile.getMainStream().getModes(); + } + } + + ChannelDescriptor descriptor = originalFile.getMainStream().getDescriptor().dup(); + + newFile.setMainStream(ChannelStream.fdopen(runtime, descriptor, modes)); + + // TODO: the rest of this...seeking to same position is unnecessary since we share a channel + // but some of this may be needed? + +// fseeko(fptr->f, ftello(orig->f), SEEK_SET); +// if (orig->f2) { +// if (fileno(orig->f) != fileno(orig->f2)) { +// fd = ruby_dup(fileno(orig->f2)); +// } +// fptr->f2 = rb_fdopen(fd, "w"); +// fseeko(fptr->f2, ftello(orig->f2), SEEK_SET); +// } +// if (fptr->mode & FMODE_BINMODE) { +// rb_io_binmode(dest); +// } + + // Register the new descriptor + registerDescriptor(newFile.getMainStream().getDescriptor()); + } catch (IOException ex) { + throw runtime.newIOError("could not init copy: " + ex); + } catch (BadDescriptorException ex) { + throw runtime.newIOError("could not init copy: " + ex); + } catch (PipeException ex) { + throw runtime.newIOError("could not init copy: " + ex); + } catch (InvalidValueException ex) { + throw runtime.newIOError("could not init copy: " + ex); + } + + return this; + } + + /** Closes the IO. + * + * @return The IO. + */ + @JRubyMethod(name = "closed?") + public RubyBoolean closed_p(ThreadContext context) { + return context.getRuntime().newBoolean(openFile.getMainStream() == null && openFile.getPipeStream() == null); + } + + /** + * <p>Closes all open resources for the IO. It also removes + * it from our magical all open file descriptor pool.</p> + * + * @return The IO. + */ + @JRubyMethod(name = "close") + public IRubyObject close() { + Ruby runtime = getRuntime(); + + if (runtime.getSafeLevel() >= 4 && isTaint()) { + throw runtime.newSecurityError("Insecure: can't close"); + } + + openFile.checkClosed(runtime); + return close2(runtime); + } + + protected IRubyObject close2(Ruby runtime) { + if (openFile == null) return runtime.getNil(); + + // These would be used when we notify threads...if we notify threads + interruptBlockingThreads(); + + ChannelDescriptor main, pipe; + if (openFile.getPipeStream() != null) { + pipe = openFile.getPipeStream().getDescriptor(); + } else { + if (openFile.getMainStream() == null) { + return runtime.getNil(); + } + pipe = null; + } + + main = openFile.getMainStream().getDescriptor(); + + // cleanup, raising errors if any + openFile.cleanup(runtime, true); + + // TODO: notify threads waiting on descriptors/IO? probably not... + + if (openFile.getProcess() != null) { + try { + IRubyObject processResult = RubyProcess.RubyStatus.newProcessStatus(runtime, openFile.getProcess().waitFor()); + runtime.getGlobalVariables().set("$?", processResult); + } catch (InterruptedException ie) { + // TODO: do something here? + } + } + + return runtime.getNil(); + } + + @JRubyMethod(name = "close_write") + public IRubyObject close_write(ThreadContext context) throws BadDescriptorException { + try { + if (context.getRuntime().getSafeLevel() >= 4 && isTaint()) { + throw context.getRuntime().newSecurityError("Insecure: can't close"); + } + + OpenFile myOpenFile = getOpenFileChecked(); + + if (myOpenFile.getPipeStream() == null && myOpenFile.isReadable()) { + throw context.getRuntime().newIOError("closing non-duplex IO for writing"); + } + + if (myOpenFile.getPipeStream() == null) { + close(); + } else{ + myOpenFile.getPipeStream().fclose(); + myOpenFile.setPipeStream(null); + myOpenFile.setMode(myOpenFile.getMode() & ~OpenFile.WRITABLE); + // TODO + // n is result of fclose; but perhaps having a SysError below is enough? + // if (n != 0) rb_sys_fail(fptr->path); + } + } catch (IOException ioe) { + // hmmmm + } + return this; + } + + @JRubyMethod(name = "close_read") + public IRubyObject close_read(ThreadContext context) throws BadDescriptorException { + Ruby runtime = context.getRuntime(); + + try { + if (runtime.getSafeLevel() >= 4 && isTaint()) { + throw runtime.newSecurityError("Insecure: can't close"); + } + + OpenFile myOpenFile = getOpenFileChecked(); + + if (myOpenFile.getPipeStream() == null && myOpenFile.isWritable()) { + throw runtime.newIOError("closing non-duplex IO for reading"); + } + + if (myOpenFile.getPipeStream() == null) { + close(); + } else{ + myOpenFile.getMainStream().fclose(); + myOpenFile.setMode(myOpenFile.getMode() & ~OpenFile.READABLE); + myOpenFile.setMainStream(myOpenFile.getPipeStream()); + myOpenFile.setPipeStream(null); + // TODO + // n is result of fclose; but perhaps having a SysError below is enough? + // if (n != 0) rb_sys_fail(fptr->path); + } + } catch (IOException ioe) { + // I believe Ruby bails out with a "bug" if closing fails + throw runtime.newIOErrorFromException(ioe); + } + return this; + } + + /** Flushes the IO output stream. + * + * @return The IO. + */ + @JRubyMethod(name = "flush") + public RubyIO flush() { + try { + getOpenFileChecked().getWriteStream().fflush(); + } catch (BadDescriptorException e) { + throw getRuntime().newErrnoEBADFError(); + } catch (IOException e) { + throw getRuntime().newIOError(e.getMessage()); + } + + return this; + } + + /** Read a line. + * + */ + @JRubyMethod(name = "gets", optional = 1, writes = FrameField.LASTLINE) + public IRubyObject gets(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + ByteList separator = getSeparatorForGets(runtime, args); + + IRubyObject result = getline(runtime, separator); + + if (!result.isNil()) context.getCurrentFrame().setLastLine(result); + + return result; + } + + public boolean getBlocking() { + return ((ChannelStream) openFile.getMainStream()).isBlocking(); + } + + @JRubyMethod(name = "fcntl", required = 2) + public IRubyObject fcntl(ThreadContext context, IRubyObject cmd, IRubyObject arg) { + // TODO: This version differs from ioctl by checking whether fcntl exists + // and raising notimplemented if it doesn't; perhaps no difference for us? + return ctl(context.getRuntime(), cmd, arg); + } + + @JRubyMethod(name = "ioctl", required = 1, optional = 1) + public IRubyObject ioctl(ThreadContext context, IRubyObject[] args) { + IRubyObject cmd = args[0]; + IRubyObject arg; + + if (args.length == 2) { + arg = args[1]; + } else { + arg = context.getRuntime().getNil(); + } + + return ctl(context.getRuntime(), cmd, arg); + } + + public IRubyObject ctl(Ruby runtime, IRubyObject cmd, IRubyObject arg) { + long realCmd = cmd.convertToInteger().getLongValue(); + long nArg = 0; + + // FIXME: Arg may also be true, false, and nil and still be valid. Strangely enough, + // protocol conversion is not happening in Ruby on this arg? + if (arg.isNil() || arg == runtime.getFalse()) { + nArg = 0; + } else if (arg instanceof RubyFixnum) { + nArg = RubyFixnum.fix2long(arg); + } else if (arg == runtime.getTrue()) { + nArg = 1; + } else { + throw runtime.newNotImplementedError("JRuby does not support string for second fcntl/ioctl argument yet"); + } + + OpenFile myOpenFile = getOpenFileChecked(); + + // Fixme: Only F_SETFL is current supported + if (realCmd == 1L) { // cmd is F_SETFL + boolean block = true; + + if ((nArg & ModeFlags.NONBLOCK) == ModeFlags.NONBLOCK) { + block = false; + } + + try { + myOpenFile.getMainStream().setBlocking(block); + } catch (IOException e) { + throw runtime.newIOError(e.getMessage()); + } + } else { + throw runtime.newNotImplementedError("JRuby only supports F_SETFL for fcntl/ioctl currently"); + } + + return runtime.newFixnum(0); + } + + private static final ByteList NIL_BYTELIST = ByteList.create("nil"); + private static final ByteList RECURSIVE_BYTELIST = ByteList.create("[...]"); + + @JRubyMethod(name = "puts", rest = true) + public IRubyObject puts(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + assert runtime.getGlobalVariables().getDefaultSeparator() instanceof RubyString; + RubyString separator = (RubyString) runtime.getGlobalVariables().getDefaultSeparator(); + + if (args.length == 0) { + write(context, separator.getByteList()); + return runtime.getNil(); + } + + for (int i = 0; i < args.length; i++) { + ByteList line; + + if (args[i].isNil()) { + line = NIL_BYTELIST; + } else if (runtime.isInspecting(args[i])) { + line = RECURSIVE_BYTELIST; + } else if (args[i] instanceof RubyArray) { + inspectPuts(context, (RubyArray) args[i]); + continue; + } else { + line = args[i].asString().getByteList(); + } + + write(context, line); + + if (line.length() == 0 || !line.endsWith(separator.getByteList())) { + write(context, separator.getByteList()); + } + } + return runtime.getNil(); + } + + protected void write(ThreadContext context, ByteList byteList) { + callMethod(context, "write", RubyString.newStringShared(context.getRuntime(), byteList)); + } + + private IRubyObject inspectPuts(ThreadContext context, RubyArray array) { + try { + context.getRuntime().registerInspecting(array); + return puts(context, array.toJavaArray()); + } finally { + context.getRuntime().unregisterInspecting(array); + } + } + + /** Read a line. + * + */ + @JRubyMethod(name = "readline", optional = 1, writes = FrameField.LASTLINE) + public IRubyObject readline(ThreadContext context, IRubyObject[] args) { + IRubyObject line = gets(context, args); + + if (line.isNil()) throw context.getRuntime().newEOFError(); + + return line; + } + + /** Read a byte. On EOF returns nil. + * + */ + @JRubyMethod(name = "getc") + public IRubyObject getc() { + try { + OpenFile myOpenFile = getOpenFileChecked(); + + myOpenFile.checkReadable(getRuntime()); + myOpenFile.setReadBuffered(); + + Stream stream = myOpenFile.getMainStream(); + + readCheck(stream); + stream.clearerr(); + + int c = myOpenFile.getMainStream().fgetc(); + + if (c == -1) { + // TODO: check for ferror, clear it, and try once more up above readCheck +// if (ferror(f)) { +// clearerr(f); +// if (!rb_io_wait_readable(fileno(f))) +// rb_sys_fail(fptr->path); +// goto retry; +// } + return getRuntime().getNil(); + } + + return getRuntime().newFixnum(c); + } catch (PipeException ex) { + throw getRuntime().newErrnoEPIPEError(); + } catch (InvalidValueException ex) { + throw getRuntime().newErrnoEINVALError(); + } catch (BadDescriptorException e) { + throw getRuntime().newErrnoEBADFError(); + } catch (EOFException e) { + throw getRuntime().newEOFError(); + } catch (IOException e) { + throw getRuntime().newIOError(e.getMessage()); + } + } + + private void readCheck(Stream stream) { + if (!stream.readDataBuffered()) { + openFile.checkClosed(getRuntime()); + } + } + + /** + * <p>Pushes char represented by int back onto IOS.</p> + * + * @param number to push back + */ + @JRubyMethod(name = "ungetc", required = 1) + public IRubyObject ungetc(IRubyObject number) { + int ch = RubyNumeric.fix2int(number); + + OpenFile myOpenFile = getOpenFileChecked(); + + if (!myOpenFile.isReadBuffered()) { + throw getRuntime().newIOError("unread stream"); + } + + try { + myOpenFile.checkReadable(getRuntime()); + myOpenFile.setReadBuffered(); + + if (myOpenFile.getMainStream().ungetc(ch) == -1 && ch != -1) { + throw getRuntime().newIOError("ungetc failed"); + } + } catch (PipeException ex) { + throw getRuntime().newErrnoEPIPEError(); + } catch (InvalidValueException ex) { + throw getRuntime().newErrnoEINVALError(); + } catch (BadDescriptorException e) { + throw getRuntime().newErrnoEBADFError(); + } catch (EOFException e) { + throw getRuntime().newEOFError(); + } catch (IOException e) { + throw getRuntime().newIOError(e.getMessage()); + } + + return getRuntime().getNil(); + } + + @JRubyMethod(name = "read_nonblock", required = 1, optional = 1) + public IRubyObject read_nonblock(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + openFile.checkClosed(runtime); + + if(!(openFile.getMainStream() instanceof ChannelStream)) { + // cryptic for the uninitiated... + throw runtime.newNotImplementedError("read_nonblock only works with Nio based handlers"); + } + try { + int maxLength = RubyNumeric.fix2int(args[0]); + if (maxLength < 0) { + throw runtime.newArgumentError("negative length " + maxLength + " given"); + } + ByteList buf = ((ChannelStream)openFile.getMainStream()).readnonblock(RubyNumeric.fix2int(args[0])); + IRubyObject strbuf = RubyString.newString(runtime, buf == null ? new ByteList(ByteList.NULL_ARRAY) : buf); + if(args.length > 1) { + args[1].callMethod(context, MethodIndex.OP_LSHIFT, "<<", strbuf); + return args[1]; + } + + return strbuf; + } catch (BadDescriptorException e) { + throw runtime.newErrnoEBADFError(); + } catch (EOFException e) { + return runtime.getNil(); + } catch (IOException e) { + throw runtime.newIOError(e.getMessage()); + } + } + + @JRubyMethod(name = "readpartial", required = 1, optional = 1) + public IRubyObject readpartial(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + openFile.checkClosed(runtime); + + if(!(openFile.getMainStream() instanceof ChannelStream)) { + // cryptic for the uninitiated... + throw runtime.newNotImplementedError("readpartial only works with Nio based handlers"); + } + try { + int maxLength = RubyNumeric.fix2int(args[0]); + if (maxLength < 0) { + throw runtime.newArgumentError("negative length " + maxLength + " given"); + } + ByteList buf = ((ChannelStream)openFile.getMainStream()).readpartial(RubyNumeric.fix2int(args[0])); + IRubyObject strbuf = RubyString.newString(runtime, buf == null ? new ByteList(ByteList.NULL_ARRAY) : buf); + if(args.length > 1) { + args[1].callMethod(context, MethodIndex.OP_LSHIFT, "<<", strbuf); + return args[1]; + } + + return strbuf; + } catch (BadDescriptorException e) { + throw runtime.newErrnoEBADFError(); + } catch (EOFException e) { + return runtime.getNil(); + } catch (IOException e) { + throw runtime.newIOError(e.getMessage()); + } + } + + @JRubyMethod(name = "sysread", required = 1, optional = 1) + public IRubyObject sysread(ThreadContext context, IRubyObject[] args) { + int len = (int)RubyNumeric.num2long(args[0]); + if (len < 0) throw getRuntime().newArgumentError("Negative size"); + + try { + RubyString str; + ByteList buffer; + if (args.length == 1 || args[1].isNil()) { + if (len == 0) { + return RubyString.newStringShared(getRuntime(), ByteList.EMPTY_BYTELIST); + } + + buffer = new ByteList(len); + str = RubyString.newString(getRuntime(), buffer); + } else { + str = args[1].convertToString(); + str.modify(len); + + if (len == 0) { + return str; + } + + buffer = str.getByteList(); + } + + OpenFile myOpenFile = getOpenFileChecked(); + + myOpenFile.checkReadable(getRuntime()); + + if (myOpenFile.getMainStream().readDataBuffered()) { + throw getRuntime().newIOError("sysread for buffered IO"); + } + + // TODO: Ruby locks the string here + + context.getThread().beforeBlockingCall(); + myOpenFile.checkClosed(getRuntime()); + + // TODO: Ruby re-checks that the buffer string hasn't been modified + + int bytesRead = myOpenFile.getMainStream().getDescriptor().read(len, str.getByteList()); + + // TODO: Ruby unlocks the string here + + // TODO: Ruby truncates string to specific size here, but our bytelist should handle this already? + + if (bytesRead == -1 || (bytesRead == 0 && len > 0)) { + throw getRuntime().newEOFError(); + } + + str.setTaint(true); + + return str; + } catch (BadDescriptorException e) { + throw getRuntime().newErrnoEBADFError(); + } catch (InvalidValueException e) { + throw getRuntime().newErrnoEINVALError(); + } catch (PipeException e) { + throw getRuntime().newErrnoEPIPEError(); + } catch (EOFException e) { + throw getRuntime().newEOFError(); + } catch (IOException e) { + // All errors to sysread should be SystemCallErrors, but on a closed stream + // Ruby returns an IOError. Java throws same exception for all errors so + // we resort to this hack... + if ("File not open".equals(e.getMessage())) { + throw getRuntime().newIOError(e.getMessage()); + } + throw getRuntime().newSystemCallError(e.getMessage()); + } finally { + context.getThread().afterBlockingCall(); + } + } + + public IRubyObject read(IRubyObject[] args) { + ThreadContext context = getRuntime().getCurrentContext(); + + switch (args.length) { + case 0: return read(context); + case 1: return read(context, args[0]); + case 2: return read(context, args[0], args[1]); + default: throw getRuntime().newArgumentError(args.length, 2); + } + } + + @JRubyMethod(name = "read") + public IRubyObject read(ThreadContext context) { + Ruby runtime = context.getRuntime(); + OpenFile myOpenFile = getOpenFileChecked(); + + try { + myOpenFile.checkReadable(runtime); + myOpenFile.setReadBuffered(); + + return readAll(getRuntime().getNil()); + } catch (PipeException ex) { + throw getRuntime().newErrnoEPIPEError(); + } catch (InvalidValueException ex) { + throw getRuntime().newErrnoEINVALError(); + } catch (EOFException ex) { + throw getRuntime().newEOFError(); + } catch (IOException ex) { + throw getRuntime().newIOErrorFromException(ex); + } catch (BadDescriptorException ex) { + throw getRuntime().newErrnoEBADFError(); + } + } + + @JRubyMethod(name = "read") + public IRubyObject read(ThreadContext context, IRubyObject arg0) { + if (arg0.isNil()) { + return read(context); + } + + OpenFile myOpenFile = getOpenFileChecked(); + + int length = RubyNumeric.num2int(arg0); + + if (length < 0) { + throw getRuntime().newArgumentError("negative length " + length + " given"); + } + + RubyString str = null; + + return readNotAll(context, myOpenFile, length, str); + } + + @JRubyMethod(name = "read") + public IRubyObject read(ThreadContext context, IRubyObject arg0, IRubyObject arg1) { + OpenFile myOpenFile = getOpenFileChecked(); + + if (arg0.isNil()) { + try { + myOpenFile.checkReadable(getRuntime()); + myOpenFile.setReadBuffered(); + + return readAll(arg1); + } catch (PipeException ex) { + throw getRuntime().newErrnoEPIPEError(); + } catch (InvalidValueException ex) { + throw getRuntime().newErrnoEINVALError(); + } catch (EOFException ex) { + throw getRuntime().newEOFError(); + } catch (IOException ex) { + throw getRuntime().newIOErrorFromException(ex); + } catch (BadDescriptorException ex) { + throw getRuntime().newErrnoEBADFError(); + } + } + + int length = RubyNumeric.num2int(arg0); + + if (length < 0) { + throw getRuntime().newArgumentError("negative length " + length + " given"); + } + + RubyString str = null; +// ByteList buffer = null; + if (arg1.isNil()) { +// buffer = new ByteList(length); +// str = RubyString.newString(getRuntime(), buffer); + } else { + str = arg1.convertToString(); + str.modify(length); + + if (length == 0) { + return str; + } + +// buffer = str.getByteList(); + } + + return readNotAll(context, myOpenFile, length, str); + } + + private IRubyObject readNotAll(ThreadContext context, OpenFile myOpenFile, int length, RubyString str) { + Ruby runtime = context.getRuntime(); + + try { + myOpenFile.checkReadable(runtime); + myOpenFile.setReadBuffered(); + + if (myOpenFile.getMainStream().feof()) { + return runtime.getNil(); + } + + // TODO: Ruby locks the string here + + // READ_CHECK from MRI io.c + readCheck(myOpenFile.getMainStream()); + + // TODO: check buffer length again? + // if (RSTRING(str)->len != len) { + // rb_raise(rb_eRuntimeError, "buffer string modified"); + // } + + // TODO: read into buffer using all the fread logic + // int read = openFile.getMainStream().fread(buffer); + ByteList newBuffer = myOpenFile.getMainStream().fread(length); + + // TODO: Ruby unlocks the string here + + // TODO: change this to check number read into buffer once that's working + // if (read == 0) { + + if (newBuffer == null || newBuffer.length() == 0) { + if (myOpenFile.getMainStream() == null) { + return runtime.getNil(); + } + + if (myOpenFile.getMainStream().feof()) { + // truncate buffer string to zero, if provided + if (str != null) { + str.setValue(ByteList.EMPTY_BYTELIST.dup()); + } + + return runtime.getNil(); + } + + // Removed while working on JRUBY-2386, since fixes for that + // modified EOF logic such that this check is not really valid. + // We expect that an EOFException will be thrown now in EOF + // cases. +// if (length > 0) { +// // I think this is only partly correct; sys fail based on errno in Ruby +// throw getRuntime().newEOFError(); +// } + } + + + // TODO: Ruby truncates string to specific size here, but our bytelist should handle this already? + + // FIXME: I don't like the null checks here + if (str == null) { + if (newBuffer == null) { + str = RubyString.newEmptyString(runtime); + } else { + str = RubyString.newString(runtime, newBuffer); + } + } else { + if (newBuffer == null) { + str.empty(); + } else { + str.setValue(newBuffer); + } + } + str.setTaint(true); + + return str; + } catch (EOFException ex) { + throw runtime.newEOFError(); + } catch (PipeException ex) { + throw runtime.newErrnoEPIPEError(); + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } catch (IOException ex) { + throw runtime.newIOErrorFromException(ex); + } catch (BadDescriptorException ex) { + throw runtime.newErrnoEBADFError(); + } + } + + protected IRubyObject readAll(IRubyObject buffer) throws BadDescriptorException, EOFException, IOException { + Ruby runtime = getRuntime(); + // TODO: handle writing into original buffer better + + RubyString str = null; + if (buffer instanceof RubyString) { + str = (RubyString)buffer; + } + + // TODO: ruby locks the string here + + // READ_CHECK from MRI io.c + if (openFile.getMainStream().readDataBuffered()) { + openFile.checkClosed(runtime); + } + + ByteList newBuffer = openFile.getMainStream().readall(); + + // TODO same zero-length checks as file above + + if (str == null) { + if (newBuffer == null) { + str = RubyString.newEmptyString(runtime); + } else { + str = RubyString.newString(runtime, newBuffer); + } + } else { + if (newBuffer == null) { + str.empty(); + } else { + str.setValue(newBuffer); + } + } + + str.taint(runtime.getCurrentContext()); + + return str; +// long bytes = 0; +// long n; +// +// if (siz == 0) siz = BUFSIZ; +// if (NIL_P(str)) { +// str = rb_str_new(0, siz); +// } +// else { +// rb_str_resize(str, siz); +// } +// for (;;) { +// rb_str_locktmp(str); +// READ_CHECK(fptr->f); +// n = io_fread(RSTRING(str)->ptr+bytes, siz-bytes, fptr); +// rb_str_unlocktmp(str); +// if (n == 0 && bytes == 0) { +// if (!fptr->f) break; +// if (feof(fptr->f)) break; +// if (!ferror(fptr->f)) break; +// rb_sys_fail(fptr->path); +// } +// bytes += n; +// if (bytes < siz) break; +// siz += BUFSIZ; +// rb_str_resize(str, siz); +// } +// if (bytes != siz) rb_str_resize(str, bytes); +// OBJ_TAINT(str); +// +// return str; + } + + // TODO: There's a lot of complexity here due to error handling and + // nonblocking IO; much of this goes away, but for now I'm just + // having read call ChannelStream.fread directly. +// protected int fread(int len, ByteList buffer) { +// long n = len; +// int c; +// int saved_errno; +// +// while (n > 0) { +// c = read_buffered_data(ptr, n, fptr->f); +// if (c < 0) goto eof; +// if (c > 0) { +// ptr += c; +// if ((n -= c) <= 0) break; +// } +// rb_thread_wait_fd(fileno(fptr->f)); +// rb_io_check_closed(fptr); +// clearerr(fptr->f); +// TRAP_BEG; +// c = getc(fptr->f); +// TRAP_END; +// if (c == EOF) { +// eof: +// if (ferror(fptr->f)) { +// switch (errno) { +// case EINTR: +// #if defined(ERESTART) +// case ERESTART: +// #endif +// clearerr(fptr->f); +// continue; +// case EAGAIN: +// #if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN +// case EWOULDBLOCK: +// #endif +// if (len > n) { +// clearerr(fptr->f); +// } +// saved_errno = errno; +// rb_warning("nonblocking IO#read is obsolete; use IO#readpartial or IO#sysread"); +// errno = saved_errno; +// } +// if (len == n) return 0; +// } +// break; +// } +// *ptr++ = c; +// n--; +// } +// return len - n; +// +// } + + /** Read a byte. On EOF throw EOFError. + * + */ + @JRubyMethod(name = "readchar") + public IRubyObject readchar() { + IRubyObject c = getc(); + + if (c.isNil()) throw getRuntime().newEOFError(); + + return c; + } + + @JRubyMethod + public IRubyObject stat(ThreadContext context) { + openFile.checkClosed(context.getRuntime()); + return context.getRuntime().newFileStat(getOpenFileChecked().getMainStream().getDescriptor().getFileDescriptor()); + } + + /** + * <p>Invoke a block for each byte.</p> + */ + @JRubyMethod(name = "each_byte", frame = true) + public IRubyObject each_byte(ThreadContext context, Block block) { + Ruby runtime = context.getRuntime(); + + try { + OpenFile myOpenFile = getOpenFileChecked(); + + while (true) { + myOpenFile.checkReadable(runtime); + myOpenFile.setReadBuffered(); + + // TODO: READ_CHECK from MRI + + int c = myOpenFile.getMainStream().fgetc(); + + if (c == -1) { + // TODO: check for error, clear it, and wait until readable before trying once more +// if (ferror(f)) { +// clearerr(f); +// if (!rb_io_wait_readable(fileno(f))) +// rb_sys_fail(fptr->path); +// continue; +// } + break; + } + + assert c < 256; + block.yield(context, getRuntime().newFixnum(c)); + } + + // TODO: one more check for error +// if (ferror(f)) rb_sys_fail(fptr->path); + return this; + } catch (PipeException ex) { + throw runtime.newErrnoEPIPEError(); + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } catch (BadDescriptorException e) { + throw runtime.newErrnoEBADFError(); + } catch (EOFException e) { + return runtime.getNil(); + } catch (IOException e) { + throw runtime.newIOError(e.getMessage()); + } + } + + /** + * <p>Invoke a block for each line.</p> + */ + @JRubyMethod(name = {"each_line", "each"}, optional = 1, frame = true) + public RubyIO each_line(ThreadContext context, IRubyObject[] args, Block block) { + Ruby runtime = context.getRuntime(); + ByteList separator = getSeparatorForGets(runtime, args); + + for (IRubyObject line = getline(runtime, separator); !line.isNil(); + line = getline(runtime, separator)) { + block.yield(context, line); + } + + return this; + } + + + @JRubyMethod(name = "readlines", optional = 1) + public RubyArray readlines(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + IRubyObject[] separatorArgs = args.length > 0 ? new IRubyObject[] { args[0] } : IRubyObject.NULL_ARRAY; + ByteList separator = getSeparatorForGets(runtime, separatorArgs); + RubyArray result = runtime.newArray(); + IRubyObject line; + + while (! (line = getline(runtime, separator)).isNil()) { + result.append(line); + } + return result; + } + + @JRubyMethod(name = "to_io") + public RubyIO to_io() { + return this; + } + + @Override + public String toString() { + return "RubyIO(" + openFile.getMode() + ", " + openFile.getMainStream().getDescriptor().getFileno() + ")"; + } + + /* class methods for IO */ + + /** rb_io_s_foreach + * + */ + @JRubyMethod(name = "foreach", required = 1, optional = 1, frame = true, meta = true) + public static IRubyObject foreach(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = context.getRuntime(); + int count = args.length; + IRubyObject filename = args[0].convertToString(); + runtime.checkSafeString(filename); + + ByteList separator = getSeparatorFromArgs(runtime, args, 1); + + RubyIO io = (RubyIO)RubyFile.open(context, runtime.getFile(), new IRubyObject[] { filename }, Block.NULL_BLOCK); + + if (!io.isNil()) { + try { + IRubyObject str = io.getline(runtime, separator); + while (!str.isNil()) { + block.yield(context, str); + str = io.getline(runtime, separator); + } + } finally { + io.close(); + } + } + + return runtime.getNil(); + } + + private static RubyIO convertToIO(ThreadContext context, IRubyObject obj) { + return (RubyIO)TypeConverter.convertToType(obj, context.getRuntime().getIO(), MethodIndex.TO_IO, "to_io"); + } + + private static boolean registerSelect(ThreadContext context, Selector selector, IRubyObject obj, RubyIO ioObj, int ops) throws IOException { + Channel channel = ioObj.getChannel(); + if (channel == null || !(channel instanceof SelectableChannel)) { + return false; + } + + ((SelectableChannel) channel).configureBlocking(false); + int real_ops = ((SelectableChannel) channel).validOps() & ops; + SelectionKey key = ((SelectableChannel) channel).keyFor(selector); + + if (key == null) { + ((SelectableChannel) channel).register(selector, real_ops, obj); + } else { + key.interestOps(key.interestOps()|real_ops); + } + + return true; + } + + @JRubyMethod(name = "select", required = 1, optional = 3, meta = true) + public static IRubyObject select(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + return select_static(context, context.getRuntime(), args); + } + + private static void checkArrayType(Ruby runtime, IRubyObject obj) { + if (!(obj instanceof RubyArray)) { + throw runtime.newTypeError("wrong argument type " + + obj.getMetaClass().getName() + " (expected Array)"); + } + } + + public static IRubyObject select_static(ThreadContext context, Ruby runtime, IRubyObject[] args) { + try { + Set pending = new HashSet(); + Set unselectable_reads = new HashSet(); + Set unselectable_writes = new HashSet(); + Selector selector = Selector.open(); + if (!args[0].isNil()) { + // read + checkArrayType(runtime, args[0]); + for (Iterator i = ((RubyArray) args[0]).getList().iterator(); i.hasNext(); ) { + IRubyObject obj = (IRubyObject) i.next(); + RubyIO ioObj = convertToIO(context, obj); + if (registerSelect(context, selector, obj, ioObj, SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) { + if (ioObj.writeDataBuffered()) { + pending.add(obj); + } + } else { + if (( ioObj.openFile.getMode() & OpenFile.READABLE ) != 0) { + unselectable_reads.add(obj); + } + } + } + } + + if (args.length > 1 && !args[1].isNil()) { + // write + checkArrayType(runtime, args[1]); + for (Iterator i = ((RubyArray) args[1]).getList().iterator(); i.hasNext(); ) { + IRubyObject obj = (IRubyObject) i.next(); + RubyIO ioObj = convertToIO(context, obj); + if (!registerSelect(context, selector, obj, ioObj, SelectionKey.OP_WRITE)) { + if (( ioObj.openFile.getMode() & OpenFile.WRITABLE ) != 0) { + unselectable_writes.add(obj); + } + } + } + } + + if (args.length > 2 && !args[2].isNil()) { + checkArrayType(runtime, args[2]); + // Java's select doesn't do anything about this, so we leave it be. + } + + final boolean has_timeout = ( args.length > 3 && !args[3].isNil() ); + long timeout = 0; + if(has_timeout) { + IRubyObject timeArg = args[3]; + if (timeArg instanceof RubyFloat) { + timeout = Math.round(((RubyFloat) timeArg).getDoubleValue() * 1000); + } else if (timeArg instanceof RubyFixnum) { + timeout = Math.round(((RubyFixnum) timeArg).getDoubleValue() * 1000); + } else { // TODO: MRI also can hadle Bignum here + throw runtime.newTypeError("can't convert " + + timeArg.getMetaClass().getName() + " into time interval"); + } + + if (timeout < 0) { + throw runtime.newArgumentError("negative timeout given"); + } + } + + if (pending.isEmpty() && unselectable_reads.isEmpty() && unselectable_writes.isEmpty()) { + if (has_timeout) { + if (timeout==0) { + selector.selectNow(); + } else { + selector.select(timeout); + } + } else { + selector.select(); + } + } else { + selector.selectNow(); + } + + List r = new ArrayList(); + List w = new ArrayList(); + List e = new ArrayList(); + for (Iterator i = selector.selectedKeys().iterator(); i.hasNext(); ) { + SelectionKey key = (SelectionKey) i.next(); + if ((key.interestOps() & key.readyOps() + & (SelectionKey.OP_READ|SelectionKey.OP_ACCEPT|SelectionKey.OP_CONNECT)) != 0) { + r.add(key.attachment()); + pending.remove(key.attachment()); + } + if ((key.interestOps() & key.readyOps() & (SelectionKey.OP_WRITE)) != 0) { + w.add(key.attachment()); + } + } + r.addAll(pending); + r.addAll(unselectable_reads); + w.addAll(unselectable_writes); + + // make all sockets blocking as configured again + for (Iterator i = selector.keys().iterator(); i.hasNext(); ) { + SelectionKey key = (SelectionKey) i.next(); + SelectableChannel channel = key.channel(); + synchronized(channel.blockingLock()) { + RubyIO originalIO = (RubyIO) TypeConverter.convertToType( + (IRubyObject) key.attachment(), runtime.getIO(), + MethodIndex.TO_IO, "to_io"); + boolean blocking = originalIO.getBlocking(); + key.cancel(); + channel.configureBlocking(blocking); + } + } + selector.close(); + + if (r.size() == 0 && w.size() == 0 && e.size() == 0) { + return runtime.getNil(); + } + + List ret = new ArrayList(); + + ret.add(RubyArray.newArray(runtime, r)); + ret.add(RubyArray.newArray(runtime, w)); + ret.add(RubyArray.newArray(runtime, e)); + + return RubyArray.newArray(runtime, ret); + } catch(IOException e) { + throw runtime.newIOError(e.getMessage()); + } + } + + public static IRubyObject read(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + switch (args.length) { + case 0: throw context.getRuntime().newArgumentError(0, 1); + case 1: return read(context, recv, args[0], block); + case 2: return read(context, recv, args[0], args[1], block); + case 3: return read(context, recv, args[0], args[1], args[2], block); + default: throw context.getRuntime().newArgumentError(args.length, 3); + } + } + + @JRubyMethod(name = "read", meta = true) + public static IRubyObject read(ThreadContext context, IRubyObject recv, IRubyObject arg0, Block block) { + IRubyObject[] fileArguments = new IRubyObject[] {arg0}; + RubyIO file = (RubyIO) RubyKernel.open(context, recv, fileArguments, block); + + try { + return file.read(context); + } finally { + file.close(); + } + } + + @JRubyMethod(name = "read", meta = true) + public static IRubyObject read(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1, Block block) { + IRubyObject[] fileArguments = new IRubyObject[] {arg0}; + RubyIO file = (RubyIO) RubyKernel.open(context, recv, fileArguments, block); + + try { + if (!arg1.isNil()) { + return file.read(context, arg1); + } else { + return file.read(context); + } + } finally { + file.close(); + } + } + + @JRubyMethod(name = "read", meta = true) + public static IRubyObject read(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) { + IRubyObject[] fileArguments = new IRubyObject[]{arg0}; + RubyIO file = (RubyIO) RubyKernel.open(context, recv, fileArguments, block); + + if (!arg2.isNil()) { + file.seek(context, arg2); + } + + try { + if (!arg1.isNil()) { + return file.read(context, arg1); + } else { + return file.read(context); + } + } finally { + file.close(); + } + } + + @JRubyMethod(name = "readlines", required = 1, optional = 1, meta = true) + public static RubyArray readlines(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + int count = args.length; + + IRubyObject[] fileArguments = new IRubyObject[]{ args[0].convertToString() }; + IRubyObject[] separatorArguments = count >= 2 ? new IRubyObject[]{args[1]} : IRubyObject.NULL_ARRAY; + RubyIO file = (RubyIO) RubyKernel.open(context, recv, fileArguments, block); + try { + return file.readlines(context, separatorArguments); + } finally { + file.close(); + } + } + + @JRubyMethod(name = "popen", required = 1, optional = 1, meta = true) + public static IRubyObject popen(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = context.getRuntime(); + int mode; + + IRubyObject cmdObj = args[0].convertToString(); + runtime.checkSafeString(cmdObj); + + if ("-".equals(cmdObj.toString())) { + throw runtime.newNotImplementedError("popen(\"-\") is unimplemented"); + } + + try { + if (args.length == 1) { + mode = ModeFlags.RDONLY; + } else if (args[1] instanceof RubyFixnum) { + mode = RubyFixnum.num2int(args[1]); + } else { + mode = getIOModesIntFromString(runtime, args[1].convertToString().toString()); + } + + ModeFlags modes = new ModeFlags(mode); + + ShellLauncher.POpenProcess process = ShellLauncher.popen(runtime, cmdObj, modes); + RubyIO io = new RubyIO(runtime, process, modes); + + if (block.isGiven()) { + try { + return block.yield(context, io); + } finally { + if (io.openFile.isOpen()) { + io.close(); + } + runtime.getGlobalVariables().set("$?", RubyProcess.RubyStatus.newProcessStatus(runtime, (process.waitFor() * 256))); + } + } + return io; + } catch (InvalidValueException ex) { + throw runtime.newErrnoEINVALError(); + } catch (IOException e) { + throw runtime.newIOErrorFromException(e); + } catch (InterruptedException e) { + throw runtime.newThreadError("unexpected interrupt"); + } + } + + // NIO based pipe + @JRubyMethod(name = "pipe", meta = true) + public static IRubyObject pipe(ThreadContext context, IRubyObject recv) throws Exception { + // TODO: This isn't an exact port of MRI's pipe behavior, so revisit + Ruby runtime = context.getRuntime(); + Pipe pipe = Pipe.open(); + + RubyIO source = new RubyIO(runtime, pipe.source()); + RubyIO sink = new RubyIO(runtime, pipe.sink()); + + sink.openFile.getMainStream().setSync(true); + return runtime.newArrayNoCopy(new IRubyObject[] { source, sink }); + } + + @JRubyMethod(name = "copy_stream", meta = true, compat = RUBY1_9) + public static IRubyObject copy_stream(ThreadContext context, IRubyObject recv, + IRubyObject stream1, IRubyObject stream2) throws IOException { + RubyIO io1 = (RubyIO)stream1; + RubyIO io2 = (RubyIO)stream2; + + ChannelDescriptor d1 = io1.openFile.getMainStream().getDescriptor(); + if (!d1.isSeekable()) { + throw context.getRuntime().newTypeError("only supports file-to-file copy"); + } + ChannelDescriptor d2 = io2.openFile.getMainStream().getDescriptor(); + if (!d2.isSeekable()) { + throw context.getRuntime().newTypeError("only supports file-to-file copy"); + } + + FileChannel f1 = (FileChannel)d1.getChannel(); + FileChannel f2 = (FileChannel)d2.getChannel(); + + long size = f1.size(); + + f1.transferTo(f2.position(), size, f2); + + return context.getRuntime().newFixnum(size); + } + + /** + * Add a thread to the list of blocking threads for this IO. + * + * @param thread A thread blocking on this IO + */ + public synchronized void addBlockingThread(RubyThread thread) { + if (blockingThreads == null) { + blockingThreads = new ArrayList<RubyThread>(1); + } + blockingThreads.add(thread); + } + + /** + * Remove a thread from the list of blocking threads for this IO. + * + * @param thread A thread blocking on this IO + */ + public synchronized void removeBlockingThread(RubyThread thread) { + if (blockingThreads == null) { + return; + } + for (int i = 0; i < blockingThreads.size(); i++) { + if (blockingThreads.get(i) == thread) { + // not using remove(Object) here to avoid the equals() call + blockingThreads.remove(i); + } + } + } + + /** + * Fire an IOError in all threads blocking on this IO object + */ + protected synchronized void interruptBlockingThreads() { + if (blockingThreads == null) { + return; + } + for (int i = 0; i < blockingThreads.size(); i++) { + RubyThread thread = blockingThreads.get(i); + + // raise will also wake the thread from selection + thread.raise(new IRubyObject[] {getRuntime().newIOError("stream closed").getException()}, Block.NULL_BLOCK); + } + } +} +/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2005 Thomas E Enebo <enebo@acm.org> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.anno.JRubyClass; + +import org.jruby.ast.ArgsNode; +import org.jruby.ast.ArgumentNode; +import org.jruby.ast.ListNode; +import org.jruby.ast.LocalAsgnNode; +import org.jruby.javasupport.Java; +import org.jruby.javasupport.JavaObject; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.Library; +import org.jruby.internal.runtime.methods.DynamicMethod; + +import org.jruby.ast.Node; +import org.jruby.compiler.ASTInspector; +import org.jruby.compiler.ASTCompiler; +import org.jruby.compiler.impl.StandardASMCompiler; +import org.jruby.internal.runtime.methods.MethodArgs; +import org.jruby.javasupport.JavaUtil; +import org.jruby.runtime.InterpretedBlock; +import org.jruby.runtime.ThreadContext; +import org.jruby.util.TypeConverter; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.util.TraceClassVisitor; + +/** + * Module which defines JRuby-specific methods for use. + */ +@JRubyModule(name="JRuby") +public class RubyJRuby { + public static RubyModule createJRuby(Ruby runtime) { + ThreadContext context = runtime.getCurrentContext(); + runtime.getKernel().callMethod(context, "require", runtime.newString("java")); + RubyModule jrubyModule = runtime.defineModule("JRuby"); + + jrubyModule.defineAnnotatedMethods(RubyJRuby.class); + + RubyClass compiledScriptClass = jrubyModule.defineClassUnder("CompiledScript",runtime.getObject(), runtime.getObject().getAllocator()); + + compiledScriptClass.attr_accessor(context, new IRubyObject[]{runtime.newSymbol("name"), runtime.newSymbol("class_name"), runtime.newSymbol("original_script"), runtime.newSymbol("code")}); + compiledScriptClass.defineAnnotatedMethods(JRubyCompiledScript.class); + + return jrubyModule; + } + + public static RubyModule createJRubyExt(Ruby runtime) { + runtime.getKernel().callMethod(runtime.getCurrentContext(),"require", runtime.newString("java")); + RubyModule mJRubyExt = runtime.getOrCreateModule("JRuby").defineModuleUnder("Extensions"); + + mJRubyExt.defineAnnotatedMethods(JRubyExtensions.class); + + runtime.getObject().includeModule(mJRubyExt); + + return mJRubyExt; + } + + public static class ExtLibrary implements Library { + public void load(Ruby runtime, boolean wrap) throws IOException { + RubyJRuby.createJRubyExt(runtime); + + runtime.getMethod().defineAnnotatedMethods(MethodExtensions.class); + } + } + + public static class TypeLibrary implements Library { + public void load(Ruby runtime, boolean wrap) throws IOException { + RubyModule jrubyType = runtime.defineModule("Type"); + jrubyType.defineAnnotatedMethods(TypeLibrary.class); + } + + @JRubyMethod(module = true) + public static IRubyObject coerce_to(ThreadContext context, IRubyObject self, IRubyObject object, IRubyObject clazz, IRubyObject method) { + Ruby ruby = object.getRuntime(); + + if (!(clazz instanceof RubyClass)) { + throw ruby.newTypeError(clazz, ruby.getClassClass()); + } + if (!(method instanceof RubySymbol)) { + throw ruby.newTypeError(method, ruby.getSymbol()); + } + + RubyClass rubyClass = (RubyClass)clazz; + RubySymbol methodSym = (RubySymbol)method; + + return TypeConverter.convertToTypeOrRaise(object, rubyClass, methodSym.asJavaString()); + } + } + + @JRubyMethod(name = "runtime", frame = true, module = true) + public static IRubyObject runtime(IRubyObject recv, Block unusedBlock) { + return Java.java_to_ruby(recv, JavaObject.wrap(recv.getRuntime(), recv.getRuntime()), Block.NULL_BLOCK); + } + + @JRubyMethod(name = "objectspace", frame = true, module = true) + public static IRubyObject getObjectSpaceEnabled(IRubyObject recv, Block b) { + Ruby runtime = recv.getRuntime(); + return RubyBoolean.newBoolean( + runtime, runtime.isObjectSpaceEnabled()); + } + + @JRubyMethod(name = "objectspace=", required = 1, frame = true, module = true) + public static IRubyObject setObjectSpaceEnabled( + IRubyObject recv, IRubyObject arg, Block b) { + Ruby runtime = recv.getRuntime(); + runtime.setObjectSpaceEnabled(arg.isTrue()); + return runtime.getNil(); + } + + @JRubyMethod(name = {"parse", "ast_for"}, optional = 3, frame = true, module = true) + public static IRubyObject parse(IRubyObject recv, IRubyObject[] args, Block block) { + if(block.isGiven()) { + if(block.getBody() instanceof org.jruby.runtime.CompiledBlock) { + throw new RuntimeException("Cannot compile an already compiled block. Use -J-Djruby.jit.enabled=false to avoid this problem."); + } + Arity.checkArgumentCount(recv.getRuntime(),args,0,0); + return Java.java_to_ruby(recv, JavaObject.wrap(recv.getRuntime(), ((InterpretedBlock)block.getBody()).getIterNode().getBodyNode()), Block.NULL_BLOCK); + } else { + Arity.checkArgumentCount(recv.getRuntime(),args,1,3); + String filename = "-"; + boolean extraPositionInformation = false; + RubyString content = args[0].convertToString(); + if(args.length>1) { + filename = args[1].convertToString().toString(); + if(args.length>2) { + extraPositionInformation = args[2].isTrue(); + } + } + return Java.java_to_ruby(recv, JavaObject.wrap(recv.getRuntime(), + recv.getRuntime().parse(content.getByteList(), filename, null, 0, extraPositionInformation)), Block.NULL_BLOCK); + } + } + + @JRubyMethod(name = "compile", optional = 3, frame = true, module = true) + public static IRubyObject compile(IRubyObject recv, IRubyObject[] args, Block block) { + Node node; + String filename; + RubyString content; + if(block.isGiven()) { + Arity.checkArgumentCount(recv.getRuntime(),args,0,0); + if(block.getBody() instanceof org.jruby.runtime.CompiledBlock) { + throw new RuntimeException("Cannot compile an already compiled block. Use -J-Djruby.jit.enabled=false to avoid this problem."); + } + content = RubyString.newEmptyString(recv.getRuntime()); + Node bnode = ((InterpretedBlock)block.getBody()).getIterNode().getBodyNode(); + node = new org.jruby.ast.RootNode(bnode.getPosition(), block.getBinding().getDynamicScope(), bnode); + filename = "__block_" + node.getPosition().getFile(); + } else { + Arity.checkArgumentCount(recv.getRuntime(),args,1,3); + filename = "-"; + boolean extraPositionInformation = false; + content = args[0].convertToString(); + if(args.length>1) { + filename = args[1].convertToString().toString(); + if(args.length>2) { + extraPositionInformation = args[2].isTrue(); + } + } + + node = recv.getRuntime().parse(content.getByteList(), filename, null, 0, extraPositionInformation); + } + + String classname; + if (filename.equals("-e")) { + classname = "__dash_e__"; + } else { + classname = filename.replace('\\', '/').replaceAll(".rb", "").replaceAll("-","_dash_"); + } + + ASTInspector inspector = new ASTInspector(); + inspector.inspect(node); + + StandardASMCompiler asmCompiler = new StandardASMCompiler(classname, filename); + ASTCompiler compiler = new ASTCompiler(); + compiler.compileRoot(node, asmCompiler, inspector); + byte[] bts = asmCompiler.getClassByteArray(); + + IRubyObject compiledScript = ((RubyModule)recv).fastGetConstant("CompiledScript").callMethod(recv.getRuntime().getCurrentContext(),"new"); + compiledScript.callMethod(recv.getRuntime().getCurrentContext(), "name=", recv.getRuntime().newString(filename)); + compiledScript.callMethod(recv.getRuntime().getCurrentContext(), "class_name=", recv.getRuntime().newString(classname)); + compiledScript.callMethod(recv.getRuntime().getCurrentContext(), "original_script=", content); + compiledScript.callMethod(recv.getRuntime().getCurrentContext(), "code=", Java.java_to_ruby(recv, JavaObject.wrap(recv.getRuntime(), bts), Block.NULL_BLOCK)); + + return compiledScript; + } + + @JRubyMethod(name = "reference", required = 1, module = true) + public static IRubyObject reference(IRubyObject recv, IRubyObject obj) { + return Java.wrap(recv.getRuntime().getJavaSupport().getJavaUtilitiesModule(), + JavaObject.wrap(recv.getRuntime(), obj)); + } + + @JRubyMethod(name = "dereference", required = 1, module = true) + public static IRubyObject dereference(ThreadContext context, IRubyObject recv, IRubyObject obj) { + if (!(obj.dataGetStruct() instanceof JavaObject)) { + throw context.getRuntime().newTypeError("got " + obj + ", expected wrapped Java object"); + } + + Object unwrapped = JavaUtil.unwrapJavaObject(obj); + + if (!(unwrapped instanceof IRubyObject)) { + throw context.getRuntime().newTypeError("got " + obj + ", expected Java-wrapped Ruby object"); + } + + return (IRubyObject)unwrapped; + } + + @JRubyClass(name="JRuby::CompiledScript") + public static class JRubyCompiledScript { + @JRubyMethod(name = "to_s") + public static IRubyObject compiled_script_to_s(IRubyObject recv) { + return recv.getInstanceVariables().fastGetInstanceVariable("@original_script"); + } + + @JRubyMethod(name = "inspect") + public static IRubyObject compiled_script_inspect(IRubyObject recv) { + return recv.getRuntime().newString("#<JRuby::CompiledScript " + recv.getInstanceVariables().fastGetInstanceVariable("@name") + ">"); + } + + @JRubyMethod(name = "inspect_bytecode") + public static IRubyObject compiled_script_inspect_bytecode(IRubyObject recv) { + StringWriter sw = new StringWriter(); + ClassReader cr = new ClassReader((byte[])org.jruby.javasupport.JavaUtil.convertRubyToJava(recv.getInstanceVariables().fastGetInstanceVariable("@code"),byte[].class)); + TraceClassVisitor cv = new TraceClassVisitor(new PrintWriter(sw)); + cr.accept(cv, ClassReader.SKIP_DEBUG); + return recv.getRuntime().newString(sw.toString()); + } + } + + @JRubyModule(name="JRubyExtensions") + public static class JRubyExtensions { + @JRubyMethod(name = "steal_method", required = 2, module = true) + public static IRubyObject steal_method(IRubyObject recv, IRubyObject type, IRubyObject methodName) { + RubyModule to_add = null; + if(recv instanceof RubyModule) { + to_add = (RubyModule)recv; + } else { + to_add = recv.getSingletonClass(); + } + String name = methodName.toString(); + if(!(type instanceof RubyModule)) { + throw recv.getRuntime().newArgumentError("First argument must be a module/class"); + } + + DynamicMethod method = ((RubyModule)type).searchMethod(name); + if(method == null || method.isUndefined()) { + throw recv.getRuntime().newArgumentError("No such method " + name + " on " + type); + } + + to_add.addMethod(name, method); + return recv.getRuntime().getNil(); + } + + @JRubyMethod(name = "steal_methods", required = 1, rest = true, module = true) + public static IRubyObject steal_methods(IRubyObject recv, IRubyObject[] args) { + IRubyObject type = args[0]; + for(int i=1;i<args.length;i++) { + steal_method(recv, type, args[i]); + } + return recv.getRuntime().getNil(); + } + } + + public static class MethodExtensions { + @JRubyMethod(name = "args") + public static IRubyObject methodArgs(IRubyObject recv) { + Ruby ruby = recv.getRuntime(); + RubyMethod rubyMethod = (RubyMethod)recv; + + DynamicMethod method = rubyMethod.method; + + if (method instanceof MethodArgs) { + MethodArgs interpMethod = (MethodArgs)method; + ArgsNode args = interpMethod.getArgsNode(); + RubyArray argsArray = RubyArray.newArray(ruby); + + RubyArray reqArray = RubyArray.newArray(ruby); + ListNode requiredArgs = args.getArgs(); + for (int i = 0; requiredArgs != null && i < requiredArgs.size(); i++) { + ArgumentNode arg = (ArgumentNode)requiredArgs.get(i); + reqArray.append(RubySymbol.newSymbol(ruby, arg.getName())); + } + argsArray.append(reqArray); + + RubyArray optArray = RubyArray.newArray(ruby); + ListNode optArgs = args.getOptArgs(); + for (int i = 0; optArgs != null && i < optArgs.size(); i++) { + LocalAsgnNode arg = (LocalAsgnNode)optArgs.get(i); + optArray.append(RubySymbol.newSymbol(ruby, arg.getName())); + } + argsArray.append(optArray); + + if (args.getRestArgNode() != null) { + argsArray.append(RubySymbol.newSymbol(ruby, args.getRestArgNode().getName())); + } else { + argsArray.append(ruby.getNil()); + } + + if (args.getBlockArgNode() != null) { + argsArray.append(RubySymbol.newSymbol(ruby, args.getBlockArgNode().getName())); + } else { + argsArray.append(ruby.getNil()); + } + + return argsArray; + } + + throw ruby.newTypeError("Method args are only available for standard interpreted or jitted methods"); + } + } +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Kiel Hodges <jruby-devel@selfsosoft.com> + * Copyright (C) 2006 Evan Buswell <evan@heron.sytes.net> + * Copyright (C) 2006 Ola Bini <ola@ologix.com> + * Copyright (C) 2006 Michael Studman <codehaus@michaelstudman.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2007 Nick Sieger <nicksieger@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.ByteArrayOutputStream; +import java.math.BigInteger; +import java.util.ArrayList; +import static org.jruby.anno.FrameField.*; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; + +import org.jruby.ast.util.ArgsUtil; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.evaluator.ASTInterpreter; +import org.jruby.exceptions.JumpException; +import org.jruby.exceptions.MainExitException; +import org.jruby.exceptions.RaiseException; +import org.jruby.internal.runtime.JumpTarget; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallType; +import org.jruby.runtime.Frame; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import static org.jruby.runtime.Visibility.*; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.load.IAutoloadMethod; +import org.jruby.runtime.load.LoadService; +import org.jruby.util.IdUtil; +import org.jruby.util.ShellLauncher; +import org.jruby.util.TypeConverter; + +/** + * Note: For CVS history, see KernelModule.java. + */ +@JRubyModule(name="Kernel") +public class RubyKernel { + public final static Class<?> IRUBY_OBJECT = IRubyObject.class; + + public static RubyModule createKernelModule(Ruby runtime) { + RubyModule module = runtime.defineModule("Kernel"); + runtime.setKernel(module); + + module.defineAnnotatedMethods(RubyKernel.class); + module.defineAnnotatedMethods(RubyObject.class); + + runtime.setRespondToMethod(module.searchMethod("respond_to?")); + + module.setFlag(RubyObject.USER7_F, false); //Kernel is the only Module that doesn't need an implementor + + return module; + } + + @JRubyMethod(name = "at_exit", frame = true, module = true, visibility = PRIVATE) + public static IRubyObject at_exit(ThreadContext context, IRubyObject recv, Block block) { + return context.getRuntime().pushExitBlock(context.getRuntime().newProc(Block.Type.PROC, block)); + } + + @JRubyMethod(name = "autoload?", required = 1, module = true, visibility = PRIVATE) + public static IRubyObject autoload_p(ThreadContext context, final IRubyObject recv, IRubyObject symbol) { + Ruby runtime = context.getRuntime(); + RubyModule module = recv instanceof RubyModule ? (RubyModule) recv : runtime.getObject(); + String name = module.getName() + "::" + symbol.asJavaString(); + + IAutoloadMethod autoloadMethod = runtime.getLoadService().autoloadFor(name); + if (autoloadMethod == null) return runtime.getNil(); + + return runtime.newString(autoloadMethod.file()); + } + + @JRubyMethod(name = "autoload", required = 2, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject autoload(final IRubyObject recv, IRubyObject symbol, final IRubyObject file) { + Ruby runtime = recv.getRuntime(); + final LoadService loadService = runtime.getLoadService(); + String nonInternedName = symbol.asJavaString(); + + if (!IdUtil.isValidConstantName(nonInternedName)) { + throw runtime.newNameError("autoload must be constant name", nonInternedName); + } + + RubyString fileString = file.convertToString(); + + if (fileString.isEmpty()) { + throw runtime.newArgumentError("empty file name"); + } + + final String baseName = symbol.asJavaString().intern(); // interned, OK for "fast" methods + final RubyModule module = recv instanceof RubyModule ? (RubyModule) recv : runtime.getObject(); + String nm = module.getName() + "::" + baseName; + + IRubyObject existingValue = module.fastFetchConstant(baseName); + if (existingValue != null && existingValue != RubyObject.UNDEF) return runtime.getNil(); + + module.fastStoreConstant(baseName, RubyObject.UNDEF); + + loadService.addAutoload(nm, new IAutoloadMethod() { + public String file() { + return file.toString(); + } + /** + * @see org.jruby.runtime.load.IAutoloadMethod#load(Ruby, String) + */ + public IRubyObject load(Ruby runtime, String name) { + boolean required = loadService.require(file()); + + // File to be loaded by autoload has already been or is being loaded. + if (!required) return null; + + return module.fastGetConstant(baseName); + } + }); + return runtime.getNil(); + } + + @JRubyMethod(name = "method_missing", rest = true, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject method_missing(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = context.getRuntime(); + + if (args.length == 0 || !(args[0] instanceof RubySymbol)) throw runtime.newArgumentError("no id given"); + + Visibility lastVis = context.getLastVisibility(); + CallType lastCallType = context.getLastCallType(); + + // create a lightweight thunk + IRubyObject msg = new RubyNameError.RubyNameErrorMessage(runtime, + recv, + args[0], + lastVis, + lastCallType); + final IRubyObject[]exArgs; + final RubyClass exc; + if (lastCallType != CallType.VARIABLE) { + exc = runtime.getNoMethodError(); + exArgs = new IRubyObject[]{msg, args[0], RubyArray.newArrayNoCopy(runtime, args, 1)}; + } else { + exc = runtime.getNameError(); + exArgs = new IRubyObject[]{msg, args[0]}; + } + + throw new RaiseException((RubyException)exc.newInstance(context, exArgs, Block.NULL_BLOCK)); + } + + @JRubyMethod(name = "open", required = 1, optional = 2, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject open(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + String arg = args[0].convertToString().toString(); + Ruby runtime = context.getRuntime(); + + if (arg.startsWith("|")) { + String command = arg.substring(1); + // exec process, create IO with process + return RubyIO.popen(context, runtime.getIO(), new IRubyObject[] {runtime.newString(command)}, block); + } + + return RubyFile.open(context, runtime.getFile(), args, block); + } + + @JRubyMethod(name = "getc", module = true, visibility = PRIVATE) + public static IRubyObject getc(ThreadContext context, IRubyObject recv) { + context.getRuntime().getWarnings().warn(ID.DEPRECATED_METHOD, "getc is obsolete; use STDIN.getc instead", "getc", "STDIN.getc"); + IRubyObject defin = context.getRuntime().getGlobalVariables().get("$stdin"); + return defin.callMethod(context, "getc"); + } + + @JRubyMethod(name = "gets", optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject gets(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + return RubyArgsFile.gets(context, context.getRuntime().getGlobalVariables().get("$<"), args); + } + + @JRubyMethod(name = "abort", optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject abort(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + if(args.length == 1) { + context.getRuntime().getGlobalVariables().get("$stderr").callMethod(context,"puts",args[0]); + } + throw new MainExitException(1,true); + } + + @JRubyMethod(name = "Array", required = 1, module = true, visibility = PRIVATE) + public static IRubyObject new_array(ThreadContext context, IRubyObject recv, IRubyObject object) { + IRubyObject value = object.checkArrayType(); + + if (value.isNil()) { + if (object.getMetaClass().searchMethod("to_a").getImplementationClass() != context.getRuntime().getKernel()) { + value = object.callMethod(context, MethodIndex.TO_A, "to_a"); + if (!(value instanceof RubyArray)) throw context.getRuntime().newTypeError("`to_a' did not return Array"); + return value; + } else { + return context.getRuntime().newArray(object); + } + } + return value; + } + + @JRubyMethod(name = "Complex", module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_9) + public static IRubyObject new_complex(ThreadContext context, IRubyObject recv) { + return RuntimeHelpers.invoke(context, context.getRuntime().getComplex(), "convert"); + } + @JRubyMethod(name = "Complex", module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_9) + public static IRubyObject new_complex(ThreadContext context, IRubyObject recv, IRubyObject arg) { + return RuntimeHelpers.invoke(context, context.getRuntime().getComplex(), "convert", arg); + } + @JRubyMethod(name = "Complex", module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_9) + public static IRubyObject new_complex(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1) { + return RuntimeHelpers.invoke(context, context.getRuntime().getComplex(), "convert", arg0, arg1); + } + + @JRubyMethod(name = "Rational", module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_9) + public static IRubyObject new_rational(ThreadContext context, IRubyObject recv) { + return RuntimeHelpers.invoke(context, context.getRuntime().getRational(), "convert"); + } + @JRubyMethod(name = "Rational", module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_9) + public static IRubyObject new_rational(ThreadContext context, IRubyObject recv, IRubyObject arg) { + return RuntimeHelpers.invoke(context, context.getRuntime().getRational(), "convert", arg); + } + @JRubyMethod(name = "Rational", module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_9) + public static IRubyObject new_rational(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1) { + return RuntimeHelpers.invoke(context, context.getRuntime().getRational(), "convert", arg0, arg1); + } + + @JRubyMethod(name = "Float", module = true, visibility = PRIVATE) + public static IRubyObject new_float(IRubyObject recv, IRubyObject object) { + if(object instanceof RubyFixnum){ + return RubyFloat.newFloat(object.getRuntime(), ((RubyFixnum)object).getDoubleValue()); + }else if(object instanceof RubyFloat){ + return object; + }else if(object instanceof RubyBignum){ + return RubyFloat.newFloat(object.getRuntime(), RubyBignum.big2dbl((RubyBignum)object)); + }else if(object instanceof RubyString){ + if(((RubyString)object).getByteList().realSize == 0){ // rb_cstr_to_dbl case + throw recv.getRuntime().newArgumentError("invalid value for Float(): " + object.inspect()); + } + return RubyNumeric.str2fnum(recv.getRuntime(),(RubyString)object,true); + }else if(object.isNil()){ + throw recv.getRuntime().newTypeError("can't convert nil into Float"); + } else { + RubyFloat rFloat = (RubyFloat)TypeConverter.convertToType(object, recv.getRuntime().getFloat(), MethodIndex.TO_F, "to_f"); + if (Double.isNaN(rFloat.getDoubleValue())) throw recv.getRuntime().newArgumentError("invalid value for Float()"); + return rFloat; + } + } + + @JRubyMethod(name = "Integer", required = 1, module = true, visibility = PRIVATE) + public static IRubyObject new_integer(ThreadContext context, IRubyObject recv, IRubyObject object) { + if (object instanceof RubyFloat) { + double val = ((RubyFloat)object).getDoubleValue(); + if (val > (double) RubyFixnum.MAX && val < (double) RubyFixnum.MIN) { + return RubyNumeric.dbl2num(context.getRuntime(),((RubyFloat)object).getDoubleValue()); + } + } else if (object instanceof RubyFixnum || object instanceof RubyBignum) { + return object; + } else if (object instanceof RubyString) { + return RubyNumeric.str2inum(context.getRuntime(),(RubyString)object,0,true); + } + + IRubyObject tmp = TypeConverter.convertToType(object, context.getRuntime().getInteger(), MethodIndex.TO_INT, "to_int", false); + if (tmp.isNil()) return object.convertToInteger(MethodIndex.TO_I, "to_i"); + return tmp; + } + + @JRubyMethod(name = "String", required = 1, module = true, visibility = PRIVATE) + public static IRubyObject new_string(ThreadContext context, IRubyObject recv, IRubyObject object) { + return TypeConverter.convertToType(object, context.getRuntime().getString(), MethodIndex.TO_S, "to_s"); + } + + @JRubyMethod(name = "p", rest = true, module = true, visibility = PRIVATE) + public static IRubyObject p(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + IRubyObject defout = runtime.getGlobalVariables().get("$>"); + + for (int i = 0; i < args.length; i++) { + if (args[i] != null) { + defout.callMethod(context, "write", RubyObject.inspect(context, args[i])); + defout.callMethod(context, "write", runtime.newString("\n")); + } + } + + if (defout instanceof RubyFile) { + ((RubyFile)defout).flush(); + } + + return context.getRuntime().getNil(); + } + + /** rb_f_putc + */ + @JRubyMethod(name = "putc", required = 1, module = true, visibility = PRIVATE) + public static IRubyObject putc(ThreadContext context, IRubyObject recv, IRubyObject ch) { + IRubyObject defout = context.getRuntime().getGlobalVariables().get("$>"); + return defout.callMethod(context, "putc", ch); + } + + @JRubyMethod(name = "puts", rest = true, module = true, visibility = PRIVATE) + public static IRubyObject puts(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + IRubyObject defout = context.getRuntime().getGlobalVariables().get("$>"); + + defout.callMethod(context, "puts", args); + + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "print", rest = true, module = true, visibility = PRIVATE) + public static IRubyObject print(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + IRubyObject defout = context.getRuntime().getGlobalVariables().get("$>"); + + defout.callMethod(context, "print", args); + + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "printf", rest = true, module = true, visibility = PRIVATE) + public static IRubyObject printf(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + if (args.length != 0) { + IRubyObject defout = context.getRuntime().getGlobalVariables().get("$>"); + + if (!(args[0] instanceof RubyString)) { + defout = args[0]; + args = ArgsUtil.popArray(args); + } + + defout.callMethod(context, "write", RubyKernel.sprintf(recv, args)); + } + + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "readline", optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject readline(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + IRubyObject line = gets(context, recv, args); + + if (line.isNil()) throw context.getRuntime().newEOFError(); + + return line; + } + + @JRubyMethod(name = "readlines", optional = 1, module = true, visibility = PRIVATE) + public static RubyArray readlines(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + return RubyArgsFile.readlines(context, context.getRuntime().getGlobalVariables().get("$<"), args); + } + + /** Returns value of $_. + * + * @throws TypeError if $_ is not a String or nil. + * @return value of $_ as String. + */ + private static RubyString getLastlineString(ThreadContext context, Ruby runtime) { + IRubyObject line = context.getPreviousFrame().getLastLine(); + + if (line.isNil()) { + throw runtime.newTypeError("$_ value need to be String (nil given)."); + } else if (!(line instanceof RubyString)) { + throw runtime.newTypeError("$_ value need to be String (" + line.getMetaClass().getName() + " given)."); + } else { + return (RubyString) line; + } + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the one or two-arg versions. + */ + public static IRubyObject sub_bang(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + return getLastlineString(context, context.getRuntime()).sub_bang(context, args, block); + } + + @JRubyMethod(name = "sub!", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE) + public static IRubyObject sub_bang(ThreadContext context, IRubyObject recv, IRubyObject arg0, Block block) { + return getLastlineString(context, context.getRuntime()).sub_bang(context, arg0, block); + } + + @JRubyMethod(name = "sub!", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE) + public static IRubyObject sub_bang(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1, Block block) { + return getLastlineString(context, context.getRuntime()).sub_bang(context, arg0, arg1, block); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the one or two-arg versions. + */ + public static IRubyObject sub(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + RubyString str = (RubyString) getLastlineString(context, context.getRuntime()).dup(); + + if (!str.sub_bang(context, args, block).isNil()) { + context.getPreviousFrame().setLastLine(str); + } + + return str; + } + + @JRubyMethod(name = "sub", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject sub(ThreadContext context, IRubyObject recv, IRubyObject arg0, Block block) { + RubyString str = (RubyString) getLastlineString(context, context.getRuntime()).dup(); + + if (!str.sub_bang(context, arg0, block).isNil()) { + context.getPreviousFrame().setLastLine(str); + } + + return str; + } + + @JRubyMethod(name = "sub", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject sub(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1, Block block) { + RubyString str = (RubyString) getLastlineString(context, context.getRuntime()).dup(); + + if (!str.sub_bang(context, arg0, arg1, block).isNil()) { + context.getPreviousFrame().setLastLine(str); + } + + return str; + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the one or two-arg versions. + */ + public static IRubyObject gsub_bang(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + return getLastlineString(context, context.getRuntime()).gsub_bang(context, args, block); + } + + @JRubyMethod(name = "gsub!", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject gsub_bang(ThreadContext context, IRubyObject recv, IRubyObject arg0, Block block) { + return getLastlineString(context, context.getRuntime()).gsub_bang(context, arg0, block); + } + + @JRubyMethod(name = "gsub!", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject gsub_bang(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1, Block block) { + return getLastlineString(context, context.getRuntime()).gsub_bang(context, arg0, arg1, block); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the one or two-arg versions. + */ + public static IRubyObject gsub(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + RubyString str = (RubyString) getLastlineString(context, context.getRuntime()).dup(); + + if (!str.gsub_bang(context, args, block).isNil()) { + context.getPreviousFrame().setLastLine(str); + } + + return str; + } + + @JRubyMethod(name = "gsub", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject gsub(ThreadContext context, IRubyObject recv, IRubyObject arg0, Block block) { + RubyString str = (RubyString) getLastlineString(context, context.getRuntime()).dup(); + + if (!str.gsub_bang(context, arg0, block).isNil()) { + context.getPreviousFrame().setLastLine(str); + } + + return str; + } + + @JRubyMethod(name = "gsub", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject gsub(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1, Block block) { + RubyString str = (RubyString) getLastlineString(context, context.getRuntime()).dup(); + + if (!str.gsub_bang(context, arg0, arg1, block).isNil()) { + context.getPreviousFrame().setLastLine(str); + } + + return str; + } + + @JRubyMethod(name = "chop!", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject chop_bang(ThreadContext context, IRubyObject recv, Block block) { + return getLastlineString(context, context.getRuntime()).chop_bang(); + } + + @JRubyMethod(name = "chop", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject chop(ThreadContext context, IRubyObject recv, Block block) { + RubyString str = getLastlineString(context, context.getRuntime()); + + if (str.getByteList().realSize > 0) { + str = (RubyString) str.dup(); + str.chop_bang(); + context.getPreviousFrame().setLastLine(str); + } + + return str; + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the zero or one-arg versions. + */ + public static IRubyObject chomp_bang(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + return getLastlineString(context, context.getRuntime()).chomp_bang(args); + } + + @JRubyMethod(name = "chomp!", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject chomp_bang(ThreadContext context, IRubyObject recv) { + return getLastlineString(context, context.getRuntime()).chomp_bang(); + } + + @JRubyMethod(name = "chomp!", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject chomp_bang(ThreadContext context, IRubyObject recv, IRubyObject arg0) { + return getLastlineString(context, context.getRuntime()).chomp_bang(arg0); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the zero or one-arg versions. + */ + public static IRubyObject chomp(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + RubyString str = getLastlineString(context, context.getRuntime()); + RubyString dup = (RubyString) str.dup(); + + if (dup.chomp_bang(args).isNil()) { + return str; + } + + context.getPreviousFrame().setLastLine(dup); + return dup; + } + + @JRubyMethod(name = "chomp", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject chomp(ThreadContext context, IRubyObject recv) { + RubyString str = getLastlineString(context, context.getRuntime()); + RubyString dup = (RubyString) str.dup(); + + if (dup.chomp_bang().isNil()) { + return str; + } + + context.getPreviousFrame().setLastLine(dup); + return dup; + } + + @JRubyMethod(name = "chomp", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = LASTLINE) + public static IRubyObject chomp(ThreadContext context, IRubyObject recv, IRubyObject arg0) { + RubyString str = getLastlineString(context, context.getRuntime()); + RubyString dup = (RubyString) str.dup(); + + if (dup.chomp_bang(arg0).isNil()) { + return str; + } + + context.getPreviousFrame().setLastLine(dup); + return dup; + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * + * @param context The thread context for the current thread + * @param recv The receiver of the method (usually a class that has included Kernel) + * @return + * @deprecated Use the versions with zero, one, or two args. + */ + public static IRubyObject split(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + return getLastlineString(context, context.getRuntime()).split(context, args); + } + + @JRubyMethod(name = "split", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = {LASTLINE, BACKREF}) + public static IRubyObject split(ThreadContext context, IRubyObject recv) { + return getLastlineString(context, context.getRuntime()).split(context); + } + + @JRubyMethod(name = "split", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = {LASTLINE, BACKREF}) + public static IRubyObject split(ThreadContext context, IRubyObject recv, IRubyObject arg0) { + return getLastlineString(context, context.getRuntime()).split(context, arg0); + } + + @JRubyMethod(name = "split", frame = true, module = true, visibility = PRIVATE, reads = LASTLINE, writes = {LASTLINE, BACKREF}) + public static IRubyObject split(ThreadContext context, IRubyObject recv, IRubyObject arg0, IRubyObject arg1) { + return getLastlineString(context, context.getRuntime()).split(context, arg0, arg1); + } + + @JRubyMethod(name = "scan", required = 1, frame = true, module = true, visibility = PRIVATE, reads = {LASTLINE, BACKREF}, writes = {LASTLINE, BACKREF}) + public static IRubyObject scan(ThreadContext context, IRubyObject recv, IRubyObject pattern, Block block) { + return getLastlineString(context, context.getRuntime()).scan(context, pattern, block); + } + + @JRubyMethod(name = "select", required = 1, optional = 3, module = true, visibility = PRIVATE) + public static IRubyObject select(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + return RubyIO.select_static(context, context.getRuntime(), args); + } + + @JRubyMethod(name = "sleep", optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject sleep(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + long milliseconds; + + if (args.length == 0) { + // Zero sleeps forever + milliseconds = 0; + } else { + if (!(args[0] instanceof RubyNumeric)) { + throw context.getRuntime().newTypeError("can't convert " + args[0].getMetaClass().getName() + "into time interval"); + } + milliseconds = (long) (args[0].convertToFloat().getDoubleValue() * 1000); + if (milliseconds < 0) { + throw context.getRuntime().newArgumentError("time interval must be positive"); + } else if (milliseconds == 0) { + // Explicit zero in MRI returns immediately + return context.getRuntime().newFixnum(0); + } + } + long startTime = System.currentTimeMillis(); + + RubyThread rubyThread = context.getThread(); + + do { + long loopStartTime = System.currentTimeMillis(); + try { + rubyThread.sleep(milliseconds); + } catch (InterruptedException iExcptn) { + } + milliseconds -= (System.currentTimeMillis() - loopStartTime); + } while (milliseconds > 0); + + return context.getRuntime().newFixnum(Math.round((System.currentTimeMillis() - startTime) / 1000.0)); + } + + // FIXME: Add at_exit and finalizers to exit, then make exit_bang not call those. + @JRubyMethod(name = "exit", optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject exit(IRubyObject recv, IRubyObject[] args) { + exit(recv.getRuntime(), args, false); + return recv.getRuntime().getNil(); // not reached + } + + @JRubyMethod(name = "exit!", optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject exit_bang(IRubyObject recv, IRubyObject[] args) { + exit(recv.getRuntime(), args, true); + return recv.getRuntime().getNil(); // not reached + } + + private static void exit(Ruby runtime, IRubyObject[] args, boolean hard) { + runtime.secure(4); + + int status = 1; + if (args.length > 0) { + RubyObject argument = (RubyObject)args[0]; + if (argument instanceof RubyFixnum) { + status = RubyNumeric.fix2int(argument); + } else { + status = argument.isFalse() ? 1 : 0; + } + } + + if (hard) { + throw new MainExitException(status, true); + } else { + throw runtime.newSystemExit(status); + } + } + + + /** Returns an Array with the names of all global variables. + * + */ + @JRubyMethod(name = "global_variables", module = true, visibility = PRIVATE) + public static RubyArray global_variables(ThreadContext context, IRubyObject recv) { + Ruby runtime = context.getRuntime(); + RubyArray globalVariables = runtime.newArray(); + + for (String globalVariableName : runtime.getGlobalVariables().getNames()) { + globalVariables.append(runtime.newString(globalVariableName)); + } + + return globalVariables; + } + + /** Returns an Array with the names of all local variables. + * + */ + @JRubyMethod(name = "local_variables", module = true, visibility = PRIVATE) + public static RubyArray local_variables(ThreadContext context, IRubyObject recv) { + final Ruby runtime = context.getRuntime(); + RubyArray localVariables = runtime.newArray(); + + for (String name: context.getCurrentScope().getAllNamesInScope()) { + if (IdUtil.isLocal(name)) localVariables.append(runtime.newString(name)); + } + + return localVariables; + } + + @JRubyMethod(name = "binding", frame = true, module = true, visibility = PRIVATE) + public static RubyBinding binding(ThreadContext context, IRubyObject recv, Block block) { + return RubyBinding.newBinding(context.getRuntime()); + } + + @JRubyMethod(name = {"block_given?", "iterator?"}, frame = true, module = true, visibility = PRIVATE) + public static RubyBoolean block_given_p(ThreadContext context, IRubyObject recv, Block block) { + return context.getRuntime().newBoolean(context.getPreviousFrame().getBlock().isGiven()); + } + + + @Deprecated + public static IRubyObject sprintf(IRubyObject recv, IRubyObject[] args) { + return sprintf(recv.getRuntime().getCurrentContext(), recv, args); + } + + @JRubyMethod(name = {"sprintf", "format"}, required = 1, rest = true, module = true, visibility = PRIVATE) + public static IRubyObject sprintf(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + if (args.length == 0) { + throw context.getRuntime().newArgumentError("sprintf must have at least one argument"); + } + + RubyString str = RubyString.stringValue(args[0]); + + RubyArray newArgs = context.getRuntime().newArrayNoCopy(args); + newArgs.shift(); + + return str.op_format(context, newArgs); + } + + @JRubyMethod(name = {"raise", "fail"}, optional = 3, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject raise(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + // FIXME: Pass block down? + Ruby runtime = context.getRuntime(); + + if (args.length == 0) { + IRubyObject lastException = runtime.getGlobalVariables().get("$!"); + if (lastException.isNil()) { + throw new RaiseException(runtime, runtime.getRuntimeError(), "", false); + } + throw new RaiseException((RubyException) lastException); + } + + IRubyObject exception; + + if (args.length == 1) { + if (args[0] instanceof RubyString) { + throw new RaiseException((RubyException)runtime.getRuntimeError().newInstance(context, args, block)); + } + + if (!args[0].respondsTo("exception")) { + throw runtime.newTypeError("exception class/object expected"); + } + exception = args[0].callMethod(context, "exception"); + } else { + if (!args[0].respondsTo("exception")) { + throw runtime.newTypeError("exception class/object expected"); + } + + exception = args[0].callMethod(context, "exception", args[1]); + } + + if (!runtime.fastGetClass("Exception").isInstance(exception)) { + throw runtime.newTypeError("exception object expected"); + } + + if (args.length == 3) { + ((RubyException) exception).set_backtrace(args[2]); + } + + if (runtime.getDebug().isTrue()) { + printExceptionSummary(context, runtime, (RubyException) exception); + } + + throw new RaiseException((RubyException) exception); + } + + private static void printExceptionSummary(ThreadContext context, Ruby runtime, RubyException rEx) { + Frame currentFrame = context.getCurrentFrame(); + + String msg = String.format("Exception `%s' at %s:%s - %s\n", + rEx.getMetaClass(), + currentFrame.getFile(), currentFrame.getLine() + 1, + rEx.to_s()); + + IRubyObject errorStream = runtime.getGlobalVariables().get("$stderr"); + errorStream.callMethod(context, "write", runtime.newString(msg)); + } + + /** + * Require. + * MRI allows to require ever .rb files or ruby extension dll (.so or .dll depending on system). + * we allow requiring either .rb files or jars. + * @param recv ruby object used to call require (any object will do and it won't be used anyway). + * @param name the name of the file to require + **/ + @JRubyMethod(name = "require", required = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject require(IRubyObject recv, IRubyObject name, Block block) { + Ruby runtime = recv.getRuntime(); + + if (runtime.getLoadService().require(name.convertToString().toString())) { + return runtime.getTrue(); + } + return runtime.getFalse(); + } + + @JRubyMethod(name = "load", required = 1, optional = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject load(IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = recv.getRuntime(); + RubyString file = args[0].convertToString(); + boolean wrap = args.length == 2 ? args[1].isTrue() : false; + + runtime.getLoadService().load(file.getByteList().toString(), wrap); + + return runtime.getTrue(); + } + + @JRubyMethod(name = "eval", required = 1, optional = 3, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject eval(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = context.getRuntime(); + + // string to eval + RubyString src = args[0].convertToString(); + runtime.checkSafeString(src); + + IRubyObject scope = args.length > 1 && !args[1].isNil() ? args[1] : null; + String file; + if (args.length > 2) { + file = args[2].convertToString().toString(); + } else if (scope == null) { + file = "(eval)"; + } else { + file = null; + } + int line; + if (args.length > 3) { + line = (int) args[3].convertToInteger().getLongValue(); + } else if (scope == null) { + line = 0; + } else { + line = -1; + } + if (scope == null) scope = RubyBinding.newBindingForEval(context); + + return ASTInterpreter.evalWithBinding(context, src, scope, file, line); + } + + @JRubyMethod(name = "callcc", frame = true, module = true, visibility = PRIVATE) + public static IRubyObject callcc(ThreadContext context, IRubyObject recv, Block block) { + Ruby runtime = context.getRuntime(); + runtime.getWarnings().warn(ID.EMPTY_IMPLEMENTATION, "Kernel#callcc: Continuations are not implemented in JRuby and will not work", "Kernel#callcc"); + IRubyObject cc = runtime.getContinuation().callMethod(context, "new"); + cc.dataWrapStruct(block); + return block.yield(context, cc); + } + + @JRubyMethod(name = "caller", optional = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject caller(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + int level = args.length > 0 ? RubyNumeric.fix2int(args[0]) : 1; + + if (level < 0) { + throw context.getRuntime().newArgumentError("negative level(" + level + ')'); + } + + return context.createCallerBacktrace(context.getRuntime(), level); + } + + @JRubyMethod(name = "catch", required = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject rbCatch(ThreadContext context, IRubyObject recv, IRubyObject tag, Block block) { + CatchTarget target = new CatchTarget(tag.asJavaString()); + try { + context.pushCatch(target); + return block.yield(context, tag); + } catch (JumpException.ThrowJump tj) { + if (tj.getTarget() == target) return (IRubyObject) tj.getValue(); + + throw tj; + } finally { + context.popCatch(); + } + } + + public static class CatchTarget implements JumpTarget { + private final String tag; + public CatchTarget(String tag) { this.tag = tag; } + public String getTag() { return tag; } + } + + @JRubyMethod(name = "throw", required = 1, frame = true, optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject rbThrow(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = context.getRuntime(); + + String tag = args[0].asJavaString(); + CatchTarget[] catches = context.getActiveCatches(); + + String message = "uncaught throw `" + tag + "'"; + + // Ordering of array traversal not important, just intuitive + for (int i = catches.length - 1 ; i >= 0 ; i--) { + if (tag.equals(catches[i].getTag())) { + //Catch active, throw for catch to handle + throw new JumpException.ThrowJump(catches[i], args.length > 1 ? args[1] : runtime.getNil()); + } + } + + // No catch active for this throw + RubyThread currentThread = context.getThread(); + if (currentThread == runtime.getThreadService().getMainThread()) { + throw runtime.newNameError(message, tag); + } else { + throw runtime.newThreadError(message + " in thread 0x" + Integer.toHexString(RubyInteger.fix2int(currentThread.id()))); + } + } + + @JRubyMethod(name = "trap", required = 1, frame = true, optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject trap(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + context.getRuntime().getLoadService().require("jsignal"); + return RuntimeHelpers.invoke(context, recv, "__jtrap", args, block); + } + + @JRubyMethod(name = "warn", required = 1, module = true, visibility = PRIVATE) + public static IRubyObject warn(ThreadContext context, IRubyObject recv, IRubyObject message) { + Ruby runtime = context.getRuntime(); + + if (!runtime.getVerbose().isNil()) { + IRubyObject out = runtime.getGlobalVariables().get("$stderr"); + RuntimeHelpers.invoke(context, out, "puts", message); + } + return runtime.getNil(); + } + + @JRubyMethod(name = "set_trace_func", required = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject set_trace_func(ThreadContext context, IRubyObject recv, IRubyObject trace_func, Block block) { + if (trace_func.isNil()) { + context.getRuntime().setTraceFunction(null); + } else if (!(trace_func instanceof RubyProc)) { + throw context.getRuntime().newTypeError("trace_func needs to be Proc."); + } else { + context.getRuntime().setTraceFunction((RubyProc) trace_func); + } + return trace_func; + } + + @JRubyMethod(name = "trace_var", required = 1, optional = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject trace_var(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + if (args.length == 0) throw context.getRuntime().newArgumentError(0, 1); + RubyProc proc = null; + String var = args.length > 1 ? args[0].toString() : null; + // ignore if it's not a global var + if (var.charAt(0) != '$') return context.getRuntime().getNil(); + if (args.length == 1) proc = RubyProc.newProc(context.getRuntime(), block, Block.Type.PROC); + if (args.length == 2) { + proc = (RubyProc)TypeConverter.convertToType(args[1], context.getRuntime().getProc(), 0, "to_proc", true); + } + + context.getRuntime().getGlobalVariables().setTraceVar(var, proc); + + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "untrace_var", required = 1, optional = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject untrace_var(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + if (args.length == 0) throw context.getRuntime().newArgumentError(0, 1); + String var = args.length >= 1 ? args[0].toString() : null; + + // ignore if it's not a global var + if (var.charAt(0) != '$') return context.getRuntime().getNil(); + + if (args.length > 1) { + ArrayList<IRubyObject> success = new ArrayList<IRubyObject>(); + for (int i = 1; i < args.length; i++) { + if (context.getRuntime().getGlobalVariables().untraceVar(var, args[i])) { + success.add(args[i]); + } + } + return RubyArray.newArray(context.getRuntime(), success); + } else { + context.getRuntime().getGlobalVariables().untraceVar(var); + } + + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "singleton_method_added", required = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject singleton_method_added(ThreadContext context, IRubyObject recv, IRubyObject symbolId, Block block) { + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "singleton_method_removed", required = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject singleton_method_removed(ThreadContext context, IRubyObject recv, IRubyObject symbolId, Block block) { + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "singleton_method_undefined", required = 1, frame = true, module = true, visibility = PRIVATE) + public static IRubyObject singleton_method_undefined(ThreadContext context, IRubyObject recv, IRubyObject symbolId, Block block) { + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = {"proc", "lambda"}, frame = true, module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_8) + public static RubyProc proc(ThreadContext context, IRubyObject recv, Block block) { + return context.getRuntime().newProc(Block.Type.LAMBDA, block); + } + + @Deprecated + public static RubyProc proc(IRubyObject recv, Block block) { + return recv.getRuntime().newProc(Block.Type.LAMBDA, block); + } + + @JRubyMethod(name = {"lambda"}, frame = true, module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_9) + public static RubyProc lambda(ThreadContext context, IRubyObject recv, Block block) { + return context.getRuntime().newProc(Block.Type.LAMBDA, block); + } + + @JRubyMethod(name = {"proc"}, frame = true, module = true, visibility = PRIVATE, compat = CompatVersion.RUBY1_9) + public static RubyProc proc_1_9(ThreadContext context, IRubyObject recv, Block block) { + return context.getRuntime().newProc(Block.Type.PROC, block); + } + + @JRubyMethod(name = "loop", frame = true, module = true, visibility = PRIVATE) + public static IRubyObject loop(ThreadContext context, IRubyObject recv, Block block) { + while (true) { + block.yield(context, context.getRuntime().getNil()); + + context.pollThreadEvents(); + } + } + + @JRubyMethod(name = "test", required = 2, optional = 1, module = true, visibility = PRIVATE) + public static IRubyObject test(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + if (args.length == 0) throw context.getRuntime().newArgumentError("wrong number of arguments"); + + int cmd; + if (args[0] instanceof RubyFixnum) { + cmd = (int)((RubyFixnum) args[0]).getLongValue(); + } else if (args[0] instanceof RubyString && + ((RubyString) args[0]).getByteList().length() > 0) { + // MRI behavior: use first byte of string value if len > 0 + cmd = ((RubyString) args[0]).getByteList().charAt(0); + } else { + cmd = (int) args[0].convertToInteger().getLongValue(); + } + + // MRI behavior: raise ArgumentError for 'unknown command' before + // checking number of args. + switch(cmd) { + case 'A': case 'b': case 'c': case 'C': case 'd': case 'e': case 'f': case 'g': case 'G': + case 'k': case 'M': case 'l': case 'o': case 'O': case 'p': case 'r': case 'R': case 's': + case 'S': case 'u': case 'w': case 'W': case 'x': case 'X': case 'z': case '=': case '<': + case '>': case '-': + break; + default: + throw context.getRuntime().newArgumentError("unknown command ?" + (char) cmd); + } + + // MRI behavior: now check arg count + + switch(cmd) { + case '-': case '=': case '<': case '>': + if (args.length != 3) throw context.getRuntime().newArgumentError(args.length, 3); + break; + default: + if (args.length != 2) throw context.getRuntime().newArgumentError(args.length, 2); + break; + } + + switch (cmd) { + case 'A': // ?A | Time | Last access time for file1 + return context.getRuntime().newFileStat(args[1].convertToString().toString(), false).atime(); + case 'b': // ?b | boolean | True if file1 is a block device + return RubyFileTest.blockdev_p(recv, args[1]); + case 'c': // ?c | boolean | True if file1 is a character device + return RubyFileTest.chardev_p(recv, args[1]); + case 'C': // ?C | Time | Last change time for file1 + return context.getRuntime().newFileStat(args[1].convertToString().toString(), false).ctime(); + case 'd': // ?d | boolean | True if file1 exists and is a directory + return RubyFileTest.directory_p(recv, args[1]); + case 'e': // ?e | boolean | True if file1 exists + return RubyFileTest.exist_p(recv, args[1]); + case 'f': // ?f | boolean | True if file1 exists and is a regular file + return RubyFileTest.file_p(recv, args[1]); + case 'g': // ?g | boolean | True if file1 has the \CF{setgid} bit + return RubyFileTest.setgid_p(recv, args[1]); + case 'G': // ?G | boolean | True if file1 exists and has a group ownership equal to the caller's group + return RubyFileTest.grpowned_p(recv, args[1]); + case 'k': // ?k | boolean | True if file1 exists and has the sticky bit set + return RubyFileTest.sticky_p(recv, args[1]); + case 'M': // ?M | Time | Last modification time for file1 + return context.getRuntime().newFileStat(args[1].convertToString().toString(), false).mtime(); + case 'l': // ?l | boolean | True if file1 exists and is a symbolic link + return RubyFileTest.symlink_p(recv, args[1]); + case 'o': // ?o | boolean | True if file1 exists and is owned by the caller's effective uid + return RubyFileTest.owned_p(recv, args[1]); + case 'O': // ?O | boolean | True if file1 exists and is owned by the caller's real uid + return RubyFileTest.rowned_p(recv, args[1]); + case 'p': // ?p | boolean | True if file1 exists and is a fifo + return RubyFileTest.pipe_p(recv, args[1]); + case 'r': // ?r | boolean | True if file1 is readable by the effective uid/gid of the caller + return RubyFileTest.readable_p(recv, args[1]); + case 'R': // ?R | boolean | True if file is readable by the real uid/gid of the caller + // FIXME: Need to implement an readable_real_p in FileTest + return RubyFileTest.readable_p(recv, args[1]); + case 's': // ?s | int/nil | If file1 has nonzero size, return the size, otherwise nil + return RubyFileTest.size_p(recv, args[1]); + case 'S': // ?S | boolean | True if file1 exists and is a socket + return RubyFileTest.socket_p(recv, args[1]); + case 'u': // ?u | boolean | True if file1 has the setuid bit set + return RubyFileTest.setuid_p(recv, args[1]); + case 'w': // ?w | boolean | True if file1 exists and is writable by effective uid/gid + return RubyFileTest.writable_p(recv, args[1]); + case 'W': // ?W | boolean | True if file1 exists and is writable by the real uid/gid + // FIXME: Need to implement an writable_real_p in FileTest + return RubyFileTest.writable_p(recv, args[1]); + case 'x': // ?x | boolean | True if file1 exists and is executable by the effective uid/gid + return RubyFileTest.executable_p(recv, args[1]); + case 'X': // ?X | boolean | True if file1 exists and is executable by the real uid/gid + return RubyFileTest.executable_real_p(recv, args[1]); + case 'z': // ?z | boolean | True if file1 exists and has a zero length + return RubyFileTest.zero_p(recv, args[1]); + case '=': // ?= | boolean | True if the modification times of file1 and file2 are equal + return context.getRuntime().newFileStat(args[1].convertToString().toString(), false).mtimeEquals(args[2]); + case '<': // ?< | boolean | True if the modification time of file1 is prior to that of file2 + return context.getRuntime().newFileStat(args[1].convertToString().toString(), false).mtimeLessThan(args[2]); + case '>': // ?> | boolean | True if the modification time of file1 is after that of file2 + return context.getRuntime().newFileStat(args[1].convertToString().toString(), false).mtimeGreaterThan(args[2]); + case '-': // ?- | boolean | True if file1 and file2 are identical + return RubyFileTest.identical_p(recv, args[1], args[2]); + default: + throw new InternalError("unreachable code reached!"); + } + } + + @JRubyMethod(name = "`", required = 1, module = true, visibility = PRIVATE) + public static IRubyObject backquote(ThreadContext context, IRubyObject recv, IRubyObject aString) { + Ruby runtime = context.getRuntime(); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + + RubyString string = aString.convertToString(); + int resultCode = ShellLauncher.runAndWait(runtime, new IRubyObject[] {string}, output); + + runtime.getGlobalVariables().set("$?", RubyProcess.RubyStatus.newProcessStatus(runtime, resultCode)); + + return RubyString.newString(runtime, output.toByteArray()); + } + + @JRubyMethod(name = "srand", optional = 1, module = true, visibility = PRIVATE) + public static RubyInteger srand(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + long oldRandomSeed = runtime.getRandomSeed(); + + if (args.length > 0) { + RubyInteger integerSeed = args[0].convertToInteger(MethodIndex.TO_INT, "to_int"); + runtime.setRandomSeed(integerSeed.getLongValue()); + } else { + // Not sure how well this works, but it works much better than + // just currentTimeMillis by itself. + runtime.setRandomSeed(System.currentTimeMillis() ^ + recv.hashCode() ^ runtime.incrementRandomSeedSequence() ^ + runtime.getRandom().nextInt(Math.max(1, Math.abs((int)runtime.getRandomSeed())))); + } + runtime.getRandom().setSeed(runtime.getRandomSeed()); + return runtime.newFixnum(oldRandomSeed); + } + + @JRubyMethod(name = "rand", optional = 1, module = true, visibility = PRIVATE) + public static RubyNumeric rand(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + long ceil; + if (args.length == 0) { + ceil = 0; + } else if (args.length == 1) { + if (args[0] instanceof RubyBignum) { + byte[] bigCeilBytes = ((RubyBignum) args[0]).getValue().toByteArray(); + BigInteger bigCeil = new BigInteger(bigCeilBytes).abs(); + + byte[] randBytes = new byte[bigCeilBytes.length]; + runtime.getRandom().nextBytes(randBytes); + + BigInteger result = new BigInteger(randBytes).abs().mod(bigCeil); + + return new RubyBignum(runtime, result); + } + + RubyInteger integerCeil = (RubyInteger)RubyKernel.new_integer(context, recv, args[0]); + ceil = Math.abs(integerCeil.getLongValue()); + } else { + throw runtime.newArgumentError("wrong # of arguments(" + args.length + " for 1)"); + } + + if (ceil == 0) { + return RubyFloat.newFloat(runtime, runtime.getRandom().nextDouble()); + } + if (ceil > Integer.MAX_VALUE) { + return runtime.newFixnum(Math.abs(runtime.getRandom().nextLong()) % ceil); + } + + return runtime.newFixnum(runtime.getRandom().nextInt((int) ceil)); + } + + @JRubyMethod(name = "syscall", required = 1, optional = 9, module = true, visibility = PRIVATE) + public static IRubyObject syscall(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + throw context.getRuntime().newNotImplementedError("Kernel#syscall is not implemented in JRuby"); + } + + @JRubyMethod(name = {"system"}, required = 1, rest = true, module = true, visibility = PRIVATE) + public static RubyBoolean system(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + int resultCode; + try { + resultCode = ShellLauncher.runAndWait(runtime, args); + } catch (Exception e) { + resultCode = 127; + } + runtime.getGlobalVariables().set("$?", RubyProcess.RubyStatus.newProcessStatus(runtime, resultCode)); + return runtime.newBoolean(resultCode == 0); + } + + @JRubyMethod(name = {"exec"}, required = 1, rest = true, module = true, visibility = PRIVATE) + public static IRubyObject exec(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + int resultCode; + try { + // TODO: exec should replace the current process. + // This could be possible with JNA. + resultCode = ShellLauncher.execAndWait(runtime, args); + } catch (Exception e) { + throw runtime.newErrnoENOENTError("cannot execute"); + } + + return exit(recv, new IRubyObject[] {runtime.newFixnum(resultCode)}); + } + + @JRubyMethod(name = "fork", module = true, visibility = PRIVATE) + public static IRubyObject fork(ThreadContext context, IRubyObject recv, Block block) { + Ruby runtime = context.getRuntime(); + + if (!RubyInstanceConfig.FORK_ENABLED) { + throw runtime.newNotImplementedError("fork is unsafe and disabled by default on JRuby"); + } + + if (block.isGiven()) { + int pid = runtime.getPosix().fork(); + + if (pid == 0) { + try { + block.yield(context, runtime.getNil()); + } catch (RaiseException re) { + if (re.getException() instanceof RubySystemExit) { + throw re; + } + return exit_bang(recv, new IRubyObject[] {RubyFixnum.minus_one(runtime)}); + } catch (Throwable t) { + return exit_bang(recv, new IRubyObject[] {RubyFixnum.minus_one(runtime)}); + } + return exit_bang(recv, new IRubyObject[] {RubyFixnum.zero(runtime)}); + } else { + return runtime.newFixnum(pid); + } + } else { + int result = runtime.getPosix().fork(); + + if (result == -1) { + return runtime.getNil(); + } + + return runtime.newFixnum(result); + } + } + + @JRubyMethod(frame = true, module = true) + public static IRubyObject tap(ThreadContext context, IRubyObject recv, Block block) { + block.yield(context, recv); + return recv; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Charles O Nutter <headius@headius.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ + +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.builtin.IRubyObject; + +@JRubyClass(name="LocalJumpError",parent="StandardError") +public class RubyLocalJumpError extends RubyException { + private static ObjectAllocator LOCALJUMPERROR_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyLocalJumpError(runtime, klass); + } + }; + + public static RubyClass createLocalJumpErrorClass(Ruby runtime, RubyClass standardErrorClass) { + RubyClass nameErrorClass = runtime.defineClass("LocalJumpError", standardErrorClass, LOCALJUMPERROR_ALLOCATOR); + + nameErrorClass.defineAnnotatedMethods(RubyLocalJumpError.class); + + return nameErrorClass; + } + + private RubyLocalJumpError(Ruby runtime, RubyClass exceptionClass) { + super(runtime, exceptionClass); + } + + public RubyLocalJumpError(Ruby runtime, RubyClass exceptionClass, String message, String reason, IRubyObject exitValue) { + super(runtime, exceptionClass, message); + fastSetInternalVariable("reason", runtime.newSymbol(reason)); + fastSetInternalVariable("exit_value", exitValue); + } + + @JRubyMethod(name = "reason") + public IRubyObject reason() { + return fastGetInternalVariable("reason"); + } + + @JRubyMethod(name = "exit_value") + public IRubyObject exit_value() { + return fastGetInternalVariable("exit_value"); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2007 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2003 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; + +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Block; +import org.jruby.runtime.Constants; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; + +import org.jruby.util.ByteList; +import org.jruby.util.IOInputStream; +import org.jruby.util.IOOutputStream; + +/** + * Marshal module + * + * @author Anders + */ +@JRubyModule(name="Marshal") +public class RubyMarshal { + + public static RubyModule createMarshalModule(Ruby runtime) { + RubyModule module = runtime.defineModule("Marshal"); + runtime.setMarshal(module); + + module.defineAnnotatedMethods(RubyMarshal.class); + module.defineConstant("MAJOR_VERSION", runtime.newFixnum(Constants.MARSHAL_MAJOR)); + module.defineConstant("MINOR_VERSION", runtime.newFixnum(Constants.MARSHAL_MINOR)); + + return module; + } + + @JRubyMethod(name = "dump", required = 1, optional = 2, frame = true, module = true) + public static IRubyObject dump(IRubyObject recv, IRubyObject[] args, Block unusedBlock) { + if (args.length < 1) { + throw recv.getRuntime().newArgumentError("wrong # of arguments(at least 1)"); + } + IRubyObject objectToDump = args[0]; + + IRubyObject io = null; + int depthLimit = -1; + + if (args.length >= 2) { + if (args[1].respondsTo("write")) { + io = args[1]; + } else if (args[1] instanceof RubyFixnum) { + depthLimit = (int) ((RubyFixnum) args[1]).getLongValue(); + } else { + throw recv.getRuntime().newTypeError("Instance of IO needed"); + } + if (args.length == 3) { + depthLimit = (int) ((RubyFixnum) args[2]).getLongValue(); + } + } + + try { + if (io != null) { + dumpToStream(objectToDump, outputStream(io), depthLimit); + return io; + } + ByteArrayOutputStream stringOutput = new ByteArrayOutputStream(); + dumpToStream(objectToDump, stringOutput, depthLimit); + + return RubyString.newString(recv.getRuntime(), new ByteList(stringOutput.toByteArray(),false)); + + } catch (IOException ioe) { + throw recv.getRuntime().newIOErrorFromException(ioe); + } + + } + + private static OutputStream outputStream(IRubyObject out) { + setBinmodeIfPossible(out); + if (out instanceof RubyIO) { + return ((RubyIO) out).getOutStream(); + } + return new IOOutputStream(out); + } + + private static void setBinmodeIfPossible(IRubyObject io) { + if (io.respondsTo("binmode")) { + io.callMethod(io.getRuntime().getCurrentContext(), "binmode"); + } + } + + @JRubyMethod(name = {"load", "restore"}, required = 1, optional = 1, frame = true, module = true) + public static IRubyObject load(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block unusedBlock) { + try { + if (args.length < 1) { + throw recv.getRuntime().newArgumentError("wrong number of arguments (0 for 1)"); + } + + if (args.length > 2) { + throw recv.getRuntime().newArgumentError("wrong number of arguments (" + args.length + " for 2)"); + } + + IRubyObject in = null; + IRubyObject proc = null; + + switch (args.length) { + case 2: + proc = args[1]; + case 1: + in = args[0]; + } + + InputStream rawInput; + if (in != null && in.respondsTo("read")) { + rawInput = inputStream(in); + } else if (in != null && in.respondsTo("to_str")) { + RubyString inString = (RubyString) RuntimeHelpers.invoke(context, in, "to_str"); + ByteList bytes = inString.getByteList(); + rawInput = new ByteArrayInputStream(bytes.unsafeBytes(), bytes.begin(), bytes.length()); + } else { + throw recv.getRuntime().newTypeError("instance of IO needed"); + } + + UnmarshalStream input = new UnmarshalStream(recv.getRuntime(), rawInput, proc); + + return input.unmarshalObject(); + + } catch (EOFException ee) { + throw recv.getRuntime().newEOFError(); + } catch (IOException ioe) { + throw recv.getRuntime().newIOErrorFromException(ioe); + } + } + + private static InputStream inputStream(IRubyObject in) { + setBinmodeIfPossible(in); + if (in instanceof RubyIO) { + return ((RubyIO) in).getInStream(); + } + return new IOInputStream(in); + } + + private static void dumpToStream(IRubyObject object, OutputStream rawOutput, int depthLimit) + throws IOException + { + MarshalStream output = new MarshalStream(object.getRuntime(), rawOutput, depthLimit); + output.dumpObject(object); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.util.Iterator; + +import org.joni.NameEntry; +import org.joni.Regex; +import org.joni.Region; +import org.joni.exception.JOniException; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; + +/** + * @author olabini + */ +@JRubyClass(name="MatchData") +public class RubyMatchData extends RubyObject { + Region regs; // captures + int begin; // begin and end are used when not groups defined + int end; + RubyString str; + Regex pattern; + + public static RubyClass createMatchDataClass(Ruby runtime) { + // TODO: Is NOT_ALLOCATABLE_ALLOCATOR ok here, since you can't actually instantiate MatchData directly? + RubyClass matchDataClass = runtime.defineClass("MatchData", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setMatchData(matchDataClass); + runtime.defineGlobalConstant("MatchingData", matchDataClass); + matchDataClass.kindOf = new RubyModule.KindOf() { + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyMatchData; + } + }; + + matchDataClass.getMetaClass().undefineMethod("new"); + + matchDataClass.defineAnnotatedMethods(RubyMatchData.class); + + return matchDataClass; + } + + public RubyMatchData(Ruby runtime) { + super(runtime, runtime.getMatchData()); + } + + public final static int MATCH_BUSY = USER2_F; + + // rb_match_busy + public final void use() { + flags |= MATCH_BUSY; + } + + public final boolean used() { + return (flags & MATCH_BUSY) != 0; + } + + private RubyArray match_array(Ruby runtime, int start) { + if (regs == null) { + if (start != 0) return runtime.newEmptyArray(); + if (begin == -1) { + return getRuntime().newArray(runtime.getNil()); + } else { + RubyString ss = str.makeShared(runtime, begin, end - begin); + if (isTaint()) ss.setTaint(true); + return getRuntime().newArray(ss); + } + } else { + RubyArray arr = getRuntime().newArray(regs.numRegs - start); + for (int i=start; i<regs.numRegs; i++) { + if (regs.beg[i] == -1) { + arr.append(getRuntime().getNil()); + } else { + RubyString ss = str.makeShared(runtime, regs.beg[i], regs.end[i] - regs.beg[i]); + if (isTaint()) ss.setTaint(true); + arr.append(ss); + } + } + return arr; + } + + } + + public IRubyObject group(long n) { + return RubyRegexp.nth_match((int)n, this); + } + + public IRubyObject group(int n) { + return RubyRegexp.nth_match(n, this); + } + + @JRubyMethod(name = "inspect") + public IRubyObject inspect() { + if (pattern == null) return anyToString(); + + RubyString result = getRuntime().newString(); + result.cat((byte)'#').cat((byte)'<'); + result.append(getMetaClass().getRealClass().to_s()); + + NameEntry[]names = new NameEntry[regs == null ? 1 : regs.numRegs]; + + if (pattern.numberOfNames() > 0) { + for (Iterator<NameEntry> i = pattern.namedBackrefIterator(); i.hasNext();) { + NameEntry e = i.next(); + for (int num : e.getBackRefs()) names[num] = e; + } + } + + for (int i=0; i<names.length; i++) { + result.cat((byte)' '); + if (i > 0) { + NameEntry e = names[i]; + if (e != null) { + result.cat(e.name, e.nameP, e.nameEnd - e.nameP); + } else { + result.cat((byte)('0' + i)); + } + result.cat((byte)':'); + } + IRubyObject v = RubyRegexp.nth_match(i, this); + if (v.isNil()) { + result.cat("nil".getBytes()); + } else { + result.append(v.inspect()); + } + } + + return result.cat((byte)'>'); + } + + /** match_to_a + * + */ + @JRubyMethod(name = "to_a") + @Override + public RubyArray to_a() { + return match_array(getRuntime(), 0); + } + + @JRubyMethod(name = "values_at", required = 1, rest = true) + public IRubyObject values_at(IRubyObject[] args) { + return to_a().values_at(args); + } + + @JRubyMethod(name = "select", frame = true) + public IRubyObject select(ThreadContext context, Block block) { + return block.yield(context, to_a()); + } + + /** match_captures + * + */ + @JRubyMethod(name = "captures") + public IRubyObject captures(ThreadContext context) { + return match_array(context.getRuntime(), 1); + } + + private int nameToBackrefNumber(RubyString str) { + ByteList value = str.getByteList(); + try { + return pattern.nameToBackrefNumber(value.bytes, value.begin, value.begin + value.realSize, regs); + } catch (JOniException je) { + throw getRuntime().newIndexError(je.getMessage()); + } + } + + final int backrefNumber(IRubyObject obj) { + if (obj instanceof RubySymbol) { + return nameToBackrefNumber((RubyString)((RubySymbol)obj).id2name()); + } else if (obj instanceof RubyString) { + return nameToBackrefNumber((RubyString)obj); + } else { + return RubyNumeric.num2int(obj); + } + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public IRubyObject op_aref(IRubyObject[] args) { + switch (args.length) { + case 1: + return op_aref(args[0]); + case 2: + return op_aref(args[0], args[1]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** match_aref + * + */ + @JRubyMethod(name = "[]") + public IRubyObject op_aref(IRubyObject idx) { + IRubyObject result = op_arefCommon(idx); + return result == null ? ((RubyArray)to_a()).aref(idx) : result; + } + + /** match_aref + * + */ + @JRubyMethod(name = "[]") + public IRubyObject op_aref(IRubyObject idx, IRubyObject rest) { + IRubyObject result; + return !rest.isNil() || (result = op_arefCommon(idx)) == null ? ((RubyArray)to_a()).aref(idx, rest) : result; + } + + private IRubyObject op_arefCommon(IRubyObject idx) { + if (idx instanceof RubyFixnum) { + int num = RubyNumeric.fix2int(idx); + if (num >= 0) return RubyRegexp.nth_match(num, this); + } else { + if (idx instanceof RubySymbol) { + return RubyRegexp.nth_match(nameToBackrefNumber((RubyString)((RubySymbol)idx).id2name()), this); + } else if (idx instanceof RubyString) { + return RubyRegexp.nth_match(nameToBackrefNumber((RubyString)idx), this); + } + } + return null; + } + + /** match_size + * + */ + @JRubyMethod(name = {"size", "length"}) + public IRubyObject size() { + return regs == null ? RubyFixnum.one(getRuntime()) : RubyFixnum.newFixnum(getRuntime(), regs.numRegs); + } + + /** match_begin + * + */ + @JRubyMethod(name = "begin", required = 1) + public IRubyObject begin(IRubyObject index) { + int i = backrefNumber(index); + + if (regs == null) { + if (i != 0) throw getRuntime().newIndexError("index " + i + " out of matches"); + if (begin < 0) return getRuntime().getNil(); + return RubyFixnum.newFixnum(getRuntime(), begin); + } else { + if (i < 0 || regs.numRegs <= i) throw getRuntime().newIndexError("index " + i + " out of matches"); + if (regs.beg[i] < 0) return getRuntime().getNil(); + return RubyFixnum.newFixnum(getRuntime(), regs.beg[i]); + } + } + + /** match_end + * + */ + @JRubyMethod(name = "end", required = 1) + public IRubyObject end(IRubyObject index) { + int i = backrefNumber(index); + + if (regs == null) { + if (i != 0) throw getRuntime().newIndexError("index " + i + " out of matches"); + if (end < 0) return getRuntime().getNil(); + return RubyFixnum.newFixnum(getRuntime(), end); + } else { + if (i < 0 || regs.numRegs <= i) throw getRuntime().newIndexError("index " + i + " out of matches"); + if (regs.end[i] < 0) return getRuntime().getNil(); + return RubyFixnum.newFixnum(getRuntime(), regs.end[i]); + } + } + + /** match_offset + * + */ + @JRubyMethod(name = "offset", required = 1) + public IRubyObject offset(IRubyObject index) { + int i = backrefNumber(index); + Ruby runtime = getRuntime(); + + if (regs == null) { + if (i != 0) throw getRuntime().newIndexError("index " + i + " out of matches"); + if (begin < 0) return runtime.newArray(runtime.getNil(), runtime.getNil()); + return runtime.newArray(RubyFixnum.newFixnum(runtime, begin),RubyFixnum.newFixnum(runtime, end)); + } else { + if (i < 0 || regs.numRegs <= i) throw runtime.newIndexError("index " + i + " out of matches"); + if (regs.beg[i] < 0) return runtime.newArray(runtime.getNil(), runtime.getNil()); + return runtime.newArray(RubyFixnum.newFixnum(runtime, regs.beg[i]),RubyFixnum.newFixnum(runtime, regs.end[i])); + } + } + + /** match_pre_match + * + */ + @JRubyMethod(name = "pre_match") + public IRubyObject pre_match(ThreadContext context) { + RubyString ss; + + if (regs == null) { + if(begin == -1) return context.getRuntime().getNil(); + ss = str.makeShared(context.getRuntime(), 0, begin); + } else { + if(regs.beg[0] == -1) return context.getRuntime().getNil(); + ss = str.makeShared(context.getRuntime(), 0, regs.beg[0]); + } + + if (isTaint()) ss.setTaint(true); + return ss; + } + + /** match_post_match + * + */ + @JRubyMethod(name = "post_match") + public IRubyObject post_match(ThreadContext context) { + RubyString ss; + + if (regs == null) { + if (begin == -1) return context.getRuntime().getNil(); + ss = str.makeShared(context.getRuntime(), end, str.getByteList().length() - end); + } else { + if (regs.beg[0] == -1) return context.getRuntime().getNil(); + ss = str.makeShared(context.getRuntime(), regs.end[0], str.getByteList().length() - regs.end[0]); + } + + if(isTaint()) ss.setTaint(true); + return ss; + } + + /** match_to_s + * + */ + @JRubyMethod(name = "to_s") + public IRubyObject to_s() { + IRubyObject ss = RubyRegexp.last_match(this); + if (ss.isNil()) ss = RubyString.newEmptyString(getRuntime()); + if (isTaint()) ss.setTaint(true); + return ss; + } + + /** match_string + * + */ + @JRubyMethod(name = "string") + public IRubyObject string() { + return str; //str is frozen + } + + @JRubyMethod(name = "initialize_copy", required = 1) + public IRubyObject initialize_copy(IRubyObject original) { + if (this == original) return this; + + if (!(getMetaClass() == original.getMetaClass())){ // MRI also does a pointer comparison here + throw getRuntime().newTypeError("wrong argument class"); + } + + RubyMatchData origMatchData = (RubyMatchData)original; + str = origMatchData.str; + regs = origMatchData.regs; + + return this; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001-2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +@JRubyModule(name="Math") +public class RubyMath { + /** Create the Math module and add it to the Ruby runtime. + * + */ + public static RubyModule createMathModule(Ruby runtime) { + RubyModule result = runtime.defineModule("Math"); + runtime.setMath(result); + + result.defineConstant("E", RubyFloat.newFloat(runtime, Math.E)); + result.defineConstant("PI", RubyFloat.newFloat(runtime, Math.PI)); + + result.defineAnnotatedMethods(RubyMath.class); + + return result; + } + + + private static void domainCheck(IRubyObject recv, double value, String msg) { + if (Double.isNaN(value)) { + throw recv.getRuntime().newErrnoEDOMError(msg); + } + } + + private static double chebylevSerie(double x, double coef[]) { + double b0, b1, b2, twox; + int i; + b1 = 0.0; + b0 = 0.0; + b2 = 0.0; + twox = 2.0 * x; + for (i = coef.length-1; i >= 0; i--) { + b2 = b1; + b1 = b0; + b0 = twox * b1 - b2 + coef[i]; + } + return 0.5*(b0 - b2); + } + + private static double sign(double x, double y) { + double abs = ((x < 0) ? -x : x); + return (y < 0.0) ? -abs : abs; + } + + @JRubyMethod(name = "atan2", required = 2, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat atan2(IRubyObject recv, IRubyObject x, IRubyObject y) { + double valuea = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double valueb = ((RubyFloat)RubyKernel.new_float(recv,y)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(), Math.atan2(valuea, valueb)); + } + + @JRubyMethod(name = "cos", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat cos(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(),Math.cos(value)); + } + + @JRubyMethod(name = "sin", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat sin(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(),Math.sin(value)); + } + + @JRubyMethod(name = "tan", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat tan(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(),Math.tan(value)); + } + + @JRubyMethod(name = "asin", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat asin(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double result = Math.asin(value); + domainCheck(recv, result, "asin"); + return RubyFloat.newFloat(recv.getRuntime(),result); + } + + @JRubyMethod(name = "acos", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat acos(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double result = Math.acos(value); + domainCheck(recv, result, "acos"); + return RubyFloat.newFloat(recv.getRuntime(), result); + } + + @JRubyMethod(name = "atan", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat atan(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(),Math.atan(value)); + } + + @JRubyMethod(name = "cosh", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat cosh(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(),(Math.exp(value) + Math.exp(-value)) / 2.0); + } + + @JRubyMethod(name = "sinh", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat sinh(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(),(Math.exp(value) - Math.exp(-value)) / 2.0); + } + + @JRubyMethod(name = "tanh", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat tanh(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(), Math.tanh(value)); + } + + @JRubyMethod(name = "acosh", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat acosh(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double result; + if (Double.isNaN(value) || value < 1) { + result = Double.NaN; + } else if (value < 94906265.62) { + result = Math.log(value + Math.sqrt(value * value - 1.0)); + } else{ + result = 0.69314718055994530941723212145818 + Math.log(value); + } + + domainCheck(recv, result, "acosh"); + + return RubyFloat.newFloat(recv.getRuntime(),result); + } + + private static final double ASINH_COEF[] = { + -.12820039911738186343372127359268e+0, + -.58811761189951767565211757138362e-1, + .47274654322124815640725249756029e-2, + -.49383631626536172101360174790273e-3, + .58506207058557412287494835259321e-4, + -.74669983289313681354755069217188e-5, + .10011693583558199265966192015812e-5, + -.13903543858708333608616472258886e-6, + .19823169483172793547317360237148e-7, + -.28847468417848843612747272800317e-8, + .42672965467159937953457514995907e-9, + -.63976084654366357868752632309681e-10, + .96991686089064704147878293131179e-11, + -.14844276972043770830246658365696e-11, + .22903737939027447988040184378983e-12, + -.35588395132732645159978942651310e-13, + .55639694080056789953374539088554e-14, + -.87462509599624678045666593520162e-15, + .13815248844526692155868802298129e-15, + -.21916688282900363984955142264149e-16, + .34904658524827565638313923706880e-17 + }; + + @JRubyMethod(name = "asinh", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat asinh(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double y = Math.abs(value); + double result; + + if (Double.isNaN(value)) { + result = Double.NaN; + } else if (y <= 1.05367e-08) { + result = value; + } else if (y <= 1.0) { + result = value * (1.0 + chebylevSerie(2.0 * value * value - 1.0, ASINH_COEF)); + } else if (y < 94906265.62) { + result = Math.log(value + Math.sqrt(value * value + 1.0)); + } else { + result = 0.69314718055994530941723212145818 + Math.log(y); + if (value < 0) result *= -1; + } + + return RubyFloat.newFloat(recv.getRuntime(),result); + } + + private static final double ATANH_COEF[] = { + .9439510239319549230842892218633e-1, + .4919843705578615947200034576668e-1, + .2102593522455432763479327331752e-2, + .1073554449776116584640731045276e-3, + .5978267249293031478642787517872e-5, + .3505062030889134845966834886200e-6, + .2126374343765340350896219314431e-7, + .1321694535715527192129801723055e-8, + .8365875501178070364623604052959e-10, + .5370503749311002163881434587772e-11, + .3486659470157107922971245784290e-12, + .2284549509603433015524024119722e-13, + .1508407105944793044874229067558e-14, + .1002418816804109126136995722837e-15, + .6698674738165069539715526882986e-17, + .4497954546494931083083327624533e-18 + }; + + @JRubyMethod(name = "atanh", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat atanh(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double y = Math.abs(value); + double result; + + if (Double.isNaN(value)) { + result = Double.NaN; + } else if (y < 1.82501e-08) { + result = value; + } else if (y <= 0.5) { + result = value * (1.0 + chebylevSerie(8.0 * value * value - 1.0, ATANH_COEF)); + } else if (y < 1.0) { + result = 0.5 * Math.log((1.0 + value) / (1.0 - value)); + } else if (y == 1.0) { + result = value * Double.POSITIVE_INFINITY; + } else { + result = Double.NaN; + } + + domainCheck(recv, result, "atanh"); + return RubyFloat.newFloat(recv.getRuntime(),result); + } + + @JRubyMethod(name = "exp", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat exp(IRubyObject recv, IRubyObject exponent) { + double value = ((RubyFloat)RubyKernel.new_float(recv,exponent)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(),Math.exp(value)); + } + + /** Returns the natural logarithm of x. + * + */ + @JRubyMethod(name = "log", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat log(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double result = Math.log(value); + domainCheck(recv, result, "log"); + return RubyFloat.newFloat(recv.getRuntime(),result); + } + + /** Returns the base 10 logarithm of x. + * + */ + @JRubyMethod(name = "log10", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat log10(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double result = Math.log(value) / Math.log(10); + domainCheck(recv, result, "log10"); + return RubyFloat.newFloat(recv.getRuntime(),result); + } + + @JRubyMethod(name = "sqrt", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat sqrt(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double result; + + if (value < 0) { + result = Double.NaN; + } else{ + result = Math.sqrt(value); + } + + domainCheck(recv, result, "sqrt"); + return RubyFloat.newFloat(recv.getRuntime(), result); + } + + @JRubyMethod(name = "hypot", required = 2, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat hypot(IRubyObject recv, IRubyObject x, IRubyObject y) { + double valuea = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double valueb = ((RubyFloat)RubyKernel.new_float(recv,y)).getDoubleValue(); + double result; + + if (Math.abs(valuea) > Math.abs(valueb)) { + result = valueb / valuea; + result = Math.abs(valuea) * Math.sqrt(1 + result * result); + } else if (valueb != 0) { + result = valuea / valueb; + result = Math.abs(valueb) * Math.sqrt(1 + result * result); + } else { + result = 0; + } + return RubyFloat.newFloat(recv.getRuntime(),result); + } + + + /* + * x = mantissa * 2 ** exponent + * + * Where mantissa is in the range of [.5, 1) + * + */ + @JRubyMethod(name = "frexp", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyArray frexp(IRubyObject recv, IRubyObject other) { + double mantissa = ((RubyFloat)RubyKernel.new_float(recv,other)).getDoubleValue(); + short sign = 1; + long exponent = 0; + + if (mantissa != 0.0) { + // Make mantissa same sign so we only have one code path. + if (mantissa < 0) { + mantissa = -mantissa; + sign = -1; + } + + // Increase value to hit lower range. + for (; mantissa < 0.5; mantissa *= 2.0, exponent -=1) { } + + // Decrease value to hit upper range. + for (; mantissa >= 1.0; mantissa *= 0.5, exponent +=1) { } + } + + return RubyArray.newArray(recv.getRuntime(), + RubyFloat.newFloat(recv.getRuntime(), sign * mantissa), + RubyNumeric.int2fix(recv.getRuntime(), exponent)); + } + + /* + * r = x * 2 ** y + */ + @JRubyMethod(name = "ldexp", required = 2, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat ldexp(IRubyObject recv, IRubyObject mantissa, IRubyObject exponent) { + double mantissaValue = ((RubyFloat)RubyKernel.new_float(recv, mantissa)).getDoubleValue(); + return RubyFloat.newFloat(recv.getRuntime(),mantissaValue * Math.pow(2.0, RubyNumeric.num2int(exponent))); + } + + private static final double ERFC_COEF[] = { + -.490461212346918080399845440334e-1, + -.142261205103713642378247418996e0, + .100355821875997955757546767129e-1, + -.576876469976748476508270255092e-3, + .274199312521960610344221607915e-4, + -.110431755073445076041353812959e-5, + .384887554203450369499613114982e-7, + -.118085825338754669696317518016e-8, + .323342158260509096464029309534e-10, + -.799101594700454875816073747086e-12, + .179907251139614556119672454866e-13, + -.371863548781869263823168282095e-15, + .710359900371425297116899083947e-17, + -.126124551191552258324954248533e-18 + }; + + @JRubyMethod(name = "erf", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat erf(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + + double result; + double y = Math.abs(value); + + if (y <= 1.49012e-08) { + result = 2 * value / 1.77245385090551602729816748334; + } else if (y <= 1) { + result = value * (1 + chebylevSerie(2 * value * value - 1, ERFC_COEF)); + } else if (y < 6.013687357) { + result = sign(1 - erfc(recv, RubyFloat.newFloat(recv.getRuntime(),y)).getDoubleValue(), value); + } else { + result = sign(1, value); + } + return RubyFloat.newFloat(recv.getRuntime(),result); + } + + private static final double ERFC2_COEF[] = { + -.69601346602309501127391508262e-1, + -.411013393626208934898221208467e-1, + .391449586668962688156114370524e-2, + -.490639565054897916128093545077e-3, + .715747900137703638076089414183e-4, + -.115307163413123283380823284791e-4, + .199467059020199763505231486771e-5, + -.364266647159922287393611843071e-6, + .694437261000501258993127721463e-7, + -.137122090210436601953460514121e-7, + .278838966100713713196386034809e-8, + -.581416472433116155186479105032e-9, + .123892049175275318118016881795e-9, + -.269063914530674343239042493789e-10, + .594261435084791098244470968384e-11, + -.133238673575811957928775442057e-11, + .30280468061771320171736972433e-12, + -.696664881494103258879586758895e-13, + .162085454105392296981289322763e-13, + -.380993446525049199987691305773e-14, + .904048781597883114936897101298e-15, + -.2164006195089607347809812047e-15, + .522210223399585498460798024417e-16, + -.126972960236455533637241552778e-16, + .310914550427619758383622741295e-17, + -.766376292032038552400956671481e-18, + .190081925136274520253692973329e-18 + }; + + private static final double ERFCC_COEF[] = { + .715179310202924774503697709496e-1, + -.265324343376067157558893386681e-1, + .171115397792085588332699194606e-2, + -.163751663458517884163746404749e-3, + .198712935005520364995974806758e-4, + -.284371241276655508750175183152e-5, + .460616130896313036969379968464e-6, + -.822775302587920842057766536366e-7, + .159214187277090112989358340826e-7, + -.329507136225284321486631665072e-8, + .72234397604005554658126115389e-9, + -.166485581339872959344695966886e-9, + .401039258823766482077671768814e-10, + -.100481621442573113272170176283e-10, + .260827591330033380859341009439e-11, + -.699111056040402486557697812476e-12, + .192949233326170708624205749803e-12, + -.547013118875433106490125085271e-13, + .158966330976269744839084032762e-13, + -.47268939801975548392036958429e-14, + .14358733767849847867287399784e-14, + -.444951056181735839417250062829e-15, + .140481088476823343737305537466e-15, + -.451381838776421089625963281623e-16, + .147452154104513307787018713262e-16, + -.489262140694577615436841552532e-17, + .164761214141064673895301522827e-17, + -.562681717632940809299928521323e-18, + .194744338223207851429197867821e-18 + }; + + @JRubyMethod(name = "erfc", required = 1, module = true, visibility = Visibility.PRIVATE) + public static RubyFloat erfc(IRubyObject recv, IRubyObject x) { + double value = ((RubyFloat)RubyKernel.new_float(recv,x)).getDoubleValue(); + double result; + double y = Math.abs(value); + + if (value <= -6.013687357) { + result = 2; + } else if (y < 1.49012e-08) { + result = 1 - 2 * value / 1.77245385090551602729816748334; + } else { + double ysq = y*y; + if (y < 1) { + result = 1 - value * (1 + chebylevSerie(2 * ysq - 1, ERFC_COEF)); + } else if (y <= 4.0) { + result = Math.exp(-ysq)/y*(0.5+chebylevSerie((8.0 / ysq - 5.0) / 3.0, ERFC2_COEF)); + if (value < 0) result = 2.0 - result; + if (value < 0) result = 2.0 - result; + if (value < 0) result = 2.0 - result; + } else { + result = Math.exp(-ysq) / y * (0.5 + chebylevSerie(8.0 / ysq - 1, ERFCC_COEF)); + if (value < 0) result = 2.0 - result; + } + } + return RubyFloat.newFloat(recv.getRuntime(),result); + } + +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.exceptions.JumpException; +import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallbackFactory; +import org.jruby.runtime.MethodBlock; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * The RubyMethod class represents a RubyMethod object. + * + * You can get such a method by calling the "method" method of an object. + * + * Note: This was renamed from Method.java + * + * @author jpetersen + * @since 0.2.3 + */ +@JRubyClass(name="Method") +public class RubyMethod extends RubyObject { + protected RubyModule implementationModule; + protected String methodName; + protected RubyModule originModule; + protected String originName; + protected DynamicMethod method; + protected IRubyObject receiver; + + protected RubyMethod(Ruby runtime, RubyClass rubyClass) { + super(runtime, rubyClass); + } + + /** Create the RubyMethod class and add it to the Ruby runtime. + * + */ + public static RubyClass createMethodClass(Ruby runtime) { + // TODO: NOT_ALLOCATABLE_ALLOCATOR is probably ok here. Confirm. JRUBY-415 + RubyClass methodClass = runtime.defineClass("Method", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setMethod(methodClass); + + methodClass.defineAnnotatedMethods(RubyMethod.class); + + return methodClass; + } + + public static RubyMethod newMethod( + RubyModule implementationModule, + String methodName, + RubyModule originModule, + String originName, + DynamicMethod method, + IRubyObject receiver) { + Ruby runtime = implementationModule.getRuntime(); + RubyMethod newMethod = new RubyMethod(runtime, runtime.getMethod()); + + newMethod.implementationModule = implementationModule; + newMethod.methodName = methodName; + newMethod.originModule = originModule; + newMethod.originName = originName; + newMethod.method = method.getRealMethod(); + newMethod.receiver = receiver; + + return newMethod; + } + + /** Call the method. + * + */ + @JRubyMethod(name = {"call", "[]"}) + public IRubyObject call(ThreadContext context, Block block) { + return method.call(context, receiver, implementationModule, methodName, block); + } + @JRubyMethod(name = {"call", "[]"}) + public IRubyObject call(ThreadContext context, IRubyObject arg, Block block) { + return method.call(context, receiver, implementationModule, methodName, arg, block); + } + @JRubyMethod(name = {"call", "[]"}) + public IRubyObject call(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + return method.call(context, receiver, implementationModule, methodName, arg0, arg1, block); + } + @JRubyMethod(name = {"call", "[]"}) + public IRubyObject call(ThreadContext context, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) { + return method.call(context, receiver, implementationModule, methodName, arg0, arg1, arg2, block); + } + @JRubyMethod(name = {"call", "[]"}, rest = true) + public IRubyObject call(ThreadContext context, IRubyObject[] args, Block block) { + return method.call(context, receiver, implementationModule, methodName, args, block); + } + + /** Returns the number of arguments a method accepted. + * + * @return the number of arguments of a method. + */ + @JRubyMethod(name = "arity") + public RubyFixnum arity() { + return getRuntime().newFixnum(method.getArity().getValue()); + } + + @JRubyMethod(name = "==", required = 1) + @Override + public RubyBoolean op_equal(ThreadContext context, IRubyObject other) { + if (!(other instanceof RubyMethod)) return context.getRuntime().getFalse(); + RubyMethod otherMethod = (RubyMethod)other; + return context.getRuntime().newBoolean(implementationModule == otherMethod.implementationModule && + originModule == otherMethod.originModule && + receiver == otherMethod.receiver && + method.getRealMethod() == otherMethod.method.getRealMethod()); + } + + @JRubyMethod(name = "clone") + @Override + public RubyMethod rbClone() { + return newMethod(implementationModule, methodName, originModule, originName, method, receiver); + } + + /** Create a Proc object. + * + */ + @JRubyMethod(name = "to_proc", frame = true) + public IRubyObject to_proc(ThreadContext context, Block unusedBlock) { + Ruby runtime = context.getRuntime(); + CallbackFactory f = runtime.callbackFactory(RubyMethod.class); + Block block = MethodBlock.createMethodBlock(context, context.getCurrentScope(), + f.getBlockMethod("bmcall"), this, runtime.getTopSelf()); + + while (true) { + try { + // FIXME: We should not be regenerating this over and over + return mproc(context, block); + } catch (JumpException.BreakJump bj) { + return (IRubyObject) bj.getValue(); + } catch (JumpException.ReturnJump rj) { + return (IRubyObject) rj.getValue(); + } catch (JumpException.RetryJump rj) { + // Execute iterateMethod again. + } + } + } + + /** Create a Proc object which is called like a ruby method. + * + * Used by the RubyMethod#to_proc method. + * + */ + private IRubyObject mproc(ThreadContext context, Block block) { + try { + context.preMproc(); + + return RubyKernel.proc(context, context.getRuntime().getNil(), block); + } finally { + context.postMproc(); + } + } + + /** Delegate a block call to a bound method call. + * + * Used by the RubyMethod#to_proc method. + * + */ + public static IRubyObject bmcall(IRubyObject blockArg, IRubyObject arg1, + IRubyObject self, Block unusedBlock) { + ThreadContext context = blockArg.getRuntime().getCurrentContext(); + + if (blockArg instanceof RubyArray) { + // ENEBO: Very wrong + return ((RubyMethod) arg1).call(context, ((RubyArray) blockArg).toJavaArray(), Block.NULL_BLOCK); + } + // ENEBO: Very wrong + return ((RubyMethod) arg1).call(context, new IRubyObject[] { blockArg }, Block.NULL_BLOCK); + } + + @JRubyMethod(name = "unbind", frame = true) + public RubyUnboundMethod unbind(Block unusedBlock) { + RubyUnboundMethod unboundMethod = + RubyUnboundMethod.newUnboundMethod(implementationModule, methodName, originModule, originName, method); + unboundMethod.infectBy(this); + + return unboundMethod; + } + + @JRubyMethod(name = {"inspect", "to_s"}) + @Override + public IRubyObject inspect() { + StringBuilder buf = new StringBuilder("#<"); + char delimeter = '#'; + + buf.append(getMetaClass().getRealClass().getName()).append(": "); + + if (implementationModule.isSingleton()) { + IRubyObject attached = ((MetaClass) implementationModule).getAttached(); + if (receiver == null) { + buf.append(implementationModule.inspect().toString()); + } else if (receiver == attached) { + buf.append(attached.inspect().toString()); + delimeter = '.'; + } else { + buf.append(receiver.inspect().toString()); + buf.append('(').append(attached.inspect().toString()).append(')'); + delimeter = '.'; + } + } else { + buf.append(originModule.getName()); + + if (implementationModule != originModule) { + buf.append('(').append(implementationModule.getName()).append(')'); + } + } + + buf.append(delimeter).append(methodName).append('>'); + + RubyString str = getRuntime().newString(buf.toString()); + str.setTaint(isTaint()); + return str; + } +} + +/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006-2007 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantLock; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyConstant; +import org.jruby.anno.JavaMethodDescriptor; +import org.jruby.anno.TypePopulator; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.compiler.ASTInspector; +import org.jruby.internal.runtime.methods.AliasMethod; +import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.internal.runtime.methods.FullFunctionCallbackMethod; +import org.jruby.internal.runtime.methods.SimpleCallbackMethod; +import org.jruby.internal.runtime.methods.MethodMethod; +import org.jruby.internal.runtime.methods.ProcMethod; +import org.jruby.internal.runtime.methods.UndefinedMethod; +import org.jruby.internal.runtime.methods.WrapperMethod; +import org.jruby.parser.StaticScope; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.CacheMap; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import static org.jruby.runtime.Visibility.*; +import static org.jruby.anno.FrameField.*; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.builtin.Variable; +import org.jruby.runtime.callback.Callback; +import org.jruby.runtime.component.VariableEntry; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.ClassProvider; +import org.jruby.util.IdUtil; +import org.jruby.exceptions.RaiseException; +import org.jruby.internal.runtime.methods.JavaMethod; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.MethodFactory; +import org.jruby.runtime.MethodIndex; + +/** + * + * @author jpetersen + */ +@JRubyClass(name="Module") +public class RubyModule extends RubyObject { + private static final boolean DEBUG = false; + + public static RubyClass createModuleClass(Ruby runtime, RubyClass moduleClass) { + moduleClass.index = ClassIndex.MODULE; + moduleClass.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyModule; + } + }; + + moduleClass.defineAnnotatedMethods(RubyModule.class); + moduleClass.defineAnnotatedMethods(ModuleKernelMethods.class); + + return moduleClass; + } + + public static class ModuleKernelMethods { + @JRubyMethod + public static IRubyObject autoload(IRubyObject recv, IRubyObject arg0, IRubyObject arg1) { + return RubyKernel.autoload(recv, arg0, arg1); + } + + @JRubyMethod(name = "autoload?") + public static IRubyObject autoload_p(ThreadContext context, IRubyObject recv, IRubyObject arg0) { + return RubyKernel.autoload_p(context, recv, arg0); + } + } + + static ObjectAllocator MODULE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyModule(runtime, klass); + } + }; + + @Override + public int getNativeTypeIndex() { + return ClassIndex.MODULE; + } + + @Override + public boolean isModule() { + return true; + } + + @Override + public boolean isClass() { + return false; + } + + public boolean isSingleton() { + return false; + } + + // superClass may be null. + protected RubyClass superClass; + + public int index; + + public static class KindOf { + public static final KindOf DEFAULT_KIND_OF = new KindOf(); + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj.getMetaClass().hasModuleInHierarchy(type); + } + } + + public boolean isInstance(IRubyObject object) { + return kindOf.isKindOf(object, this); + } + + public KindOf kindOf = KindOf.DEFAULT_KIND_OF; + + public final int id; + + // Containing class...The parent of Object is null. Object should always be last in chain. + public RubyModule parent; + + // ClassId is the name of the class/module sans where it is located. + // If it is null, then it an anonymous class. + protected String classId; + + + // CONSTANT TABLE + + // Lock used for variableTable/constantTable writes. The RubyObject variableTable + // write methods are overridden here to use this lock rather than Java + // synchronization for faster concurrent writes for modules/classes. + protected final ReentrantLock variableWriteLock = new ReentrantLock(); + + protected transient volatile ConstantTableEntry[] constantTable = + new ConstantTableEntry[CONSTANT_TABLE_DEFAULT_CAPACITY]; + + protected transient int constantTableSize; + + protected transient int constantTableThreshold = + (int)(CONSTANT_TABLE_DEFAULT_CAPACITY * CONSTANT_TABLE_LOAD_FACTOR); + + private final Map<String, DynamicMethod> methods = new ConcurrentHashMap<String, DynamicMethod>(12, 0.75f, 1); + + // ClassProviders return Java class/module (in #defineOrGetClassUnder and + // #defineOrGetModuleUnder) when class/module is opened using colon syntax. + private transient List<ClassProvider> classProviders; + + /** separate path for MetaClass construction + * + */ + protected RubyModule(Ruby runtime, RubyClass metaClass, boolean objectSpace) { + super(runtime, metaClass, objectSpace); + id = runtime.allocModuleId(); + // if (parent == null) parent = runtime.getObject(); + setFlag(USER7_F, !isClass()); + } + + /** used by MODULE_ALLOCATOR and RubyClass constructors + * + */ + protected RubyModule(Ruby runtime, RubyClass metaClass) { + this(runtime, metaClass, runtime.isObjectSpaceEnabled()); + } + + /** standard path for Module construction + * + */ + protected RubyModule(Ruby runtime) { + this(runtime, runtime.getModule()); + } + + public boolean needsImplementer() { + return getFlag(USER7_F); + } + + /** rb_module_new + * + */ + public static RubyModule newModule(Ruby runtime) { + return new RubyModule(runtime); + } + + /** rb_module_new/rb_define_module_id/rb_name_class/rb_set_class_path + * + */ + public static RubyModule newModule(Ruby runtime, String name, RubyModule parent, boolean setParent) { + RubyModule module = newModule(runtime); + module.setBaseName(name); + if (setParent) module.setParent(parent); + parent.setConstant(name, module); + return module; + } + + // synchronized method per JRUBY-1173 (unsafe Double-Checked Locking) + // FIXME: synchronization is still wrong in CP code + public synchronized void addClassProvider(ClassProvider provider) { + if (classProviders == null) { + List<ClassProvider> cp = Collections.synchronizedList(new ArrayList<ClassProvider>()); + cp.add(provider); + classProviders = cp; + } else { + synchronized(classProviders) { + if (!classProviders.contains(provider)) { + classProviders.add(provider); + } + } + } + } + + public void removeClassProvider(ClassProvider provider) { + if (classProviders != null) { + classProviders.remove(provider); + } + } + + private RubyClass searchProvidersForClass(String name, RubyClass superClazz) { + if (classProviders != null) { + synchronized(classProviders) { + RubyClass clazz; + for (ClassProvider classProvider: classProviders) { + if ((clazz = classProvider.defineClassUnder(this, name, superClazz)) != null) { + return clazz; + } + } + } + } + return null; + } + + private RubyModule searchProvidersForModule(String name) { + if (classProviders != null) { + synchronized(classProviders) { + RubyModule module; + for (ClassProvider classProvider: classProviders) { + if ((module = classProvider.defineModuleUnder(this, name)) != null) { + return module; + } + } + } + } + return null; + } + + /** Getter for property superClass. + * @return Value of property superClass. + */ + public RubyClass getSuperClass() { + return superClass; + } + + protected void setSuperClass(RubyClass superClass) { + this.superClass = superClass; + } + + public RubyModule getParent() { + return parent; + } + + public void setParent(RubyModule parent) { + this.parent = parent; + } + + public Map<String, DynamicMethod> getMethods() { + return methods; + } + + + // note that addMethod now does its own put, so any change made to + // functionality here should be made there as well + private void putMethod(String name, DynamicMethod method) { + getMethods().put(name, method); + } + + /** + * Is this module one that in an included one (e.g. an IncludedModuleWrapper). + */ + public boolean isIncluded() { + return false; + } + + public RubyModule getNonIncludedClass() { + return this; + } + + public String getBaseName() { + return classId; + } + + public void setBaseName(String name) { + classId = name; + } + + private volatile String bareName; + private volatile String fullName; + + /** + * Generate a fully-qualified class name or a #-style name for anonymous and singleton classes. + * + * Ruby C equivalent = "classname" + * + * @return The generated class name + */ + public String getName() { + if (fullName == null) { + fullName = calculateFullName(); + } + return fullName; + } + + private String calculateFullName() { + if (getBaseName() == null) { + if (bareName == null) { + if (isClass()) { + bareName = "#<" + "Class" + ":01x" + Integer.toHexString(System.identityHashCode(this)) + ">"; + } else { + bareName = "#<" + "Module" + ":01x" + Integer.toHexString(System.identityHashCode(this)) + ">"; + } + } + + return bareName; + } + + String result = getBaseName(); + RubyClass objectClass = getRuntime().getObject(); + + for (RubyModule p = this.getParent(); p != null && p != objectClass; p = p.getParent()) { + String pName = p.getBaseName(); + // This is needed when the enclosing class or module is a singleton. + // In that case, we generated a name such as null::Foo, which broke + // Marshalling, among others. The correct thing to do in this situation + // is to insert the generate the name of form #<Class:01xasdfasd> if + // it's a singleton module/class, which this code accomplishes. + if(pName == null) { + pName = p.getName(); + } + result = pName + "::" + result; + } + + return result; + } + + /** + * Create a wrapper to use for including the specified module into this one. + * + * Ruby C equivalent = "include_class_new" + * + * @return The module wrapper + */ + public IncludedModuleWrapper newIncludeClass(RubyClass superClazz) { + IncludedModuleWrapper includedModule = new IncludedModuleWrapper(getRuntime(), superClazz, this); + + // include its parent (and in turn that module's parents) + if (getSuperClass() != null) { + includedModule.includeModule(getSuperClass()); + } + + return includedModule; + } + /** + * Finds a class that is within the current module (or class). + * + * @param name to be found in this module (or class) + * @return the class or null if no such class + */ + public RubyClass getClass(String name) { + IRubyObject module; + if ((module = getConstantAt(name)) instanceof RubyClass) { + return (RubyClass)module; + } + return null; + } + + public RubyClass fastGetClass(String internedName) { + IRubyObject module; + if ((module = fastGetConstantAt(internedName)) instanceof RubyClass) { + return (RubyClass)module; + } + return null; + } + + /** + * Include a new module in this module or class. + * + * @param arg The module to include + */ + public synchronized void includeModule(IRubyObject arg) { + assert arg != null; + + testFrozen("module"); + if (!isTaint()) { + getRuntime().secure(4); + } + + if (!(arg instanceof RubyModule)) { + throw getRuntime().newTypeError("Wrong argument type " + arg.getMetaClass().getName() + + " (expected Module)."); + } + + RubyModule module = (RubyModule) arg; + + // Make sure the module we include does not already exist + if (isSame(module)) { + return; + } + + infectBy(module); + + doIncludeModule(module); + } + + public void defineMethod(String name, Callback method) { + Visibility visibility = name.equals("initialize") ? + PRIVATE : PUBLIC; + addMethod(name, new FullFunctionCallbackMethod(this, method, visibility)); + } + + public void defineAnnotatedMethod(Class clazz, String name) { + // FIXME: This is probably not very efficient, since it loads all methods for each call + boolean foundMethod = false; + for (Method method : clazz.getDeclaredMethods()) { + if (method.getName().equals(name) && defineAnnotatedMethod(method, MethodFactory.createFactory(getRuntime().getJRubyClassLoader()))) { + foundMethod = true; + } + } + + if (!foundMethod) { + throw new RuntimeException("No JRubyMethod present for method " + name + "on class " + clazz.getName()); + } + } + + public void defineAnnotatedConstants(Class clazz) { + Field[] declaredFields = clazz.getDeclaredFields(); + for (Field field : declaredFields) { + if(Modifier.isStatic(field.getModifiers())) { + defineAnnotatedConstant(field); + } + } + } + + public boolean defineAnnotatedConstant(Field field) { + JRubyConstant jrubyConstant = field.getAnnotation(JRubyConstant.class); + + if (jrubyConstant == null) return false; + + String[] names = jrubyConstant.value(); + if(names.length == 0) { + names = new String[]{field.getName()}; + } + + Class tp = field.getType(); + IRubyObject realVal; + + try { + if(tp == Integer.class || tp == Integer.TYPE || tp == Short.class || tp == Short.TYPE || tp == Byte.class || tp == Byte.TYPE) { + realVal = RubyNumeric.int2fix(getRuntime(), field.getInt(null)); + } else if(tp == Boolean.class || tp == Boolean.TYPE) { + realVal = field.getBoolean(null) ? getRuntime().getTrue() : getRuntime().getFalse(); + } else { + realVal = getRuntime().getNil(); + } + } catch(Exception e) { + realVal = getRuntime().getNil(); + } + + + for(String name : names) { + this.fastSetConstant(name, realVal); + } + + return true; + } + + public void defineAnnotatedMethods(Class clazz) { + defineAnnotatedMethodsIndividually(clazz); + } + + public static class MethodClumper { + Map<String, List<JavaMethodDescriptor>> annotatedMethods = new HashMap<String, List<JavaMethodDescriptor>>(); + Map<String, List<JavaMethodDescriptor>> staticAnnotatedMethods = new HashMap<String, List<JavaMethodDescriptor>>(); + Map<String, List<JavaMethodDescriptor>> annotatedMethods1_8 = new HashMap<String, List<JavaMethodDescriptor>>(); + Map<String, List<JavaMethodDescriptor>> staticAnnotatedMethods1_8 = new HashMap<String, List<JavaMethodDescriptor>>(); + Map<String, List<JavaMethodDescriptor>> annotatedMethods1_9 = new HashMap<String, List<JavaMethodDescriptor>>(); + Map<String, List<JavaMethodDescriptor>> staticAnnotatedMethods1_9 = new HashMap<String, List<JavaMethodDescriptor>>(); + + public void clump(Class cls) { + Method[] declaredMethods = cls.getDeclaredMethods(); + for (Method method: declaredMethods) { + JRubyMethod anno = method.getAnnotation(JRubyMethod.class); + if (anno == null) continue; + + JavaMethodDescriptor desc = new JavaMethodDescriptor(method); + + String name = anno.name().length == 0 ? method.getName() : anno.name()[0]; + + List<JavaMethodDescriptor> methodDescs; + Map<String, List<JavaMethodDescriptor>> methodsHash = null; + if (desc.isStatic) { + if (anno.compat() == CompatVersion.RUBY1_8) { + methodsHash = staticAnnotatedMethods1_8; + } else if (anno.compat() == CompatVersion.RUBY1_9) { + methodsHash = staticAnnotatedMethods1_9; + } else { + methodsHash = staticAnnotatedMethods; + } + } else { + if (anno.compat() == CompatVersion.RUBY1_8) { + methodsHash = annotatedMethods1_8; + } else if (anno.compat() == CompatVersion.RUBY1_9) { + methodsHash = annotatedMethods1_9; + } else { + methodsHash = annotatedMethods; + } + } + + methodDescs = methodsHash.get(name); + if (methodDescs == null) { + methodDescs = new ArrayList<JavaMethodDescriptor>(); + methodsHash.put(name, methodDescs); + } + + methodDescs.add(desc); + } + } + + public Map<String, List<JavaMethodDescriptor>> getAnnotatedMethods() { + return annotatedMethods; + } + + public Map<String, List<JavaMethodDescriptor>> getAnnotatedMethods1_8() { + return annotatedMethods1_8; + } + + public Map<String, List<JavaMethodDescriptor>> getAnnotatedMethods1_9() { + return annotatedMethods1_9; + } + + public Map<String, List<JavaMethodDescriptor>> getStaticAnnotatedMethods() { + return staticAnnotatedMethods; + } + + public Map<String, List<JavaMethodDescriptor>> getStaticAnnotatedMethods1_8() { + return staticAnnotatedMethods1_8; + } + + public Map<String, List<JavaMethodDescriptor>> getStaticAnnotatedMethods1_9() { + return staticAnnotatedMethods1_9; + } + } + + public void defineAnnotatedMethodsIndividually(Class clazz) { + String x = clazz.getSimpleName(); + TypePopulator populator = null; + + if (RubyInstanceConfig.FULL_TRACE_ENABLED) { + // we need full traces, use default (slow) populator + if (DEBUG) System.out.println("trace mode, using default populator"); + populator = TypePopulator.DEFAULT; + } else { + try { + String qualifiedName = "org.jruby.gen." + clazz.getCanonicalName().replace('.', '$'); + + if (DEBUG) System.out.println("looking for " + qualifiedName + "$Populator"); + + Class populatorClass = Class.forName(qualifiedName + "$Populator"); + populator = (TypePopulator)populatorClass.newInstance(); + } catch (Throwable t) { + if (DEBUG) System.out.println("Could not find it, using default populator"); + populator = TypePopulator.DEFAULT; + } + } + + populator.populate(this, clazz); + } + + @Deprecated + private void defineAnnotatedMethodsIndexed(Class clazz) { + MethodFactory methodFactory = MethodFactory.createFactory(getRuntime().getJRubyClassLoader()); + methodFactory.defineIndexedAnnotatedMethods(this, clazz, methodDefiningCallback); + } + + private static MethodFactory.MethodDefiningCallback methodDefiningCallback = new MethodFactory.MethodDefiningCallback() { + public void define(RubyModule module, JavaMethodDescriptor desc, DynamicMethod dynamicMethod) { + JRubyMethod jrubyMethod = desc.anno; + if (jrubyMethod.frame()) { + for (String name : jrubyMethod.name()) { + ASTInspector.FRAME_AWARE_METHODS.add(name); + } + } + if(jrubyMethod.compat() == CompatVersion.BOTH || + module.getRuntime().getInstanceConfig().getCompatVersion() == jrubyMethod.compat()) { + RubyModule singletonClass; + + if (jrubyMethod.meta()) { + singletonClass = module.getSingletonClass(); + dynamicMethod.setImplementationClass(singletonClass); + + String baseName; + if (jrubyMethod.name().length == 0) { + baseName = desc.name; + singletonClass.addMethod(baseName, dynamicMethod); + } else { + baseName = jrubyMethod.name()[0]; + for (String name : jrubyMethod.name()) { + singletonClass.addMethod(name, dynamicMethod); + } + } + + if (jrubyMethod.alias().length > 0) { + for (String alias : jrubyMethod.alias()) { + singletonClass.defineAlias(alias, baseName); + } + } + } else { + String baseName; + if (jrubyMethod.name().length == 0) { + baseName = desc.name; + module.addMethod(baseName, dynamicMethod); + } else { + baseName = jrubyMethod.name()[0]; + for (String name : jrubyMethod.name()) { + module.addMethod(name, dynamicMethod); + } + } + + if (jrubyMethod.alias().length > 0) { + for (String alias : jrubyMethod.alias()) { + module.defineAlias(alias, baseName); + } + } + + if (jrubyMethod.module()) { + singletonClass = module.getSingletonClass(); + // module/singleton methods are all defined public + DynamicMethod moduleMethod = dynamicMethod.dup(); + moduleMethod.setVisibility(PUBLIC); + + if (jrubyMethod.name().length == 0) { + baseName = desc.name; + singletonClass.addMethod(desc.name, moduleMethod); + } else { + baseName = jrubyMethod.name()[0]; + for (String name : jrubyMethod.name()) { + singletonClass.addMethod(name, moduleMethod); + } + } + + if (jrubyMethod.alias().length > 0) { + for (String alias : jrubyMethod.alias()) { + singletonClass.defineAlias(alias, baseName); + } + } + } + } + } + } + }; + + public boolean defineAnnotatedMethod(String name, List<JavaMethodDescriptor> methods, MethodFactory methodFactory) { + JavaMethodDescriptor desc = methods.get(0); + if (methods.size() == 1) { + return defineAnnotatedMethod(desc, methodFactory); + } else { + DynamicMethod dynamicMethod = methodFactory.getAnnotatedMethod(this, methods); + methodDefiningCallback.define(this, desc, dynamicMethod); + + return true; + } + } + + public boolean defineAnnotatedMethod(Method method, MethodFactory methodFactory) { + JRubyMethod jrubyMethod = method.getAnnotation(JRubyMethod.class); + + if (jrubyMethod == null) return false; + + if(jrubyMethod.compat() == CompatVersion.BOTH || + getRuntime().getInstanceConfig().getCompatVersion() == jrubyMethod.compat()) { + JavaMethodDescriptor desc = new JavaMethodDescriptor(method); + DynamicMethod dynamicMethod = methodFactory.getAnnotatedMethod(this, desc); + methodDefiningCallback.define(this, desc, dynamicMethod); + + return true; + } + return false; + } + + public boolean defineAnnotatedMethod(JavaMethodDescriptor desc, MethodFactory methodFactory) { + JRubyMethod jrubyMethod = desc.anno; + + if (jrubyMethod == null) return false; + + if(jrubyMethod.compat() == CompatVersion.BOTH || + getRuntime().getInstanceConfig().getCompatVersion() == jrubyMethod.compat()) { + DynamicMethod dynamicMethod = methodFactory.getAnnotatedMethod(this, desc); + methodDefiningCallback.define(this, desc, dynamicMethod); + + return true; + } + return false; + } + + public void defineFastMethod(String name, Callback method) { + Visibility visibility = name.equals("initialize") ? + PRIVATE : PUBLIC; + addMethod(name, new SimpleCallbackMethod(this, method, visibility)); + } + + public void defineFastMethod(String name, Callback method, Visibility visibility) { + addMethod(name, new SimpleCallbackMethod(this, method, visibility)); + } + + public void definePrivateMethod(String name, Callback method) { + addMethod(name, new FullFunctionCallbackMethod(this, method, PRIVATE)); + } + + public void defineFastPrivateMethod(String name, Callback method) { + addMethod(name, new SimpleCallbackMethod(this, method, PRIVATE)); + } + + public void defineFastProtectedMethod(String name, Callback method) { + addMethod(name, new SimpleCallbackMethod(this, method, PROTECTED)); + } + + public void undefineMethod(String name) { + addMethod(name, UndefinedMethod.getInstance()); + } + + /** rb_undef + * + */ + public void undef(ThreadContext context, String name) { + Ruby runtime = context.getRuntime(); + + if (this == runtime.getObject()) runtime.secure(4); + + if (runtime.getSafeLevel() >= 4 && !isTaint()) { + throw new SecurityException("Insecure: can't undef"); + } + testFrozen("module"); + if (name.equals("__id__") || name.equals("__send__")) { + runtime.getWarnings().warn(ID.UNDEFINING_BAD, "undefining `"+ name +"' may cause serious problem"); + } + DynamicMethod method = searchMethod(name); + if (method.isUndefined()) { + String s0 = " class"; + RubyModule c = this; + + if (c.isSingleton()) { + IRubyObject obj = ((MetaClass)c).getAttached(); + + if (obj != null && obj instanceof RubyModule) { + c = (RubyModule) obj; + s0 = ""; + } + } else if (c.isModule()) { + s0 = " module"; + } + + throw runtime.newNameError("Undefined method " + name + " for" + s0 + " '" + c.getName() + "'", name); + } + addMethod(name, UndefinedMethod.getInstance()); + + if (isSingleton()) { + IRubyObject singleton = ((MetaClass)this).getAttached(); + singleton.callMethod(context, "singleton_method_undefined", runtime.newSymbol(name)); + } else { + callMethod(context, "method_undefined", runtime.newSymbol(name)); + } + } + + @JRubyMethod(name = "include?", required = 1) + public IRubyObject include_p(ThreadContext context, IRubyObject arg) { + if (!arg.isModule()) { + throw context.getRuntime().newTypeError(arg, context.getRuntime().getModule()); + } + + for (RubyModule p = this; p != null; p = p.getSuperClass()) { + if ((p instanceof IncludedModuleWrapper) && ((IncludedModuleWrapper) p).getNonIncludedClass() == arg) { + return context.getRuntime().getTrue(); + } + } + + return context.getRuntime().getFalse(); + } + + // TODO: Consider a better way of synchronizing + public void addMethod(String name, DynamicMethod method) { + Ruby runtime = getRuntime(); + + if (this == runtime.getObject()) runtime.secure(4); + + if (runtime.getSafeLevel() >= 4 && !isTaint()) { + throw runtime.newSecurityError("Insecure: can't define method"); + } + testFrozen("class/module"); + + // We can safely reference methods here instead of doing getMethods() since if we + // are adding we are not using a IncludedModuleWrapper. + synchronized(getMethods()) { + // If we add a method which already is cached in this class, then we should update the + // cachemap so it stays up to date. + DynamicMethod existingMethod = getMethods().put(name, method); + if (existingMethod != null) { + runtime.getCacheMap().remove(existingMethod); + } + } + } + + public void removeMethod(ThreadContext context, String name) { + Ruby runtime = context.getRuntime(); + + if (this == runtime.getObject()) runtime.secure(4); + + if (runtime.getSafeLevel() >= 4 && !isTaint()) { + throw runtime.newSecurityError("Insecure: can't remove method"); + } + testFrozen("class/module"); + + // We can safely reference methods here instead of doing getMethods() since if we + // are adding we are not using a IncludedModuleWrapper. + synchronized(getMethods()) { + DynamicMethod method = (DynamicMethod) getMethods().remove(name); + if (method == null) { + throw runtime.newNameError("method '" + name + "' not defined in " + getName(), name); + } + + runtime.getCacheMap().remove(method); + } + + if (isSingleton()) { + IRubyObject singleton = ((MetaClass)this).getAttached(); + singleton.callMethod(context, "singleton_method_removed", runtime.newSymbol(name)); + } else { + callMethod(context, "method_removed", runtime.newSymbol(name)); + } + } + + /** + * Search through this module and supermodules for method definitions. Cache superclass definitions in this class. + * + * @param name The name of the method to search for + * @return The method, or UndefinedMethod if not found + */ + public DynamicMethod searchMethod(String name) { + DynamicMethod method = getMethods().get(name); + + if (method != null) return method; + + return superClass == null ? UndefinedMethod.getInstance() : superClass.searchMethod(name); + } + + /** + * Search through this module and supermodules for method definitions. Cache superclass definitions in this class. + * + * @param name The name of the method to search for + * @return The method, or UndefinedMethod if not found + */ + public DynamicMethod retrieveMethod(String name) { + return getMethods().get(name); + } + + /** + * Search through this module and supermodules for method definitions. Cache superclass definitions in this class. + * + * @param name The name of the method to search for + * @return The method, or UndefinedMethod if not found + */ + public RubyModule findImplementer(RubyModule clazz) { + for (RubyModule searchModule = this; searchModule != null; searchModule = searchModule.getSuperClass()) { + if (searchModule.isSame(clazz)) { + return searchModule; + } + } + + return null; + } + + public void addModuleFunction(String name, DynamicMethod method) { + addMethod(name, method); + getSingletonClass().addMethod(name, method); + } + + /** rb_define_module_function + * + */ + public void defineModuleFunction(String name, Callback method) { + definePrivateMethod(name, method); + getSingletonClass().defineMethod(name, method); + } + + /** rb_define_module_function + * + */ + public void definePublicModuleFunction(String name, Callback method) { + defineMethod(name, method); + getSingletonClass().defineMethod(name, method); + } + + /** rb_define_module_function + * + */ + public void defineFastModuleFunction(String name, Callback method) { + defineFastPrivateMethod(name, method); + getSingletonClass().defineFastMethod(name, method); + } + + /** rb_define_module_function + * + */ + public void defineFastPublicModuleFunction(String name, Callback method) { + defineFastMethod(name, method); + getSingletonClass().defineFastMethod(name, method); + } + + /** rb_alias + * + */ + public synchronized void defineAlias(String name, String oldName) { + testFrozen("module"); + if (oldName.equals(name)) { + return; + } + Ruby runtime = getRuntime(); + if (this == runtime.getObject()) { + runtime.secure(4); + } + DynamicMethod method = searchMethod(oldName); + DynamicMethod oldMethod = searchMethod(name); + if (method.isUndefined()) { + if (isModule()) { + method = runtime.getObject().searchMethod(oldName); + } + + if (method.isUndefined()) { + throw runtime.newNameError("undefined method `" + oldName + "' for " + + (isModule() ? "module" : "class") + " `" + getName() + "'", oldName); + } + } + CacheMap cacheMap = runtime.getCacheMap(); + cacheMap.remove(method); + cacheMap.remove(oldMethod); + if (oldMethod != oldMethod.getRealMethod()) { + cacheMap.remove(oldMethod.getRealMethod()); + } + putMethod(name, new AliasMethod(this, method, oldName)); + } + + public synchronized void defineAliases(List<String> aliases, String oldName) { + testFrozen("module"); + Ruby runtime = getRuntime(); + if (this == runtime.getObject()) { + runtime.secure(4); + } + DynamicMethod method = searchMethod(oldName); + if (method.isUndefined()) { + if (isModule()) { + method = runtime.getObject().searchMethod(oldName); + } + + if (method.isUndefined()) { + throw runtime.newNameError("undefined method `" + oldName + "' for " + + (isModule() ? "module" : "class") + " `" + getName() + "'", oldName); + } + } + CacheMap cacheMap = runtime.getCacheMap(); + cacheMap.remove(method); + for (String name: aliases) { + if (oldName.equals(name)) continue; + DynamicMethod oldMethod = searchMethod(name); + cacheMap.remove(oldMethod); + if (oldMethod != oldMethod.getRealMethod()) { + cacheMap.remove(oldMethod.getRealMethod()); + } + putMethod(name, new AliasMethod(this, method, oldName)); + } + } + + /** this method should be used only by interpreter or compiler + * + */ + public RubyClass defineOrGetClassUnder(String name, RubyClass superClazz) { + // This method is intended only for defining new classes in Ruby code, + // so it uses the allocator of the specified superclass or default to + // the Object allocator. It should NOT be used to define classes that require a native allocator. + + Ruby runtime = getRuntime(); + IRubyObject classObj = getConstantAt(name); + RubyClass clazz; + + if (classObj != null) { + if (!(classObj instanceof RubyClass)) throw runtime.newTypeError(name + " is not a class"); + clazz = (RubyClass)classObj; + + if (superClazz != null) { + RubyClass tmp = clazz.getSuperClass(); + while (tmp != null && tmp.isIncluded()) tmp = tmp.getSuperClass(); // need to skip IncludedModuleWrappers + if (tmp != null) tmp = tmp.getRealClass(); + if (tmp != superClazz) throw runtime.newTypeError("superclass mismatch for class " + name); + // superClazz = null; + } + + if (runtime.getSafeLevel() >= 4) throw runtime.newTypeError("extending class prohibited"); + } else if (classProviders != null && (clazz = searchProvidersForClass(name, superClazz)) != null) { + // reopen a java class + } else { + if (superClazz == null) superClazz = runtime.getObject(); + clazz = RubyClass.newClass(runtime, superClazz, name, superClazz.getAllocator(), this, true); + } + + return clazz; + } + + /** this method should be used only by interpreter or compiler + * + */ + public RubyModule defineOrGetModuleUnder(String name) { + // This method is intended only for defining new modules in Ruby code + Ruby runtime = getRuntime(); + IRubyObject moduleObj = getConstantAt(name); + RubyModule module; + if (moduleObj != null) { + if (!moduleObj.isModule()) throw runtime.newTypeError(name + " is not a module"); + if (runtime.getSafeLevel() >= 4) throw runtime.newSecurityError("extending module prohibited"); + module = (RubyModule)moduleObj; + } else if (classProviders != null && (module = searchProvidersForModule(name)) != null) { + // reopen a java module + } else { + module = RubyModule.newModule(runtime, name, this, true); + } + return module; + } + + /** rb_define_class_under + * this method should be used only as an API to define/open nested classes + */ + public RubyClass defineClassUnder(String name, RubyClass superClass, ObjectAllocator allocator) { + return getRuntime().defineClassUnder(name, superClass, allocator, this); + } + + /** rb_define_module_under + * this method should be used only as an API to define/open nested module + */ + public RubyModule defineModuleUnder(String name) { + return getRuntime().defineModuleUnder(name, this); + } + + // FIXME: create AttrReaderMethod, AttrWriterMethod, for faster attr access + private void addAccessor(ThreadContext context, String internedName, boolean readable, boolean writeable) { + assert internedName == internedName.intern() : internedName + " is not interned"; + + final Ruby runtime = context.getRuntime(); + + // Check the visibility of the previous frame, which will be the frame in which the class is being eval'ed + Visibility attributeScope = context.getCurrentVisibility(); + if (attributeScope == PRIVATE) { + //FIXME warning + } else if (attributeScope == MODULE_FUNCTION) { + attributeScope = PRIVATE; + // FIXME warning + } + final String variableName = ("@" + internedName).intern(); + if (readable) { + // FIXME: should visibility be set to current visibility? + addMethod(internedName, new JavaMethod(this, PUBLIC) { + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject[] args, Block block) { + if (args.length != 0) Arity.raiseArgumentError(runtime, args.length, 0, 0); + + IRubyObject variable = self.getInstanceVariables().fastGetInstanceVariable(variableName); + + return variable == null ? runtime.getNil() : variable; + } + + @Override + public Arity getArity() { + return Arity.noArguments(); + } + }); + callMethod(context, "method_added", runtime.fastNewSymbol(internedName)); + } + if (writeable) { + internedName = (internedName + "=").intern(); + // FIXME: should visibility be set to current visibility? + addMethod(internedName, new JavaMethod(this, PUBLIC) { + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject[] args, Block block) { + // ENEBO: Can anyone get args to be anything but length 1? + if (args.length != 1) Arity.raiseArgumentError(runtime, args.length, 1, 1); + + return self.getInstanceVariables().fastSetInstanceVariable(variableName, args[0]); + } + + @Override + public Arity getArity() { + return Arity.singleArgument(); + } + }); + callMethod(context, "method_added", runtime.fastNewSymbol(internedName)); + } + } + + /** set_method_visibility + * + */ + public void setMethodVisibility(IRubyObject[] methods, Visibility visibility) { + if (getRuntime().getSafeLevel() >= 4 && !isTaint()) { + throw getRuntime().newSecurityError("Insecure: can't change method visibility"); + } + + for (int i = 0; i < methods.length; i++) { + exportMethod(methods[i].asJavaString(), visibility); + } + } + + /** rb_export_method + * + */ + public void exportMethod(String name, Visibility visibility) { + if (this == getRuntime().getObject()) { + getRuntime().secure(4); + } + + DynamicMethod method = searchMethod(name); + + if (method.isUndefined()) { + throw getRuntime().newNameError("undefined method '" + name + "' for " + + (isModule() ? "module" : "class") + " '" + getName() + "'", name); + } + + if (method.getVisibility() != visibility) { + if (this == method.getImplementationClass()) { + method.setVisibility(visibility); + } else { + // FIXME: Why was this using a FullFunctionCallbackMethod before that did callSuper? + addMethod(name, new WrapperMethod(this, method, visibility)); + } + } + } + + /** + * MRI: rb_method_boundp + * + */ + public boolean isMethodBound(String name, boolean checkVisibility) { + DynamicMethod method = searchMethod(name); + if (!method.isUndefined()) { + return !(checkVisibility && method.getVisibility() == PRIVATE); + } + return false; + } + + public IRubyObject newMethod(IRubyObject receiver, String name, boolean bound) { + DynamicMethod method = searchMethod(name); + if (method.isUndefined()) { + throw getRuntime().newNameError("undefined method `" + name + + "' for class `" + this.getName() + "'", name); + } + + RubyModule implementationModule = method.getImplementationClass(); + RubyModule originModule = this; + while (originModule != implementationModule && originModule.isSingleton()) { + originModule = ((MetaClass)originModule).getRealClass(); + } + + RubyMethod newMethod = null; + if (bound) { + newMethod = RubyMethod.newMethod(implementationModule, name, originModule, name, method, receiver); + } else { + newMethod = RubyUnboundMethod.newUnboundMethod(implementationModule, name, originModule, name, method); + } + newMethod.infectBy(this); + + return newMethod; + } + + @JRubyMethod(name = "define_method", frame = true, visibility = PRIVATE, reads = VISIBILITY) + public IRubyObject define_method(ThreadContext context, IRubyObject arg0, Block block) { + Ruby runtime = context.getRuntime(); + String name = arg0.asJavaString().intern(); + DynamicMethod newMethod = null; + Visibility visibility = context.getCurrentVisibility(); + + if (visibility == MODULE_FUNCTION) visibility = PRIVATE; + RubyProc proc = runtime.newProc(Block.Type.LAMBDA, block); + + // a normal block passed to define_method changes to do arity checking; make it a lambda + proc.getBlock().type = Block.Type.LAMBDA; + + newMethod = createProcMethod(name, visibility, proc); + + RuntimeHelpers.addInstanceMethod(this, name, newMethod, context.getPreviousVisibility(), context, runtime); + + return proc; + } + + @JRubyMethod(name = "define_method", frame = true, visibility = PRIVATE, reads = VISIBILITY) + public IRubyObject define_method(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + Ruby runtime = context.getRuntime(); + IRubyObject body; + String name = arg0.asJavaString().intern(); + DynamicMethod newMethod = null; + Visibility visibility = context.getCurrentVisibility(); + + if (visibility == MODULE_FUNCTION) visibility = PRIVATE; + if (runtime.getProc().isInstance(arg1)) { + // double-testing args.length here, but it avoids duplicating the proc-setup code in two places + RubyProc proc = (RubyProc)arg1; + body = proc; + + newMethod = createProcMethod(name, visibility, proc); + } else if (runtime.getMethod().isInstance(arg1)) { + RubyMethod method = (RubyMethod)arg1; + body = method; + + newMethod = new MethodMethod(this, method.unbind(null), visibility); + } else { + throw runtime.newTypeError("wrong argument type " + arg1.getType().getName() + " (expected Proc/Method)"); + } + + RuntimeHelpers.addInstanceMethod(this, name, newMethod, context.getPreviousVisibility(), context, runtime); + + return body; + } + @Deprecated + public IRubyObject define_method(ThreadContext context, IRubyObject[] args, Block block) { + switch (args.length) { + case 1: + return define_method(context, args[0], block); + case 2: + return define_method(context, args[0], args[1], block); + default: + throw context.getRuntime().newArgumentError("wrong # of arguments(" + args.length + " for 2)"); + } + } + + private DynamicMethod createProcMethod(String name, Visibility visibility, RubyProc proc) { + Block block = proc.getBlock(); + block.getBinding().getFrame().setKlazz(this); + block.getBinding().getFrame().setName(name); + + StaticScope scope = block.getBody().getStaticScope(); + + // for zsupers in define_method (blech!) we tell the proc scope to act as the "argument" scope + scope.setArgumentScope(true); + + Arity arity = block.arity(); + // just using required is broken...but no more broken than before zsuper refactoring + scope.setRequiredArgs(arity.required()); + + if(!arity.isFixed()) { + scope.setRestArg(arity.required()); + } + + return new ProcMethod(this, proc, visibility); + } + + @Deprecated + public IRubyObject executeUnder(ThreadContext context, Callback method, IRubyObject[] args, Block block) { + context.preExecuteUnder(this, block); + try { + return method.execute(this, args, block); + } finally { + context.postExecuteUnder(); + } + } + + @JRubyMethod(name = "name") + public RubyString name() { + return getRuntime().newString(getBaseName() == null ? "" : getName()); + } + + protected IRubyObject cloneMethods(RubyModule clone) { + RubyModule realType = this.getNonIncludedClass(); + for (Map.Entry<String, DynamicMethod> entry : getMethods().entrySet()) { + DynamicMethod method = entry.getValue(); + // Do not clone cached methods + // FIXME: MRI copies all methods here + if (method.getImplementationClass() == realType || method instanceof UndefinedMethod) { + + // A cloned method now belongs to a new class. Set it. + // TODO: Make DynamicMethod immutable + DynamicMethod clonedMethod = method.dup(); + clonedMethod.setImplementationClass(clone); + clone.putMethod(entry.getKey(), clonedMethod); + } + } + + return clone; + } + + /** rb_mod_init_copy + * + */ + @JRubyMethod(name = "initialize_copy", required = 1) + @Override + public IRubyObject initialize_copy(IRubyObject original) { + super.initialize_copy(original); + + RubyModule originalModule = (RubyModule)original; + + if (!getMetaClass().isSingleton()) setMetaClass(originalModule.getSingletonClassClone()); + setSuperClass(originalModule.getSuperClass()); + + if (originalModule.hasVariables()){ + syncVariables(originalModule.getVariableList()); + } + + originalModule.cloneMethods(this); + + return this; + } + + /** rb_mod_included_modules + * + */ + @JRubyMethod(name = "included_modules") + public RubyArray included_modules(ThreadContext context) { + RubyArray ary = context.getRuntime().newArray(); + + for (RubyModule p = getSuperClass(); p != null; p = p.getSuperClass()) { + if (p.isIncluded()) { + ary.append(p.getNonIncludedClass()); + } + } + + return ary; + } + + /** rb_mod_ancestors + * + */ + @JRubyMethod(name = "ancestors") + public RubyArray ancestors(ThreadContext context) { + return context.getRuntime().newArray(getAncestorList()); + } + + @Deprecated + public RubyArray ancestors() { + return getRuntime().newArray(getAncestorList()); + } + + public List<IRubyObject> getAncestorList() { + ArrayList<IRubyObject> list = new ArrayList<IRubyObject>(); + + for (RubyModule p = this; p != null; p = p.getSuperClass()) { + if(!p.isSingleton()) { + list.add(p.getNonIncludedClass()); + } + } + + return list; + } + + public boolean hasModuleInHierarchy(RubyModule type) { + // XXX: This check previously used callMethod("==") to check for equality between classes + // when scanning the hierarchy. However the == check may be safe; we should only ever have + // one instance bound to a given type/constant. If it's found to be unsafe, examine ways + // to avoid the == call. + for (RubyModule p = this; p != null; p = p.getSuperClass()) { + if (p.getNonIncludedClass() == type) return true; + } + + return false; + } + + @Override + public int hashCode() { + return id; + } + + @JRubyMethod(name = "hash") + @Override + public RubyFixnum hash() { + return getRuntime().newFixnum(id); + } + + /** rb_mod_to_s + * + */ + @JRubyMethod(name = "to_s") + @Override + public IRubyObject to_s() { + if(isSingleton()){ + IRubyObject attached = ((MetaClass)this).getAttached(); + StringBuilder buffer = new StringBuilder("#<Class:"); + if (attached != null) { // FIXME: figure out why we get null sometimes + if(attached instanceof RubyClass || attached instanceof RubyModule){ + buffer.append(attached.inspect()); + }else{ + buffer.append(attached.anyToString()); + } + } + buffer.append(">"); + return getRuntime().newString(buffer.toString()); + } + return getRuntime().newString(getName()); + } + + /** rb_mod_eqq + * + */ + @JRubyMethod(name = "===", required = 1) + @Override + public RubyBoolean op_eqq(ThreadContext context, IRubyObject obj) { + return context.getRuntime().newBoolean(isInstance(obj)); + } + + @JRubyMethod(name = "==", required = 1) + @Override + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + return super.op_equal(context, other); + } + + /** rb_mod_freeze + * + */ + @JRubyMethod(name = "freeze") + @Override + public IRubyObject freeze(ThreadContext context) { + to_s(); + return super.freeze(context); + } + + /** rb_mod_le + * + */ + @JRubyMethod(name = "<=", required = 1) + public IRubyObject op_le(IRubyObject obj) { + if (!(obj instanceof RubyModule)) { + throw getRuntime().newTypeError("compared with non class/module"); + } + + if (isKindOfModule((RubyModule) obj)) { + return getRuntime().getTrue(); + } else if (((RubyModule) obj).isKindOfModule(this)) { + return getRuntime().getFalse(); + } + + return getRuntime().getNil(); + } + + /** rb_mod_lt + * + */ + @JRubyMethod(name = "<", required = 1) + public IRubyObject op_lt(IRubyObject obj) { + return obj == this ? getRuntime().getFalse() : op_le(obj); + } + + /** rb_mod_ge + * + */ + @JRubyMethod(name = ">=", required = 1) + public IRubyObject op_ge(IRubyObject obj) { + if (!(obj instanceof RubyModule)) { + throw getRuntime().newTypeError("compared with non class/module"); + } + + return ((RubyModule) obj).op_le(this); + } + + /** rb_mod_gt + * + */ + @JRubyMethod(name = ">", required = 1) + public IRubyObject op_gt(IRubyObject obj) { + return this == obj ? getRuntime().getFalse() : op_ge(obj); + } + + /** rb_mod_cmp + * + */ + @JRubyMethod(name = "<=>", required = 1) + public IRubyObject op_cmp(IRubyObject obj) { + if (this == obj) return getRuntime().newFixnum(0); + if (!(obj instanceof RubyModule)) return getRuntime().getNil(); + + RubyModule module = (RubyModule) obj; + + if (module.isKindOfModule(this)) { + return getRuntime().newFixnum(1); + } else if (this.isKindOfModule(module)) { + return getRuntime().newFixnum(-1); + } + + return getRuntime().getNil(); + } + + public boolean isKindOfModule(RubyModule type) { + for (RubyModule p = this; p != null; p = p.getSuperClass()) { + if (p.isSame(type)) { + return true; + } + } + + return false; + } + + protected boolean isSame(RubyModule module) { + return this == module; + } + + /** rb_mod_initialize + * + */ + @JRubyMethod(name = "initialize", frame = true, visibility = PRIVATE) + public IRubyObject initialize(Block block) { + if (block.isGiven()) { + // class and module bodies default to public, so make the block's visibility public. JRUBY-1185. + block.getBinding().setVisibility(PUBLIC); + block.yield(getRuntime().getCurrentContext(), this, this, this, false); + } + + return getRuntime().getNil(); + } + + public void addReadWriteAttribute(ThreadContext context, String name) { + addAccessor(context, name.intern(), true, true); + } + + public void addReadAttribute(ThreadContext context, String name) { + addAccessor(context, name.intern(), true, false); + } + + public void addWriteAttribute(ThreadContext context, String name) { + addAccessor(context, name.intern(), false, true); + } + + /** rb_mod_attr + * + */ + @JRubyMethod(name = "attr", required = 1, optional = 1, visibility = PRIVATE, reads = VISIBILITY) + public IRubyObject attr(ThreadContext context, IRubyObject[] args) { + boolean writeable = args.length > 1 ? args[1].isTrue() : false; + + addAccessor(context, args[0].asJavaString().intern(), true, writeable); + + return getRuntime().getNil(); + } + + /** + * @deprecated + */ + public IRubyObject attr_reader(IRubyObject[] args) { + return attr_reader(getRuntime().getCurrentContext(), args); + } + + /** rb_mod_attr_reader + * + */ + @JRubyMethod(name = "attr_reader", rest = true, visibility = PRIVATE, reads = VISIBILITY) + public IRubyObject attr_reader(ThreadContext context, IRubyObject[] args) { + for (int i = 0; i < args.length; i++) { + addAccessor(context, args[i].asJavaString().intern(), true, false); + } + + return context.getRuntime().getNil(); + } + + /** rb_mod_attr_writer + * + */ + @JRubyMethod(name = "attr_writer", rest = true, visibility = PRIVATE, reads = VISIBILITY) + public IRubyObject attr_writer(ThreadContext context, IRubyObject[] args) { + for (int i = 0; i < args.length; i++) { + addAccessor(context, args[i].asJavaString().intern(), false, true); + } + + return context.getRuntime().getNil(); + } + + /** + * @deprecated + */ + public IRubyObject attr_accessor(IRubyObject[] args) { + return attr_accessor(getRuntime().getCurrentContext(), args); + } + + /** rb_mod_attr_accessor + * + */ + @JRubyMethod(name = "attr_accessor", rest = true, visibility = PRIVATE, reads = VISIBILITY) + public IRubyObject attr_accessor(ThreadContext context, IRubyObject[] args) { + for (int i = 0; i < args.length; i++) { + // This is almost always already interned, since it will be called with a symbol in most cases + // but when created from Java code, we might get an argument that needs to be interned. + // addAccessor has as a precondition that the string MUST be interned + addAccessor(context, args[i].asJavaString().intern(), true, true); + } + + return context.getRuntime().getNil(); + } + + /** + * Get a list of all instance methods names of the provided visibility unless not is true, then + * get all methods which are not the provided + * + * @param args passed into one of the Ruby instance_method methods + * @param visibility to find matching instance methods against + * @param not if true only find methods not matching supplied visibility + * @return a RubyArray of instance method names + */ + private RubyArray instance_methods(IRubyObject[] args, final Visibility visibility, boolean not) { + boolean includeSuper = args.length > 0 ? args[0].isTrue() : true; + RubyArray ary = getRuntime().newArray(); + Set<String> seen = new HashSet<String>(); + + for (RubyModule type = this; type != null; type = type.getSuperClass()) { + RubyModule realType = type.getNonIncludedClass(); + for (Iterator iter = type.getMethods().entrySet().iterator(); iter.hasNext();) { + Map.Entry entry = (Map.Entry) iter.next(); + DynamicMethod method = (DynamicMethod) entry.getValue(); + String methodName = (String) entry.getKey(); + + if (! seen.contains(methodName)) { + seen.add(methodName); + + if (method.getImplementationClass() == realType && + (!not && method.getVisibility() == visibility || (not && method.getVisibility() != visibility)) && + ! method.isUndefined()) { + + ary.append(getRuntime().newString(methodName)); + } + } + } + + if (!includeSuper) { + break; + } + } + + return ary; + } + + @JRubyMethod(name = "instance_methods", optional = 1) + public RubyArray instance_methods(IRubyObject[] args) { + return instance_methods(args, PRIVATE, true); + } + + @JRubyMethod(name = "public_instance_methods", optional = 1) + public RubyArray public_instance_methods(IRubyObject[] args) { + return instance_methods(args, PUBLIC, false); + } + + @JRubyMethod(name = "instance_method", required = 1) + public IRubyObject instance_method(IRubyObject symbol) { + return newMethod(null, symbol.asJavaString(), false); + } + + /** rb_class_protected_instance_methods + * + */ + @JRubyMethod(name = "protected_instance_methods", optional = 1) + public RubyArray protected_instance_methods(IRubyObject[] args) { + return instance_methods(args, PROTECTED, false); + } + + /** rb_class_private_instance_methods + * + */ + @JRubyMethod(name = "private_instance_methods", optional = 1) + public RubyArray private_instance_methods(IRubyObject[] args) { + return instance_methods(args, PRIVATE, false); + } + + /** rb_mod_append_features + * + */ + @JRubyMethod(name = "append_features", required = 1, visibility = PRIVATE) + public RubyModule append_features(IRubyObject module) { + if (!(module instanceof RubyModule)) { + // MRI error message says Class, even though Module is ok + throw getRuntime().newTypeError(module,getRuntime().getClassClass()); + } + ((RubyModule) module).includeModule(this); + return this; + } + + /** rb_mod_extend_object + * + */ + @JRubyMethod(name = "extend_object", required = 1, visibility = PRIVATE) + public IRubyObject extend_object(IRubyObject obj) { + obj.getSingletonClass().includeModule(this); + return obj; + } + + /** rb_mod_include + * + */ + @JRubyMethod(name = "include", required = 1, rest = true, visibility = PRIVATE) + public RubyModule include(IRubyObject[] modules) { + ThreadContext context = getRuntime().getCurrentContext(); + // MRI checks all types first: + for (int i = modules.length; --i >= 0; ) { + IRubyObject obj = modules[i]; + if (!obj.isModule()) throw context.getRuntime().newTypeError(obj, context.getRuntime().getModule()); + } + for (int i = modules.length - 1; i >= 0; i--) { + modules[i].callMethod(context, "append_features", this); + modules[i].callMethod(context, "included", this); + } + + return this; + } + + @JRubyMethod(name = "included", required = 1) + public IRubyObject included(ThreadContext context, IRubyObject other) { + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "extended", required = 1, frame = true) + public IRubyObject extended(ThreadContext context, IRubyObject other, Block block) { + return context.getRuntime().getNil(); + } + + private void setVisibility(ThreadContext context, IRubyObject[] args, Visibility visibility) { + if (context.getRuntime().getSafeLevel() >= 4 && !isTaint()) { + throw context.getRuntime().newSecurityError("Insecure: can't change method visibility"); + } + + if (args.length == 0) { + // Note: we change current frames visibility here because the methods which call + // this method are all "fast" (e.g. they do not created their own frame). + context.setCurrentVisibility(visibility); + } else { + setMethodVisibility(args, visibility); + } + } + + /** rb_mod_public + * + */ + @JRubyMethod(name = "public", rest = true, visibility = PRIVATE, writes = VISIBILITY) + public RubyModule rbPublic(ThreadContext context, IRubyObject[] args) { + setVisibility(context, args, PUBLIC); + return this; + } + + /** rb_mod_protected + * + */ + @JRubyMethod(name = "protected", rest = true, visibility = PRIVATE, writes = VISIBILITY) + public RubyModule rbProtected(ThreadContext context, IRubyObject[] args) { + setVisibility(context, args, PROTECTED); + return this; + } + + /** rb_mod_private + * + */ + @JRubyMethod(name = "private", rest = true, visibility = PRIVATE, writes = VISIBILITY) + public RubyModule rbPrivate(ThreadContext context, IRubyObject[] args) { + setVisibility(context, args, PRIVATE); + return this; + } + + /** rb_mod_modfunc + * + */ + @JRubyMethod(name = "module_function", rest = true, visibility = PRIVATE, writes = VISIBILITY) + public RubyModule module_function(ThreadContext context, IRubyObject[] args) { + if (context.getRuntime().getSafeLevel() >= 4 && !isTaint()) { + throw context.getRuntime().newSecurityError("Insecure: can't change method visibility"); + } + + if (args.length == 0) { + context.setCurrentVisibility(MODULE_FUNCTION); + } else { + setMethodVisibility(args, PRIVATE); + + for (int i = 0; i < args.length; i++) { + String name = args[i].asJavaString().intern(); + DynamicMethod method = searchMethod(name); + assert !method.isUndefined() : "undefined method '" + name + "'"; + getSingletonClass().addMethod(name, new WrapperMethod(getSingletonClass(), method, PUBLIC)); + callMethod(context, "singleton_method_added", context.getRuntime().fastNewSymbol(name)); + } + } + return this; + } + + @JRubyMethod(name = "method_added", required = 1, visibility = PRIVATE) + public IRubyObject method_added(ThreadContext context, IRubyObject nothing) { + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "method_removed", required = 1, visibility = PRIVATE) + public IRubyObject method_removed(ThreadContext context, IRubyObject nothing) { + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "method_undefined", required = 1, visibility = PRIVATE) + public IRubyObject method_undefined(ThreadContext context, IRubyObject nothing) { + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "method_defined?", required = 1) + public RubyBoolean method_defined_p(ThreadContext context, IRubyObject symbol) { + return isMethodBound(symbol.asJavaString(), true) ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + @JRubyMethod(name = "public_method_defined?", required = 1) + public IRubyObject public_method_defined(ThreadContext context, IRubyObject symbol) { + DynamicMethod method = searchMethod(symbol.asJavaString()); + + return context.getRuntime().newBoolean(!method.isUndefined() && method.getVisibility() == PUBLIC); + } + + @JRubyMethod(name = "protected_method_defined?", required = 1) + public IRubyObject protected_method_defined(ThreadContext context, IRubyObject symbol) { + DynamicMethod method = searchMethod(symbol.asJavaString()); + + return context.getRuntime().newBoolean(!method.isUndefined() && method.getVisibility() == PROTECTED); + } + + @JRubyMethod(name = "private_method_defined?", required = 1) + public IRubyObject private_method_defined(ThreadContext context, IRubyObject symbol) { + DynamicMethod method = searchMethod(symbol.asJavaString()); + + return context.getRuntime().newBoolean(!method.isUndefined() && method.getVisibility() == PRIVATE); + } + + @JRubyMethod(name = "public_class_method", rest = true) + public RubyModule public_class_method(IRubyObject[] args) { + getMetaClass().setMethodVisibility(args, PUBLIC); + return this; + } + + @JRubyMethod(name = "private_class_method", rest = true) + public RubyModule private_class_method(IRubyObject[] args) { + getMetaClass().setMethodVisibility(args, PRIVATE); + return this; + } + + @JRubyMethod(name = "alias_method", required = 2, visibility = PRIVATE) + public RubyModule alias_method(ThreadContext context, IRubyObject newId, IRubyObject oldId) { + String newName = newId.asJavaString(); + defineAlias(newName, oldId.asJavaString()); + RubySymbol newSym = newId instanceof RubySymbol ? (RubySymbol)newId : + context.getRuntime().newSymbol(newName); + if (isSingleton()) { + ((MetaClass)this).getAttached().callMethod(context, "singleton_method_added", newSym); + } else { + callMethod(context, "method_added", newSym); + } + return this; + } + + @JRubyMethod(name = "undef_method", required = 1, rest = true, visibility = PRIVATE) + public RubyModule undef_method(ThreadContext context, IRubyObject[] args) { + for (int i=0; i<args.length; i++) { + undef(context, args[i].asJavaString()); + } + return this; + } + + @JRubyMethod(name = {"module_eval", "class_eval"}, frame = true) + public IRubyObject module_eval(ThreadContext context, Block block) { + return specificEval(context, this, block); + } + @JRubyMethod(name = {"module_eval", "class_eval"}, frame = true) + public IRubyObject module_eval(ThreadContext context, IRubyObject arg0, Block block) { + return specificEval(context, this, arg0, block); + } + @JRubyMethod(name = {"module_eval", "class_eval"}, frame = true) + public IRubyObject module_eval(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + return specificEval(context, this, arg0, arg1, block); + } + @JRubyMethod(name = {"module_eval", "class_eval"}, frame = true) + public IRubyObject module_eval(ThreadContext context, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) { + return specificEval(context, this, arg0, arg1, arg2, block); + } + @Deprecated + public IRubyObject module_eval(ThreadContext context, IRubyObject[] args, Block block) { + return specificEval(context, this, args, block); + } + + @JRubyMethod(name = "remove_method", required = 1, rest = true, visibility = PRIVATE) + public RubyModule remove_method(ThreadContext context, IRubyObject[] args) { + for(int i=0;i<args.length;i++) { + removeMethod(context, args[i].asJavaString()); + } + return this; + } + + public static void marshalTo(RubyModule module, MarshalStream output) throws java.io.IOException { + output.registerLinkTarget(module); + output.writeString(MarshalStream.getPathFromClass(module)); + } + + public static RubyModule unmarshalFrom(UnmarshalStream input) throws java.io.IOException { + String name = RubyString.byteListToString(input.unmarshalString()); + RubyModule result = UnmarshalStream.getModuleFromPath(input.getRuntime(), name); + input.registerLinkTarget(result); + return result; + } + + /* Module class methods */ + + /** + * Return an array of nested modules or classes. + */ + @JRubyMethod(name = "nesting", frame = true, meta = true) + public static RubyArray nesting(ThreadContext context, IRubyObject recv, Block block) { + Ruby runtime = context.getRuntime(); + RubyModule object = runtime.getObject(); + StaticScope scope = context.getCurrentScope().getStaticScope(); + RubyArray result = runtime.newArray(); + + for (StaticScope current = scope; current.getModule() != object; current = current.getPreviousCRefScope()) { + result.append(current.getModule()); + } + + return result; + } + + private void doIncludeModule(RubyModule includedModule) { + boolean skip = false; + + RubyModule currentModule = this; + while (includedModule != null) { + + if (getNonIncludedClass() == includedModule.getNonIncludedClass()) { + throw getRuntime().newArgumentError("cyclic include detected"); + } + + boolean superclassSeen = false; + + // scan class hierarchy for module + for (RubyModule superClass = this.getSuperClass(); superClass != null; superClass = superClass.getSuperClass()) { + if (superClass instanceof IncludedModuleWrapper) { + if (superClass.getNonIncludedClass() == includedModule.getNonIncludedClass()) { + if (!superclassSeen) { + currentModule = superClass; + } + skip = true; + break; + } + } else { + superclassSeen = true; + } + } + + if (!skip) { + + // blow away caches for any methods that are redefined by module + getRuntime().getCacheMap().moduleIncluded(currentModule, includedModule); + + // In the current logic, if we get here we know that module is not an + // IncludedModuleWrapper, so there's no need to fish out the delegate. But just + // in case the logic should change later, let's do it anyway: + currentModule.setSuperClass(new IncludedModuleWrapper(getRuntime(), currentModule.getSuperClass(), + includedModule.getNonIncludedClass())); + currentModule = currentModule.getSuperClass(); + } + + includedModule = includedModule.getSuperClass(); + skip = false; + } + } + + + // + ////////////////// CLASS VARIABLE RUBY METHODS //////////////// + // + + @JRubyMethod(name = "class_variable_defined?", required = 1) + public IRubyObject class_variable_defined_p(ThreadContext context, IRubyObject var) { + String internedName = validateClassVariable(var.asJavaString().intern()); + RubyModule module = this; + do { + if (module.fastHasClassVariable(internedName)) { + return context.getRuntime().getTrue(); + } + } while ((module = module.getSuperClass()) != null); + + return context.getRuntime().getFalse(); + } + + /** rb_mod_cvar_get + * + */ + @JRubyMethod(name = "class_variable_get", required = 1, visibility = PRIVATE) + public IRubyObject class_variable_get(IRubyObject var) { + return fastGetClassVar(validateClassVariable(var.asJavaString()).intern()); + } + + /** rb_mod_cvar_set + * + */ + @JRubyMethod(name = "class_variable_set", required = 2, visibility = PRIVATE) + public IRubyObject class_variable_set(IRubyObject var, IRubyObject value) { + return fastSetClassVar(validateClassVariable(var.asJavaString()).intern(), value); + } + + /** rb_mod_remove_cvar + * + */ + @JRubyMethod(name = "remove_class_variable", required = 1, visibility = PRIVATE) + public IRubyObject remove_class_variable(ThreadContext context, IRubyObject name) { + String javaName = validateClassVariable(name.asJavaString()); + IRubyObject value; + + if ((value = deleteClassVariable(javaName)) != null) { + return value; + } + + if (fastIsClassVarDefined(javaName)) { + throw cannotRemoveError(javaName); + } + + throw context.getRuntime().newNameError("class variable " + javaName + " not defined for " + getName(), javaName); + } + + /** rb_mod_class_variables + * + */ + @JRubyMethod(name = "class_variables") + public RubyArray class_variables(ThreadContext context) { + Set<String> names = new HashSet<String>(); + + for (RubyModule p = this; p != null; p = p.getSuperClass()) { + for (String name : p.getClassVariableNameList()) { + names.add(name); + } + } + + Ruby runtime = context.getRuntime(); + RubyArray ary = runtime.newArray(); + + for (String name : names) { + ary.append(runtime.newString(name)); + } + + return ary; + } + + + // + ////////////////// CONSTANT RUBY METHODS //////////////// + // + + /** rb_mod_const_defined + * + */ + @JRubyMethod(name = "const_defined?", required = 1) + public RubyBoolean const_defined_p(ThreadContext context, IRubyObject symbol) { + // Note: includes part of fix for JRUBY-1339 + return context.getRuntime().newBoolean(fastIsConstantDefined(validateConstant(symbol.asJavaString()).intern())); + } + + /** rb_mod_const_get + * + */ + @JRubyMethod(name = "const_get", required = 1) + public IRubyObject const_get(IRubyObject symbol) { + return fastGetConstant(validateConstant(symbol.asJavaString()).intern()); + } + + /** rb_mod_const_set + * + */ + @JRubyMethod(name = "const_set", required = 2) + public IRubyObject const_set(IRubyObject symbol, IRubyObject value) { + return fastSetConstant(validateConstant(symbol.asJavaString()).intern(), value); + } + + @JRubyMethod(name = "remove_const", required = 1, visibility = PRIVATE) + public IRubyObject remove_const(ThreadContext context, IRubyObject name) { + String id = validateConstant(name.asJavaString()); + IRubyObject value; + if ((value = deleteConstant(id)) != null) { + if (value != UNDEF) { + return value; + } + context.getRuntime().getLoadService().removeAutoLoadFor(getName() + "::" + id); + // FIXME: I'm not sure this is right, but the old code returned + // the undef, which definitely isn't right... + return context.getRuntime().getNil(); + } + + if (hasConstantInHierarchy(id)) { + throw cannotRemoveError(id); + } + + throw context.getRuntime().newNameError("constant " + id + " not defined for " + getName(), id); + } + + private boolean hasConstantInHierarchy(final String name) { + for (RubyModule p = this; p != null; p = p.getSuperClass()) { + if (p.hasConstant(name)) { + return true; + } + } + return false; + } + + /** + * Base implementation of Module#const_missing, throws NameError for specific missing constant. + * + * @param name The constant name which was found to be missing + * @return Nothing! Absolutely nothing! (though subclasses might choose to return something) + */ + @JRubyMethod(name = "const_missing", required = 1, frame = true) + public IRubyObject const_missing(ThreadContext context, IRubyObject name, Block block) { + /* Uninitialized constant */ + if (this != context.getRuntime().getObject()) { + throw context.getRuntime().newNameError("uninitialized constant " + getName() + "::" + name.asJavaString(), "" + getName() + "::" + name.asJavaString()); + } + + throw context.getRuntime().newNameError("uninitialized constant " + name.asJavaString(), name.asJavaString()); + } + + /** rb_mod_constants + * + */ + @JRubyMethod(name = "constants") + public RubyArray constants(ThreadContext context) { + Ruby runtime = context.getRuntime(); + RubyArray array = runtime.newArray(); + RubyModule objectClass = runtime.getObject(); + + if (getRuntime().getModule() == this) { + + for (String name : objectClass.getStoredConstantNameList()) { + array.append(runtime.newString(name)); + } + + } else if (objectClass == this) { + + for (String name : getStoredConstantNameList()) { + array.append(runtime.newString(name)); + } + + } else { + Set<String> names = new HashSet<String>(); + for (RubyModule p = this; p != null; p = p.getSuperClass()) { + if (objectClass != p) { + for (String name : p.getStoredConstantNameList()) { + names.add(name); + } + } + } + for (String name : names) { + array.append(runtime.newString(name)); + } + } + + return array; + } + + + // + ////////////////// CLASS VARIABLE API METHODS //////////////// + // + + /** + * Set the named class variable to the given value, provided taint and freeze allow setting it. + * + * Ruby C equivalent = "rb_cvar_set" + * + * @param name The variable name to set + * @param value The value to set it to + */ + public IRubyObject setClassVar(String name, IRubyObject value) { + RubyModule module = this; + do { + if (module.hasClassVariable(name)) { + return module.storeClassVariable(name, value); + } + } while ((module = module.getSuperClass()) != null); + + return storeClassVariable(name, value); + } + + public IRubyObject fastSetClassVar(final String internedName, final IRubyObject value) { + assert internedName == internedName.intern() : internedName + " is not interned"; + RubyModule module = this; + do { + if (module.fastHasClassVariable(internedName)) { + return module.fastStoreClassVariable(internedName, value); + } + } while ((module = module.getSuperClass()) != null); + + return fastStoreClassVariable(internedName, value); + } + + /** + * Retrieve the specified class variable, searching through this module, included modules, and supermodules. + * + * Ruby C equivalent = "rb_cvar_get" + * + * @param name The name of the variable to retrieve + * @return The variable's value, or throws NameError if not found + */ + public IRubyObject getClassVar(String name) { + assert IdUtil.isClassVariable(name); + IRubyObject value; + RubyModule module = this; + + do { + if ((value = module.variableTableFetch(name)) != null) return value; + } while ((module = module.getSuperClass()) != null); + + throw getRuntime().newNameError("uninitialized class variable " + name + " in " + getName(), name); + } + + public IRubyObject fastGetClassVar(String internedName) { + assert internedName == internedName.intern() : internedName + " is not interned"; + assert IdUtil.isClassVariable(internedName); + IRubyObject value; + RubyModule module = this; + + do { + if ((value = module.variableTableFastFetch(internedName)) != null) return value; + } while ((module = module.getSuperClass()) != null); + + throw getRuntime().newNameError("uninitialized class variable " + internedName + " in " + getName(), internedName); + } + + /** + * Is class var defined? + * + * Ruby C equivalent = "rb_cvar_defined" + * + * @param name The class var to determine "is defined?" + * @return true if true, false if false + */ + public boolean isClassVarDefined(String name) { + RubyModule module = this; + do { + if (module.hasClassVariable(name)) return true; + } while ((module = module.getSuperClass()) != null); + + return false; + } + + public boolean fastIsClassVarDefined(String internedName) { + assert internedName == internedName.intern() : internedName + " is not interned"; + RubyModule module = this; + do { + if (module.fastHasClassVariable(internedName)) return true; + } while ((module = module.getSuperClass()) != null); + + return false; + } + + + /** rb_mod_remove_cvar + * + * FIXME: any good reason to have two identical methods? (same as remove_class_variable) + */ + public IRubyObject removeCvar(IRubyObject name) { // Wrong Parameter ? + String internedName = validateClassVariable(name.asJavaString()); + IRubyObject value; + + if ((value = deleteClassVariable(internedName)) != null) { + return value; + } + + if (fastIsClassVarDefined(internedName)) { + throw cannotRemoveError(internedName); + } + + throw getRuntime().newNameError("class variable " + internedName + " not defined for " + getName(), internedName); + } + + + // + ////////////////// CONSTANT API METHODS //////////////// + // + + public IRubyObject getConstantAt(String name) { + IRubyObject value; + if ((value = fetchConstant(name)) != UNDEF) { + return value; + } + deleteConstant(name); + return getRuntime().getLoadService().autoload(getName() + "::" + name); + } + + public IRubyObject fastGetConstantAt(String internedName) { + assert internedName == internedName.intern() : internedName + " is not interned"; + IRubyObject value; + if ((value = fastFetchConstant(internedName)) != UNDEF) { + return value; + } + deleteConstant(internedName); + return getRuntime().getLoadService().autoload(getName() + "::" + internedName); + } + + /** + * Retrieve the named constant, invoking 'const_missing' should that be appropriate. + * + * @param name The constant to retrieve + * @return The value for the constant, or null if not found + */ + public IRubyObject getConstant(String name) { + assert IdUtil.isConstant(name); + boolean retryForModule = false; + IRubyObject value; + RubyModule p = this; + + retry: while (true) { + while (p != null) { + if ((value = p.constantTableFetch(name)) != null) { + if (value != UNDEF) { + return value; + } + p.deleteConstant(name); + if (getRuntime().getLoadService().autoload( + p.getName() + "::" + name) == null) { + break; + } + continue; + } + p = p.getSuperClass(); + } + + if (!retryForModule && !isClass()) { + retryForModule = true; + p = getRuntime().getObject(); + continue retry; + } + + break; + } + + return callMethod(getRuntime().getCurrentContext(), + "const_missing", getRuntime().newSymbol(name)); + } + + public IRubyObject fastGetConstant(String internedName) { + assert internedName == internedName.intern() : internedName + " is not interned"; + assert IdUtil.isConstant(internedName); + boolean retryForModule = false; + IRubyObject value; + RubyModule p = this; + + retry: while (true) { + while (p != null) { + if ((value = p.constantTableFastFetch(internedName)) != null) { + if (value != UNDEF) { + return value; + } + p.deleteConstant(internedName); + if (getRuntime().getLoadService().autoload( + p.getName() + "::" + internedName) == null) { + break; + } + continue; + } + p = p.getSuperClass(); + } + + if (!retryForModule && !isClass()) { + retryForModule = true; + p = getRuntime().getObject(); + continue retry; + } + + break; + } + + return callMethod(getRuntime().getCurrentContext(), + "const_missing", getRuntime().fastNewSymbol(internedName)); + } + + // not actually called anywhere (all known uses call the fast version) + public IRubyObject getConstantFrom(String name) { + return fastGetConstantFrom(name.intern()); + } + + public IRubyObject fastGetConstantFrom(String internedName) { + assert internedName == internedName.intern() : internedName + " is not interned"; + assert IdUtil.isConstant(internedName); + RubyClass objectClass = getRuntime().getObject(); + IRubyObject value; + + RubyModule p = this; + + while (p != null) { + if ((value = p.constantTableFastFetch(internedName)) != null) { + if (value != UNDEF) { + if (p == objectClass && this != objectClass) { + String badCName = getName() + "::" + internedName; + getRuntime().getWarnings().warn(ID.CONSTANT_BAD_REFERENCE, "toplevel constant " + + internedName + " referenced by " + badCName, badCName); + } + return value; + } + p.deleteConstant(internedName); + if (getRuntime().getLoadService().autoload( + p.getName() + "::" + internedName) == null) { + break; + } + continue; + } + p = p.getSuperClass(); + } + + return callMethod(getRuntime().getCurrentContext(), + "const_missing", getRuntime().fastNewSymbol(internedName)); + } + /** + * Set the named constant on this module. Also, if the value provided is another Module and + * that module has not yet been named, assign it the specified name. + * + * @param name The name to assign + * @param value The value to assign to it; if an unnamed Module, also set its basename to name + * @return The result of setting the variable. + */ + public IRubyObject setConstant(String name, IRubyObject value) { + IRubyObject oldValue; + if ((oldValue = fetchConstant(name)) != null) { + if (oldValue == UNDEF) { + getRuntime().getLoadService().removeAutoLoadFor(getName() + "::" + name); + } else { + getRuntime().getWarnings().warn(ID.CONSTANT_ALREADY_INITIALIZED, "already initialized constant " + name, name); + } + } + + storeConstant(name, value); + + // if adding a module under a constant name, set that module's basename to the constant name + if (value instanceof RubyModule) { + RubyModule module = (RubyModule)value; + if (module.getBaseName() == null) { + module.setBaseName(name); + module.setParent(this); + } + /* + module.setParent(this); + */ + } + return value; + } + + public IRubyObject fastSetConstant(String internedName, IRubyObject value) { + assert internedName == internedName.intern() : internedName + " is not interned"; + IRubyObject oldValue; + if ((oldValue = fastFetchConstant(internedName)) != null) { + if (oldValue == UNDEF) { + getRuntime().getLoadService().removeAutoLoadFor(getName() + "::" + internedName); + } else { + getRuntime().getWarnings().warn(ID.CONSTANT_ALREADY_INITIALIZED, "already initialized constant " + internedName, internedName); + } + } + + fastStoreConstant(internedName, value); + + // if adding a module under a constant name, set that module's basename to the constant name + if (value instanceof RubyModule) { + RubyModule module = (RubyModule)value; + if (module.getBaseName() == null) { + module.setBaseName(internedName); + module.setParent(this); + } + /* + module.setParent(this); + */ + } + return value; + } + + /** rb_define_const + * + */ + public void defineConstant(String name, IRubyObject value) { + assert value != null; + + if (this == getRuntime().getClassClass()) { + getRuntime().secure(4); + } + + if (!IdUtil.isValidConstantName(name)) { + throw getRuntime().newNameError("bad constant name " + name, name); + } + + setConstant(name, value); + } + + // Fix for JRUBY-1339 - search hierarchy for constant + /** rb_const_defined_at + * + */ + public boolean isConstantDefined(String name) { + assert IdUtil.isConstant(name); + boolean isObject = this == getRuntime().getObject(); + + RubyModule module = this; + + do { + Object value; + if ((value = module.constantTableFetch(name)) != null) { + if (value != UNDEF) return true; + return getRuntime().getLoadService().autoloadFor( + module.getName() + "::" + name) != null; + } + + } while (isObject && (module = module.getSuperClass()) != null ); + + return false; + } + + public boolean fastIsConstantDefined(String internedName) { + assert internedName == internedName.intern() : internedName + " is not interned"; + assert IdUtil.isConstant(internedName); + boolean isObject = this == getRuntime().getObject(); + + RubyModule module = this; + + do { + Object value; + if ((value = module.constantTableFastFetch(internedName)) != null) { + if (value != UNDEF) return true; + return getRuntime().getLoadService().autoloadFor( + module.getName() + "::" + internedName) != null; + } + + } while (isObject && (module = module.getSuperClass()) != null ); + + return false; + } + + // + ////////////////// COMMON CONSTANT / CVAR METHODS //////////////// + // + + private RaiseException cannotRemoveError(String id) { + return getRuntime().newNameError("cannot remove " + id + " for " + getName(), id); + } + + + // + ////////////////// INTERNAL MODULE VARIABLE API METHODS //////////////// + // + + /** + * Behaves similarly to {@link #getClassVar(String)}. Searches this + * class/module <em>and its ancestors</em> for the specified internal + * variable. + * + * @param name the internal variable name + * @return the value of the specified internal variable if found, else null + * @see #setInternalModuleVariable(String, IRubyObject) + */ + public boolean hasInternalModuleVariable(final String name) { + RubyModule module = this; + do { + if (module.hasInternalVariable(name)) { + return true; + } + } while ((module = module.getSuperClass()) != null); + + return false; + } + /** + * Behaves similarly to {@link #getClassVar(String)}. Searches this + * class/module <em>and its ancestors</em> for the specified internal + * variable. + * + * @param name the internal variable name + * @return the value of the specified internal variable if found, else null + * @see #setInternalModuleVariable(String, IRubyObject) + */ + public IRubyObject searchInternalModuleVariable(final String name) { + RubyModule module = this; + IRubyObject value; + do { + if ((value = module.getInternalVariable(name)) != null) { + return value; + } + } while ((module = module.getSuperClass()) != null); + + return null; + } + + /** + * Behaves similarly to {@link #setClassVar(String, IRubyObject)}. If the + * specified internal variable is found in this class/module <em>or an ancestor</em>, + * it is set where found. Otherwise it is set in this module. + * + * @param name the internal variable name + * @param value the internal variable value + * @see #searchInternalModuleVariable(String) + */ + public void setInternalModuleVariable(final String name, final IRubyObject value) { + RubyModule module = this; + do { + if (module.hasInternalVariable(name)) { + module.setInternalVariable(name, value); + return; + } + } while ((module = module.getSuperClass()) != null); + + setInternalVariable(name, value); + } + + // + ////////////////// LOW-LEVEL CLASS VARIABLE INTERFACE //////////////// + // + // fetch/store/list class variables for this module + // + + public boolean hasClassVariable(String name) { + assert IdUtil.isClassVariable(name); + return variableTableContains(name); + } + + public boolean fastHasClassVariable(String internedName) { + assert IdUtil.isClassVariable(internedName); + return variableTableFastContains(internedName); + } + + public IRubyObject fetchClassVariable(String name) { + assert IdUtil.isClassVariable(name); + return variableTableFetch(name); + } + + public IRubyObject fastFetchClassVariable(String internedName) { + assert IdUtil.isClassVariable(internedName); + return variableTableFastFetch(internedName); + } + + public IRubyObject storeClassVariable(String name, IRubyObject value) { + assert IdUtil.isClassVariable(name) && value != null; + ensureClassVariablesSettable(); + return variableTableStore(name, value); + } + + public IRubyObject fastStoreClassVariable(String internedName, IRubyObject value) { + assert IdUtil.isClassVariable(internedName) && value != null; + ensureClassVariablesSettable(); + return variableTableFastStore(internedName, value); + } + + public IRubyObject deleteClassVariable(String name) { + assert IdUtil.isClassVariable(name); + ensureClassVariablesSettable(); + return variableTableRemove(name); + } + + public List<Variable<IRubyObject>> getClassVariableList() { + ArrayList<Variable<IRubyObject>> list = new ArrayList<Variable<IRubyObject>>(); + VariableTableEntry[] table = variableTableGetTable(); + IRubyObject readValue; + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + if (IdUtil.isClassVariable(e.name)) { + if ((readValue = e.value) == null) readValue = variableTableReadLocked(e); + list.add(new VariableEntry<IRubyObject>(e.name, readValue)); + } + } + } + return list; + } + + public List<String> getClassVariableNameList() { + ArrayList<String> list = new ArrayList<String>(); + VariableTableEntry[] table = variableTableGetTable(); + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + if (IdUtil.isClassVariable(e.name)) { + list.add(e.name); + } + } + } + return list; + } + + protected static final String ERR_INSECURE_SET_CLASS_VAR = "Insecure: can't modify class variable"; + protected static final String ERR_FROZEN_CVAR_TYPE = "class/module "; + + protected final String validateClassVariable(String name) { + if (IdUtil.isValidClassVariableName(name)) { + return name; + } + throw getRuntime().newNameError("`" + name + "' is not allowed as a class variable name", name); + } + + protected final void ensureClassVariablesSettable() { + Ruby runtime = getRuntime(); + + if (!isFrozen() && (runtime.getSafeLevel() < 4 || isTaint())) { + return; + } + + if (runtime.getSafeLevel() >= 4 && !isTaint()) { + throw runtime.newSecurityError(ERR_INSECURE_SET_CONSTANT); + } + if (isFrozen()) { + if (this instanceof RubyModule) { + throw runtime.newFrozenError(ERR_FROZEN_CONST_TYPE); + } else { + throw runtime.newFrozenError(""); + } + } + } + + // + ////////////////// LOW-LEVEL CONSTANT INTERFACE //////////////// + // + // fetch/store/list constants for this module + // + + public boolean hasConstant(String name) { + assert IdUtil.isConstant(name); + return constantTableContains(name); + } + + public boolean fastHasConstant(String internedName) { + assert IdUtil.isConstant(internedName); + return constantTableFastContains(internedName); + } + + // returns the stored value without processing undefs (autoloads) + public IRubyObject fetchConstant(String name) { + assert IdUtil.isConstant(name); + return constantTableFetch(name); + } + + // returns the stored value without processing undefs (autoloads) + public IRubyObject fastFetchConstant(String internedName) { + assert IdUtil.isConstant(internedName); + return constantTableFastFetch(internedName); + } + + public IRubyObject storeConstant(String name, IRubyObject value) { + assert IdUtil.isConstant(name) && value != null; + ensureConstantsSettable(); + return constantTableStore(name, value); + } + + public IRubyObject fastStoreConstant(String internedName, IRubyObject value) { + assert IdUtil.isConstant(internedName) && value != null; + ensureConstantsSettable(); + return constantTableFastStore(internedName, value); + } + + // removes and returns the stored value without processing undefs (autoloads) + public IRubyObject deleteConstant(String name) { + assert IdUtil.isConstant(name); + ensureConstantsSettable(); + return constantTableRemove(name); + } + + public List<Variable<IRubyObject>> getStoredConstantList() { + ArrayList<Variable<IRubyObject>> list = new ArrayList<Variable<IRubyObject>>(); + ConstantTableEntry[] table = constantTableGetTable(); + for (int i = table.length; --i >= 0; ) { + for (ConstantTableEntry e = table[i]; e != null; e = e.next) { + list.add(e); + } + } + return list; + } + + public List<String> getStoredConstantNameList() { + ArrayList<String> list = new ArrayList<String>(); + ConstantTableEntry[] table = constantTableGetTable(); + for (int i = table.length; --i >= 0; ) { + for (ConstantTableEntry e = table[i]; e != null; e = e.next) { + list.add(e.name); + } + } + return list; + } + + protected static final String ERR_INSECURE_SET_CONSTANT = "Insecure: can't modify constant"; + protected static final String ERR_FROZEN_CONST_TYPE = "class/module "; + + protected final String validateConstant(String name) { + if (IdUtil.isValidConstantName(name)) { + return name; + } + throw getRuntime().newNameError("wrong constant name " + name, name); + } + + protected final void ensureConstantsSettable() { + Ruby runtime = getRuntime(); + + if (!isFrozen() && (runtime.getSafeLevel() < 4 || isTaint())) { + return; + } + + if (runtime.getSafeLevel() >= 4 && !isTaint()) { + throw runtime.newSecurityError(ERR_INSECURE_SET_CONSTANT); + } + if (isFrozen()) { + if (this instanceof RubyModule) { + throw runtime.newFrozenError(ERR_FROZEN_CONST_TYPE); + } else { + throw runtime.newFrozenError(""); + } + } + } + + + // + ////////////////// VARIABLE TABLE METHODS //////////////// + // + // Overridden to use variableWriteLock in place of synchronization + // + + @Override + protected IRubyObject variableTableStore(String name, IRubyObject value) { + int hash = name.hashCode(); + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + VariableTableEntry[] table; + VariableTableEntry e; + if ((table = variableTable) == null) { + table = new VariableTableEntry[VARIABLE_TABLE_DEFAULT_CAPACITY]; + e = new VariableTableEntry(hash, name.intern(), value, null); + table[hash & (VARIABLE_TABLE_DEFAULT_CAPACITY - 1)] = e; + variableTableThreshold = (int)(VARIABLE_TABLE_DEFAULT_CAPACITY * VARIABLE_TABLE_LOAD_FACTOR); + variableTableSize = 1; + variableTable = table; + return value; + } + int potentialNewSize; + if ((potentialNewSize = variableTableSize + 1) > variableTableThreshold) { + table = variableTableRehash(); + } + int index; + for (e = table[index = hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + e.value = value; + return value; + } + } + // external volatile value initialization intended to obviate the need for + // readValueUnderLock technique used in ConcurrentHashMap. may be a little + // slower, but better to pay a price on first write rather than all reads. + e = new VariableTableEntry(hash, name.intern(), value, table[index]); + table[index] = e; + variableTableSize = potentialNewSize; + variableTable = table; // write-volatile + } finally { + lock.unlock(); + } + return value; + } + + @Override + protected IRubyObject variableTableFastStore(String internedName, IRubyObject value) { + assert internedName == internedName.intern() : internedName + " not interned"; + int hash = internedName.hashCode(); + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + VariableTableEntry[] table; + VariableTableEntry e; + if ((table = variableTable) == null) { + table = new VariableTableEntry[VARIABLE_TABLE_DEFAULT_CAPACITY]; + e = new VariableTableEntry(hash, internedName, value, null); + table[hash & (VARIABLE_TABLE_DEFAULT_CAPACITY - 1)] = e; + variableTableThreshold = (int)(VARIABLE_TABLE_DEFAULT_CAPACITY * VARIABLE_TABLE_LOAD_FACTOR); + variableTableSize = 1; + variableTable = table; + return value; + } + int potentialNewSize; + if ((potentialNewSize = variableTableSize + 1) > variableTableThreshold) { + table = variableTableRehash(); + } + int index; + for (e = table[index = hash & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + e.value = value; + return value; + } + } + // external volatile value initialization intended to obviate the need for + // readValueUnderLock technique used in ConcurrentHashMap. may be a little + // slower, but better to pay a price on first write rather than all reads. + e = new VariableTableEntry(hash, internedName, value, table[index]); + table[index] = e; + variableTableSize = potentialNewSize; + variableTable = table; // write-volatile + } finally { + lock.unlock(); + } + return value; + } + + @Override + protected IRubyObject variableTableRemove(String name) { + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + VariableTableEntry[] table; + if ((table = variableTable) != null) { + int hash = name.hashCode(); + int index = hash & (table.length - 1); + VariableTableEntry first = table[index]; + VariableTableEntry e; + for (e = first; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + IRubyObject oldValue = e.value; + // All entries following removed node can stay + // in list, but all preceding ones need to be + // cloned. + VariableTableEntry newFirst = e.next; + for (VariableTableEntry p = first; p != e; p = p.next) { + newFirst = new VariableTableEntry(p.hash, p.name, p.value, newFirst); + } + table[index] = newFirst; + variableTableSize--; + variableTable = table; // write-volatile + return oldValue; + } + } + } + } finally { + lock.unlock(); + } + return null; + } + + @Override + protected IRubyObject variableTableReadLocked(VariableTableEntry entry) { + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + return entry.value; + } finally { + lock.unlock(); + } + } + + @Override + protected void variableTableSync(List<Variable<IRubyObject>> vars) { + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + variableTableSize = 0; + variableTableThreshold = (int)(VARIABLE_TABLE_DEFAULT_CAPACITY * VARIABLE_TABLE_LOAD_FACTOR); + variableTable = new VariableTableEntry[VARIABLE_TABLE_DEFAULT_CAPACITY]; + for (Variable<IRubyObject> var : vars) { + assert !var.isConstant() && var.getValue() != null; + variableTableStore(var.getName(), var.getValue()); + } + } finally { + lock.unlock(); + } + } + + @Override + public void syncVariables(List<Variable<IRubyObject>> variables) { + ArrayList<Variable<IRubyObject>> constants = new ArrayList<Variable<IRubyObject>>(variables.size()); + Variable<IRubyObject> var; + for (Iterator<Variable<IRubyObject>> iter = variables.iterator(); iter.hasNext(); ) { + if ((var = iter.next()).isConstant()) { + constants.add(var); + iter.remove(); + } + } + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + variableTableSync(variables); + constantTableSync(constants); + } finally { + lock.unlock(); + } + } + + @Override + @SuppressWarnings("unchecked") + @Deprecated // born deprecated + public Map getVariableMap() { + Map map = variableTableGetMap(); + constantTableGetMap(map); + return map; + } + + @Override + public boolean hasVariables() { + return variableTableGetSize() > 0 || constantTableGetSize() > 0; + } + + @Override + public int getVariableCount() { + return variableTableGetSize() + constantTableGetSize(); + } + + @Override + public List<Variable<IRubyObject>> getVariableList() { + VariableTableEntry[] vtable = variableTableGetTable(); + ConstantTableEntry[] ctable = constantTableGetTable(); + ArrayList<Variable<IRubyObject>> list = new ArrayList<Variable<IRubyObject>>(); + IRubyObject readValue; + for (int i = vtable.length; --i >= 0; ) { + for (VariableTableEntry e = vtable[i]; e != null; e = e.next) { + if ((readValue = e.value) == null) readValue = variableTableReadLocked(e); + list.add(new VariableEntry<IRubyObject>(e.name, readValue)); + } + } + for (int i = ctable.length; --i >= 0; ) { + for (ConstantTableEntry e = ctable[i]; e != null; e = e.next) { + list.add(e); + } + } + return list; + } + + @Override + public List<String> getVariableNameList() { + VariableTableEntry[] vtable = variableTableGetTable(); + ConstantTableEntry[] ctable = constantTableGetTable(); + ArrayList<String> list = new ArrayList<String>(); + for (int i = vtable.length; --i >= 0; ) { + for (VariableTableEntry e = vtable[i]; e != null; e = e.next) { + list.add(e.name); + } + } + for (int i = ctable.length; --i >= 0; ) { + for (ConstantTableEntry e = ctable[i]; e != null; e = e.next) { + list.add(e.name); + } + } + return list; + } + + + // + ////////////////// CONSTANT TABLE METHODS, ETC. //////////////// + // + + protected static final int CONSTANT_TABLE_DEFAULT_CAPACITY = 8; // MUST be power of 2! + protected static final int CONSTANT_TABLE_MAXIMUM_CAPACITY = 1 << 30; + protected static final float CONSTANT_TABLE_LOAD_FACTOR = 0.75f; + + protected static final class ConstantTableEntry implements Variable<IRubyObject> { + final int hash; + final String name; + final IRubyObject value; + final ConstantTableEntry next; + + // constant table entry values are final; if a constant is redefined, the + // entry will be removed and replaced with a new entry. + ConstantTableEntry( + int hash, + String name, + IRubyObject value, + ConstantTableEntry next) { + this.hash = hash; + this.name = name; + this.value = value; + this.next = next; + } + + public String getName() { + return name; + } + + public IRubyObject getValue() { + return value; + } + public final boolean isClassVariable() { + return false; + } + + public final boolean isConstant() { + return true; + } + + public final boolean isInstanceVariable() { + return false; + } + + public final boolean isRubyVariable() { + return true; + } + } + + protected boolean constantTableContains(String name) { + int hash = name.hashCode(); + ConstantTableEntry[] table; + for (ConstantTableEntry e = (table = constantTable)[hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + return true; + } + } + return false; + } + + protected boolean constantTableFastContains(String internedName) { + ConstantTableEntry[] table; + for (ConstantTableEntry e = (table = constantTable)[internedName.hashCode() & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + return true; + } + } + return false; + } + + protected IRubyObject constantTableFetch(String name) { + int hash = name.hashCode(); + ConstantTableEntry[] table; + for (ConstantTableEntry e = (table = constantTable)[hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + return e.value; + } + } + return null; + } + + protected IRubyObject constantTableFastFetch(String internedName) { + ConstantTableEntry[] table; + for (ConstantTableEntry e = (table = constantTable)[internedName.hashCode() & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + return e.value; + } + } + return null; + } + + protected IRubyObject constantTableStore(String name, IRubyObject value) { + int hash = name.hashCode(); + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + ConstantTableEntry[] table; + ConstantTableEntry e; + ConstantTableEntry first; + int potentialNewSize; + if ((potentialNewSize = constantTableSize + 1) > constantTableThreshold) { + table = constantTableRehash(); + } else { + table = constantTable; + } + int index; + for (e = first = table[index = hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + // if value is unchanged, do nothing + if (value == e.value) { + return value; + } + // create new entry, prepend to any trailing entries + ConstantTableEntry newFirst = new ConstantTableEntry(e.hash, e.name, value, e.next); + // all entries before this one must be cloned + for (ConstantTableEntry n = first; n != e; n = n.next) { + newFirst = new ConstantTableEntry(n.hash, n.name, n.value, newFirst); + } + table[index] = newFirst; + constantTable = table; // write-volatile + return value; + } + } + table[index] = new ConstantTableEntry(hash, name.intern(), value, table[index]); + constantTableSize = potentialNewSize; + constantTable = table; // write-volatile + } finally { + lock.unlock(); + } + return value; + } + + protected IRubyObject constantTableFastStore(String internedName, IRubyObject value) { + assert internedName == internedName.intern() : internedName + " not interned"; + int hash = internedName.hashCode(); + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + ConstantTableEntry[] table; + ConstantTableEntry e; + ConstantTableEntry first; + int potentialNewSize; + if ((potentialNewSize = constantTableSize + 1) > constantTableThreshold) { + table = constantTableRehash(); + } else { + table = constantTable; + } + int index; + for (e = first = table[index = hash & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + // if value is unchanged, do nothing + if (value == e.value) { + return value; + } + // create new entry, prepend to any trailing entries + ConstantTableEntry newFirst = new ConstantTableEntry(e.hash, e.name, value, e.next); + // all entries before this one must be cloned + for (ConstantTableEntry n = first; n != e; n = n.next) { + newFirst = new ConstantTableEntry(n.hash, n.name, n.value, newFirst); + } + table[index] = newFirst; + constantTable = table; // write-volatile + return value; + } + } + table[index] = new ConstantTableEntry(hash, internedName, value, table[index]); + constantTableSize = potentialNewSize; + constantTable = table; // write-volatile + } finally { + lock.unlock(); + } + return value; + } + + protected IRubyObject constantTableRemove(String name) { + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + ConstantTableEntry[] table; + if ((table = constantTable) != null) { + int hash = name.hashCode(); + int index = hash & (table.length - 1); + ConstantTableEntry first = table[index]; + ConstantTableEntry e; + for (e = first; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + IRubyObject oldValue = e.value; + // All entries following removed node can stay + // in list, but all preceding ones need to be + // cloned. + ConstantTableEntry newFirst = e.next; + for (ConstantTableEntry p = first; p != e; p = p.next) { + newFirst = new ConstantTableEntry(p.hash, p.name, p.value, newFirst); + } + table[index] = newFirst; + constantTableSize--; + constantTable = table; // write-volatile + return oldValue; + } + } + } + } finally { + lock.unlock(); + } + return null; + } + + + protected ConstantTableEntry[] constantTableGetTable() { + return constantTable; + } + + protected int constantTableGetSize() { + if (constantTable != null) { + return constantTableSize; + } + return 0; + } + + protected void constantTableSync(List<Variable<IRubyObject>> vars) { + ReentrantLock lock; + (lock = variableWriteLock).lock(); + try { + constantTableSize = 0; + constantTableThreshold = (int)(CONSTANT_TABLE_DEFAULT_CAPACITY * CONSTANT_TABLE_LOAD_FACTOR); + constantTable = new ConstantTableEntry[CONSTANT_TABLE_DEFAULT_CAPACITY]; + for (Variable<IRubyObject> var : vars) { + assert var.isConstant() && var.getValue() != null; + constantTableStore(var.getName(), var.getValue()); + } + } finally { + lock.unlock(); + } + } + + // MUST be called from synchronized/locked block! + // should only be called by constantTableStore/constantTableFastStore + private final ConstantTableEntry[] constantTableRehash() { + ConstantTableEntry[] oldTable = constantTable; + int oldCapacity; + if ((oldCapacity = oldTable.length) >= CONSTANT_TABLE_MAXIMUM_CAPACITY) { + return oldTable; + } + + int newCapacity = oldCapacity << 1; + ConstantTableEntry[] newTable = new ConstantTableEntry[newCapacity]; + constantTableThreshold = (int)(newCapacity * CONSTANT_TABLE_LOAD_FACTOR); + int sizeMask = newCapacity - 1; + ConstantTableEntry e; + for (int i = oldCapacity; --i >= 0; ) { + // We need to guarantee that any existing reads of old Map can + // proceed. So we cannot yet null out each bin. + e = oldTable[i]; + + if (e != null) { + ConstantTableEntry next = e.next; + int idx = e.hash & sizeMask; + + // Single node on list + if (next == null) + newTable[idx] = e; + + else { + // Reuse trailing consecutive sequence at same slot + ConstantTableEntry lastRun = e; + int lastIdx = idx; + for (ConstantTableEntry last = next; + last != null; + last = last.next) { + int k = last.hash & sizeMask; + if (k != lastIdx) { + lastIdx = k; + lastRun = last; + } + } + newTable[lastIdx] = lastRun; + + // Clone all remaining nodes + for (ConstantTableEntry p = e; p != lastRun; p = p.next) { + int k = p.hash & sizeMask; + ConstantTableEntry m = new ConstantTableEntry(p.hash, p.name, p.value, newTable[k]); + newTable[k] = m; + } + } + } + } + constantTable = newTable; + return newTable; + } + + + /** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */ + @SuppressWarnings("unchecked") + protected Map constantTableGetMap() { + HashMap map = new HashMap(); + ConstantTableEntry[] table; + if ((table = constantTable) != null) { + for (int i = table.length; --i >= 0; ) { + for (ConstantTableEntry e = table[i]; e != null; e = e.next) { + map.put(e.name, e.value); + } + } + } + return map; + } + + /** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */ + @SuppressWarnings("unchecked") + protected Map constantTableGetMap(Map map) { + ConstantTableEntry[] table; + if ((table = constantTable) != null) { + for (int i = table.length; --i >= 0; ) { + for (ConstantTableEntry e = table[i]; e != null; e = e.next) { + map.put(e.name, e.value); + } + } + } + return map; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ + +package org.jruby; + +import static org.jruby.runtime.Visibility.PRIVATE; +import static org.jruby.runtime.Visibility.PROTECTED; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.exceptions.JumpException; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallType; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.Sprintf; + +/** + * @author Anders Bengtsson + */ +@JRubyClass(name="NameError", parent="StandardError") +public class RubyNameError extends RubyException { + private IRubyObject name; + + /** + * Nested class whose instances act as thunks reacting to to_str method + * called from (Exception#to_str, Exception#message) + * MRI equivalent: rb_cNameErrorMesg, class name: "message", construction method: "!", + * to_str implementation: "name_err_mesg_to_str" + * + * TODO: this class should not be lookupable + */ + @JRubyClass(name = "NameError::Message", parent = "Object") + public static final class RubyNameErrorMessage extends RubyObject { + + static ObjectAllocator NAMEERRORMESSAGE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + IRubyObject dummy = new RubyObject(runtime, runtime.getObject()); + return new RubyNameErrorMessage(runtime, dummy, dummy, Visibility.PRIVATE, CallType.VARIABLE); + } + }; + + private final IRubyObject object; + private final IRubyObject method; + private final Visibility visibility; + private final CallType callType; + + RubyNameErrorMessage(Ruby runtime, IRubyObject object, IRubyObject method, Visibility visibility, CallType callType) { + super(runtime, runtime.getNameErrorMessage(), false); + this.object = object; + this.method = method; + this.visibility = visibility; + this.callType = callType; + } + + @JRubyMethod(name = "_load", meta = true) + public static IRubyObject load(IRubyObject recv, IRubyObject arg) { + return arg; + } + + @JRubyMethod(name = "_dump") + public IRubyObject dump(ThreadContext context, IRubyObject arg) { + return to_str(context); + } + + @JRubyMethod(name = "to_str") + public IRubyObject to_str(ThreadContext context) { + String format = null; + + if (visibility == PRIVATE) { + format = "private method `%s' called for %s"; + } else if (visibility == PROTECTED) { + format = "protected method `%s' called for %s"; + } else if (callType == CallType.VARIABLE) { + format = "undefined local variable or method `%s' for %s"; + } else if (callType == CallType.SUPER) { + format = "super: no superclass method `%s'"; + } + + if (format == null) format = "undefined method `%s' for %s"; + + String description = null; + + if (object.isNil()) { + description = "nil"; + } else if (object instanceof RubyBoolean && object.isTrue()) { + description = "true"; + } else if (object instanceof RubyBoolean && !object.isTrue()) { + description = "false"; + } else { + try { + description = RubyObject.inspect(context, object).toString(); + } catch(JumpException e) {} + + if (description == null || description.length() > 65) description = object.anyToString().toString(); + } + + if (description.length() == 0 || (description.length() > 0 && description.charAt(0) != '#')) { + description = description + ":" + object.getMetaClass().getRealClass().getName(); + } + + Ruby runtime = getRuntime(); + RubyArray arr = runtime.newArray(method, runtime.newString(description)); + RubyString msg = runtime.newString(Sprintf.sprintf(runtime.newString(format), arr).toString()); + if (object.isTaint()) msg.setTaint(true); + return msg; + } + } + + private static ObjectAllocator NAMEERROR_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyNameError(runtime, klass); + } + }; + + public static RubyClass createNameErrorClass(Ruby runtime, RubyClass standardErrorClass) { + RubyClass nameErrorClass = runtime.defineClass("NameError", standardErrorClass, NAMEERROR_ALLOCATOR); + nameErrorClass.defineAnnotatedMethods(RubyNameError.class); + return nameErrorClass; + } + + public static RubyClass createNameErrorMessageClass(Ruby runtime, RubyClass nameErrorClass) { + RubyClass messageClass = nameErrorClass.defineClassUnder("Message", runtime.getObject(), RubyNameErrorMessage.NAMEERRORMESSAGE_ALLOCATOR); + messageClass.defineAnnotatedMethods(RubyNameErrorMessage.class); + return messageClass; + } + + protected RubyNameError(Ruby runtime, RubyClass exceptionClass) { + this(runtime, exceptionClass, exceptionClass.getName()); + } + + public RubyNameError(Ruby runtime, RubyClass exceptionClass, String message) { + this(runtime, exceptionClass, message, null); + } + + public RubyNameError(Ruby runtime, RubyClass exceptionClass, String message, String name) { + super(runtime, exceptionClass, message); + this.name = name == null ? runtime.getNil() : runtime.newString(name); + } + + @JRubyMethod(name = "exception", rest = true, meta = true) + public static RubyException newRubyNameError(IRubyObject recv, IRubyObject[] args) { + RubyClass klass = (RubyClass)recv; + + RubyException newError = (RubyException) klass.allocate(); + + newError.callInit(args, Block.NULL_BLOCK); + + return newError; + } + + @JRubyMethod(name = "initialize", optional = 2, frame = true) + @Override + public IRubyObject initialize(IRubyObject[] args, Block block) { + if (args.length > 1) { + name = args[args.length - 1]; + int newLength = args.length > 2 ? args.length - 2 : args.length - 1; + + IRubyObject []tmpArgs = new IRubyObject[newLength]; + System.arraycopy(args, 0, tmpArgs, 0, newLength); + args = tmpArgs; + } else { + name = getRuntime().getNil(); + } + + super.initialize(args, block); + return this; + } + + @JRubyMethod(name = "to_s") + @Override + public IRubyObject to_s() { + if (message.isNil()) return getRuntime().newString(message.getMetaClass().getName()); + RubyString str = message.convertToString(); + if (str != message) message = str; + if (isTaint()) message.setTaint(true); + return message; + } + + @JRubyMethod(name = "name") + public IRubyObject name() { + return name; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * + * @author jpetersen + */ +@JRubyClass(name="NilClass") +public class RubyNil extends RubyObject { + public RubyNil(Ruby runtime) { + super(runtime, runtime.getNilClass(), false); + flags |= NIL_F | FALSE_F; + } + + public static final ObjectAllocator NIL_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return runtime.getNil(); + } + }; + + public static RubyClass createNilClass(Ruby runtime) { + RubyClass nilClass = runtime.defineClass("NilClass", runtime.getObject(), NIL_ALLOCATOR); + runtime.setNilClass(nilClass); + nilClass.index = ClassIndex.NIL; + + nilClass.defineAnnotatedMethods(RubyNil.class); + + nilClass.getMetaClass().undefineMethod("new"); + + // FIXME: This is causing a verification error for some reason + //nilClass.dispatcher = callbackFactory.createDispatcher(nilClass); + + return nilClass; + } + + @Override + public int getNativeTypeIndex() { + return ClassIndex.NIL; + } + + @Override + public boolean isImmediate() { + return true; + } + + @Override + public RubyClass getSingletonClass() { + return metaClass; + } + + @Override + public Class<?> getJavaClass() { + return void.class; + } + + // Methods of the Nil Class (nil_*): + + /** nil_to_i + * + */ + @JRubyMethod(name = "to_i") + public static RubyFixnum to_i(IRubyObject recv) { + return RubyFixnum.zero(recv.getRuntime()); + } + + /** + * nil_to_f + * + */ + @JRubyMethod(name = "to_f") + public static RubyFloat to_f(IRubyObject recv) { + return RubyFloat.newFloat(recv.getRuntime(), 0.0D); + } + + /** nil_to_s + * + */ + @JRubyMethod(name = "to_s") + public static RubyString to_s(IRubyObject recv) { + return RubyString.newEmptyString(recv.getRuntime()); + } + + /** nil_to_a + * + */ + @JRubyMethod(name = "to_a") + public static RubyArray to_a(IRubyObject recv) { + return recv.getRuntime().newEmptyArray(); + } + + /** nil_inspect + * + */ + @JRubyMethod(name = "inspect") + public static RubyString inspect(IRubyObject recv) { + return recv.getRuntime().newString("nil"); + } + + /** nil_type + * + */ + @JRubyMethod(name = "type") + public static RubyClass type(IRubyObject recv) { + return recv.getRuntime().getNilClass(); + } + + /** nil_and + * + */ + @JRubyMethod(name = "&", required = 1) + public static RubyBoolean op_and(IRubyObject recv, IRubyObject obj) { + return recv.getRuntime().getFalse(); + } + + /** nil_or + * + */ + @JRubyMethod(name = "|", required = 1) + public static RubyBoolean op_or(IRubyObject recv, IRubyObject obj) { + return recv.getRuntime().newBoolean(obj.isTrue()); + } + + /** nil_xor + * + */ + @JRubyMethod(name = "^", required = 1) + public static RubyBoolean op_xor(IRubyObject recv, IRubyObject obj) { + return recv.getRuntime().newBoolean(obj.isTrue()); + } + + @JRubyMethod(name = "nil?") + public IRubyObject nil_p() { + return getRuntime().getTrue(); + } + + @Override + public RubyFixnum id() { + return getRuntime().newFixnum(4); + } + + @Override + public IRubyObject taint(ThreadContext context) { + return this; + } + + @Override + public IRubyObject freeze(ThreadContext context) { + return this; + } + + /** nilclass_to_c + * + */ + @JRubyMethod(name = "to_c", compat = CompatVersion.RUBY1_9) + public static IRubyObject to_c(ThreadContext context, IRubyObject recv) { + return RubyComplex.newComplexCanonicalize(context, RubyFixnum.zero(context.getRuntime())); + } + + /** nilclass_to_r + * + */ + @JRubyMethod(name = "to_r", compat = CompatVersion.RUBY1_9) + public static IRubyObject to_r(ThreadContext context, IRubyObject recv) { + return RubyRational.newRationalCanonicalize(context, RubyFixnum.zero(context.getRuntime())); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Koichiro Ohba <koichiro@meadowy.org> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.UnsupportedCharsetException; +import java.util.HashMap; +import java.util.Map; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; + +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.KCode; + +@JRubyModule(name="NKF") +public class RubyNKF { + public static final NKFCharset AUTO = new NKFCharset(0, "x-JISAutoDetect"); + public static final NKFCharset JIS = new NKFCharset(1, "iso-2022-jp"); + public static final NKFCharset EUC = new NKFCharset(2, "EUC-JP"); + public static final NKFCharset SJIS = new NKFCharset(3, "Windows-31J"); + public static final NKFCharset BINARY = new NKFCharset(4, null); + public static final NKFCharset NOCONV = new NKFCharset(4, null); + public static final NKFCharset UNKNOWN = new NKFCharset(0, null); + public static final NKFCharset ASCII = new NKFCharset(5, "iso-8859-1"); + public static final NKFCharset UTF8 = new NKFCharset(6, "UTF-8"); + public static final NKFCharset UTF16 = new NKFCharset(8, "UTF-16"); + public static final NKFCharset UTF32 = new NKFCharset(12, "UTF-32"); + public static final NKFCharset OTHER = new NKFCharset(16, null); + + public static class NKFCharset { + private final int value; + private final String charset; + + public NKFCharset(int v, String c) { + value = v; + charset = c; + } + + public int getValue() { + return value; + } + + public String getCharset() { + return charset; + } + } + + public static void createNKF(Ruby runtime) { + RubyModule nkfModule = runtime.defineModule("NKF"); + + nkfModule.defineConstant("AUTO", RubyFixnum.newFixnum(runtime, AUTO.getValue())); + nkfModule.defineConstant("JIS", RubyFixnum.newFixnum(runtime, JIS.getValue())); + nkfModule.defineConstant("EUC", RubyFixnum.newFixnum(runtime, EUC.getValue())); + nkfModule.defineConstant("SJIS", RubyFixnum.newFixnum(runtime, SJIS.getValue())); + nkfModule.defineConstant("BINARY", RubyFixnum.newFixnum(runtime, BINARY.getValue())); + nkfModule.defineConstant("NOCONV", RubyFixnum.newFixnum(runtime, NOCONV.getValue())); + nkfModule.defineConstant("UNKNOWN", RubyFixnum.newFixnum(runtime, UNKNOWN.getValue())); + nkfModule.defineConstant("ASCII", RubyFixnum.newFixnum(runtime, ASCII.getValue())); + nkfModule.defineConstant("UTF8", RubyFixnum.newFixnum(runtime, UTF8.getValue())); + nkfModule.defineConstant("UTF16", RubyFixnum.newFixnum(runtime, UTF16.getValue())); + nkfModule.defineConstant("UTF32", RubyFixnum.newFixnum(runtime, UTF32.getValue())); + nkfModule.defineConstant("OTHER", RubyFixnum.newFixnum(runtime, OTHER.getValue())); + + RubyString version = runtime.newString("2.0.7 (JRuby 2007-05-11)"); + RubyString nkfVersion = runtime.newString("2.0.7"); + RubyString nkfDate = runtime.newString("2007-05-11"); + + ThreadContext context = runtime.getCurrentContext(); + + version.freeze(context); + nkfVersion.freeze(context); + nkfDate.freeze(context); + + nkfModule.defineAnnotatedMethods(RubyNKF.class); + } + + @JRubyMethod(name = "guess", required = 1, module = true) + public static IRubyObject guess(ThreadContext context, IRubyObject recv, IRubyObject s) { + Ruby runtime = context.getRuntime(); + if (!s.respondsTo("to_str")) { + throw runtime.newTypeError("can't convert " + s.getMetaClass() + " into String"); + } + ByteList bytes = s.convertToString().getByteList(); + ByteBuffer buf = ByteBuffer.wrap(bytes.unsafeBytes(), bytes.begin(), bytes.length()); + CharsetDecoder decoder = Charset.forName("x-JISAutoDetect").newDecoder(); + try { + decoder.decode(buf); + } catch (CharacterCodingException e) { + return runtime.newFixnum(UNKNOWN.getValue()); + } + if (!decoder.isCharsetDetected()) { + return runtime.newFixnum(UNKNOWN.getValue()); + } + Charset charset = decoder.detectedCharset(); + String name = charset.name(); +// System.out.println("detect: " + name + "\n"); + if ("Shift_JIS".equals(name)) + return runtime.newFixnum(SJIS.getValue()); + if ("windows-31j".equals(name)) + return runtime.newFixnum(SJIS.getValue()); + else if ("EUC-JP".equals(name)) + return runtime.newFixnum(EUC.getValue()); + else if ("ISO-2022-JP".equals(name)) + return runtime.newFixnum(JIS.getValue()); + else + return runtime.newFixnum(UNKNOWN.getValue()); + } + + @JRubyMethod(name = "guess1", required = 1, module = true) + public static IRubyObject guess1(ThreadContext context, IRubyObject recv, IRubyObject str) { + return guess(context, recv, str); + } + + @JRubyMethod(name = "guess2", required = 1, module = true) + public static IRubyObject guess2(ThreadContext context, IRubyObject recv, IRubyObject str) { + return guess(context, recv, str); + } + + @JRubyMethod(name = "nkf", required = 2, module = true) + public static IRubyObject nkf(ThreadContext context, IRubyObject recv, IRubyObject opt, IRubyObject str) { + Ruby runtime = context.getRuntime(); + + if (!opt.respondsTo("to_str")) { + throw runtime.newTypeError("can't convert " + opt.getMetaClass() + " into String"); + } + + if (!str.respondsTo("to_str")) { + throw runtime.newTypeError("can't convert " + str.getMetaClass() + " into String"); + } + + Map<String, NKFCharset> options = parseOpt(opt.convertToString().toString()); + + NKFCharset nc = options.get("input"); + if (nc.getValue() == AUTO.getValue()) { + KCode kcode = runtime.getKCode(); + if (kcode == KCode.SJIS) { + nc = SJIS; + } else if (kcode == KCode.EUC) { + nc = EUC; + } else if (kcode == KCode.UTF8) { + nc = UTF8; + } + } + String decodeCharset = nc.getCharset(); + String encodeCharset = options.get("output").getCharset(); + + return convert(context, decodeCharset, encodeCharset, str); + } + + private static IRubyObject convert(ThreadContext context, String decodeCharset, + String encodeCharset, IRubyObject str) { + Ruby runtime = context.getRuntime(); + CharsetDecoder decoder; + CharsetEncoder encoder; + try { + decoder = Charset.forName(decodeCharset).newDecoder(); + encoder = Charset.forName(encodeCharset).newEncoder(); + } catch (UnsupportedCharsetException e) { + throw runtime.newArgumentError("invalid encoding"); + } + + ByteList bytes = str.convertToString().getByteList(); + ByteBuffer buf = ByteBuffer.wrap(bytes.unsafeBytes(), bytes.begin(), bytes.length()); + try { + CharBuffer cbuf = decoder.decode(buf); + buf = encoder.encode(cbuf); + } catch (CharacterCodingException e) { + throw runtime.newArgumentError("invalid encoding"); + } + byte[] arr = buf.array(); + + return runtime.newString(new ByteList(arr, 0, buf.limit())); + + } + + private static int optionUTF(String s, int i) { + int n = 8; + if (i+1 < s.length() && Character.isDigit(s.charAt(i+1))) { + n = Character.digit(s.charAt(i+1), 10); + if (i+2 < s.length() && Character.isDigit(s.charAt(i+2))) { + n *= 10; + n += Character.digit(s.charAt(i+2), 10); + } + } + return n; + } + + private static Map<String, NKFCharset> parseOpt(String s) { + Map<String, NKFCharset> options = new HashMap<String, NKFCharset>(); + + // default options + options.put("input", AUTO); + options.put("output", JIS); + + for (int i = 0; i < s.length(); i++) { + switch (s.charAt(i)) { + case 'b': + break; + case 'u': + break; + case 'j': // iso-2022-jp + options.put("output", JIS); + break; + case 's': // Shift_JIS + options.put("output", SJIS); + break; + case 'e': // EUC-JP + options.put("output", EUC); + break; + case 'w': // UTF-8 + { + int n = optionUTF(s, i); + if (n == 32) + options.put("output", UTF32); + else if (n == 16) + options.put("output", UTF16); + else + options.put("output", UTF8); + } + break; + case 'J': // iso-2022-jp + options.put("input", JIS); + break; + case 'S': // Shift_JIS + options.put("input", SJIS); + break; + case 'E': // EUC-JP + options.put("input", EUC); + break; + case 'W': // UTF-8 + { + int n = optionUTF(s, i); + if (n == 32) + options.put("input", UTF32); + else if (n == 16) + options.put("input", UTF16); + else + options.put("input", UTF8); + } + break; + case 't': + break; + case 'r': + break; + case 'h': + break; + case 'm': + break; + case 'M': + break; + case 'l': + break; + case 'f': + break; + case 'F': + break; + case 'Z': + break; + case 'X': + break; + case 'x': + break; + case 'B': + break; + case 'T': + break; + case 'd': + break; + case 'c': + break; + case 'I': + break; + case 'L': + break; + case '-': + if (s.charAt(i+1) == '-') { + // long name option + } + default: + } + } + return options; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ + +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.builtin.IRubyObject; + +@JRubyClass(name="NoMethodError", parent="NameError") +public class RubyNoMethodError extends RubyNameError { + private IRubyObject args; + + private static final ObjectAllocator NOMETHODERROR_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyNoMethodError(runtime, klass); + } + }; + + public static RubyClass createNoMethodErrorClass(Ruby runtime, RubyClass nameErrorClass) { + RubyClass noMethodErrorClass = runtime.defineClass("NoMethodError", nameErrorClass, NOMETHODERROR_ALLOCATOR); + + noMethodErrorClass.defineAnnotatedMethods(RubyNoMethodError.class); + + return noMethodErrorClass; + } + + protected RubyNoMethodError(Ruby runtime, RubyClass exceptionClass) { + super(runtime, exceptionClass, exceptionClass.getName()); + this.args = runtime.getNil(); + } + + public RubyNoMethodError(Ruby runtime, RubyClass exceptionClass, String message, String name, IRubyObject args) { + super(runtime, exceptionClass, message, name); + this.args = args; + } + + @JRubyMethod(name = "initialize", optional = 3, frame = true) + public IRubyObject initialize(IRubyObject[] args, Block block) { + if (args.length > 2) { + this.args = args[args.length - 1]; + IRubyObject []tmpArgs = new IRubyObject[args.length - 1]; + System.arraycopy(args, 0, tmpArgs, 0, tmpArgs.length); + args = tmpArgs; + } else { + this.args = getRuntime().getNil(); + } + + super.initialize(args, block); + return this; + } + + @JRubyMethod(name = "args") + public IRubyObject args() { + return args; + } + +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2006 Antti Karanta <Antti.Karanta@napa.fi> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import static org.jruby.util.Numeric.f_abs; +import static org.jruby.util.Numeric.f_arg; +import static org.jruby.util.Numeric.f_negative_p; + +import java.math.BigInteger; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.exceptions.RaiseException; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Block; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.Convert; + +/** + * Base class for all numerical types in ruby. + */ +// TODO: Numeric.new works in Ruby and it does here too. However trying to use +// that instance in a numeric operation should generate an ArgumentError. Doing +// this seems so pathological I do not see the need to fix this now. +@JRubyClass(name="Numeric", include="Comparable") +public class RubyNumeric extends RubyObject { + + public static RubyClass createNumericClass(Ruby runtime) { + RubyClass numeric = runtime.defineClass("Numeric", runtime.getObject(), NUMERIC_ALLOCATOR); + runtime.setNumeric(numeric); + + numeric.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyNumeric; + } + }; + + numeric.includeModule(runtime.getComparable()); + numeric.defineAnnotatedMethods(RubyNumeric.class); + + return numeric; + } + + protected static final ObjectAllocator NUMERIC_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyNumeric(runtime, klass); + } + }; + + public static double DBL_EPSILON=2.2204460492503131e-16; + + private static IRubyObject convertToNum(double val, Ruby runtime) { + + if (val >= (double) RubyFixnum.MAX || val < (double) RubyFixnum.MIN) { + return RubyBignum.newBignum(runtime, val); + } + return RubyFixnum.newFixnum(runtime, (long) val); + } + + public RubyNumeric(Ruby runtime, RubyClass metaClass) { + super(runtime, metaClass); + } + + public RubyNumeric(Ruby runtime, RubyClass metaClass, boolean useObjectSpace) { + super(runtime, metaClass, useObjectSpace); + } + + // The implementations of these are all bonus (see TODO above) I was going + // to throw an error from these, but it appears to be the wrong place to + // do it. + public double getDoubleValue() { + return 0; + } + + public long getLongValue() { + return 0; + } + + public static RubyNumeric newNumeric(Ruby runtime) { + return new RubyNumeric(runtime, runtime.getNumeric()); + } + + /* ================ + * Utility Methods + * ================ + */ + + /** rb_num2int, NUM2INT + * + */ + public static int num2int(IRubyObject arg) { + long num = num2long(arg); + + checkInt(arg, num); + return (int)num; + } + + /** check_int + * + */ + public static void checkInt(IRubyObject arg, long num){ + String s; + if (num < Integer.MIN_VALUE) { + s = "small"; + } else if (num > Integer.MAX_VALUE) { + s = "big"; + } else { + return; + } + throw arg.getRuntime().newRangeError("integer " + num + " too " + s + " to convert to `int'"); + } + + /** + * NUM2CHR + */ + public static byte num2chr(IRubyObject arg) { + if (arg instanceof RubyString) { + String value = ((RubyString) arg).toString(); + + if (value != null && value.length() > 0) return (byte) value.charAt(0); + } + + return (byte) num2int(arg); + } + + /** rb_num2long and FIX2LONG (numeric.c) + * + */ + public static long num2long(IRubyObject arg) { + if (arg instanceof RubyFixnum) { + return ((RubyFixnum) arg).getLongValue(); + } + if (arg.isNil()) { + throw arg.getRuntime().newTypeError("no implicit conversion from nil to integer"); + } + + if (arg instanceof RubyFloat) { + double aFloat = ((RubyFloat) arg).getDoubleValue(); + if (aFloat <= (double) Long.MAX_VALUE && aFloat >= (double) Long.MIN_VALUE) { + return (long) aFloat; + } else { + // TODO: number formatting here, MRI uses "%-.10g", 1.4 API is a must? + throw arg.getRuntime().newRangeError("float " + aFloat + " out of range of integer"); + } + } else if (arg instanceof RubyBignum) { + return RubyBignum.big2long((RubyBignum) arg); + } + return arg.convertToInteger().getLongValue(); + } + + /** rb_dbl2big + LONG2FIX at once (numeric.c) + * + */ + public static IRubyObject dbl2num(Ruby runtime, double val) { + if (Double.isInfinite(val)) { + throw runtime.newFloatDomainError(val < 0 ? "-Infinity" : "Infinity"); + } + if (Double.isNaN(val)) { + throw runtime.newFloatDomainError("NaN"); + } + return convertToNum(val,runtime); + } + + /** rb_num2dbl and NUM2DBL + * + */ + public static double num2dbl(IRubyObject arg) { + if (arg instanceof RubyFloat) { + return ((RubyFloat) arg).getDoubleValue(); + } else if (arg instanceof RubyString) { + throw arg.getRuntime().newTypeError("no implicit conversion to float from string"); + } else if (arg == arg.getRuntime().getNil()) { + throw arg.getRuntime().newTypeError("no implicit conversion to float from nil"); + } + return arg.convertToFloat().getDoubleValue(); + } + + /** rb_dbl_cmp (numeric.c) + * + */ + public static IRubyObject dbl_cmp(Ruby runtime, double a, double b) { + if (Double.isNaN(a) || Double.isNaN(b)) { + return runtime.getNil(); + } + if (a > b) { + return RubyFixnum.one(runtime); + } + if (a < b) { + return RubyFixnum.minus_one(runtime); + } + return RubyFixnum.zero(runtime); + } + + public static long fix2long(IRubyObject arg) { + return ((RubyFixnum) arg).getLongValue(); + } + + public static int fix2int(IRubyObject arg) { + long num = arg instanceof RubyFixnum ? fix2long(arg) : num2long(arg); + + checkInt(arg, num); + return (int) num; + } + + public static RubyInteger str2inum(Ruby runtime, RubyString str, int base) { + return str2inum(runtime,str,base,false); + } + + public static RubyNumeric int2fix(Ruby runtime, long val) { + return RubyFixnum.newFixnum(runtime,val); + } + + /** rb_num2fix + * + */ + public static IRubyObject num2fix(IRubyObject val) { + if (val instanceof RubyFixnum) { + return val; + } + if (val instanceof RubyBignum) { + // any BigInteger is bigger than Fixnum and we don't have FIXABLE + throw val.getRuntime().newRangeError("integer " + val + " out of range of fixnum"); + } + return RubyFixnum.newFixnum(val.getRuntime(), num2long(val)); + } + + /** + * Converts a string representation of an integer to the integer value. + * Parsing starts at the beginning of the string (after leading and + * trailing whitespace have been removed), and stops at the end or at the + * first character that can't be part of an integer. Leading signs are + * allowed. If <code>base</code> is zero, strings that begin with '0[xX]', + * '0[bB]', or '0' (optionally preceded by a sign) will be treated as hex, + * binary, or octal numbers, respectively. If a non-zero base is given, + * only the prefix (if any) that is appropriate to that base will be + * parsed correctly. For example, if the base is zero or 16, the string + * "0xff" will be converted to 256, but if the base is 10, it will come out + * as zero, since 'x' is not a valid decimal digit. If the string fails + * to parse as a number, zero is returned. + * + * @param runtime the ruby runtime + * @param str the string to be converted + * @param base the expected base of the number (for example, 2, 8, 10, 16), + * or 0 if the method should determine the base automatically + * (defaults to 10). Values 0 and 2-36 are permitted. Any other + * value will result in an ArgumentError. + * @param strict if true, enforce the strict criteria for String encoding of + * numeric values, as required by Integer('n'), and raise an + * exception when those criteria are not met. Otherwise, allow + * lax expression of values, as permitted by String#to_i, and + * return a value in almost all cases (excepting illegal radix). + * TODO: describe the rules/criteria + * @return a RubyFixnum or (if necessary) a RubyBignum representing + * the result of the conversion, which will be zero if the + * conversion failed. + */ + public static RubyInteger str2inum(Ruby runtime, RubyString str, int base, boolean strict) { + if (base != 0 && (base < 2 || base > 36)) { + throw runtime.newArgumentError("illegal radix " + base); + } + ByteList bytes = str.getByteList(); + try { + return runtime.newFixnum(Convert.byteListToLong(bytes, base, strict)); + } catch (InvalidIntegerException e) { + return str2inumIIE(strict, runtime, str); + } catch (NumberTooLargeException e) { + return str2inumNTLE(strict, runtime, str, bytes, base); + } + } + + private static RubyInteger str2inumIIE(boolean strict, Ruby runtime, RubyString str) throws RaiseException { + if (strict) { + throw runtime.newArgumentError("invalid value for Integer: " + str.callMethod(runtime.getCurrentContext(), "inspect").toString()); + } + return RubyFixnum.zero(runtime); + } + + private static RubyInteger str2inumNTLE(boolean strict, Ruby runtime, RubyString str, ByteList bytes, int base) { + try { + BigInteger bi = Convert.byteListToBigInteger(bytes, base, strict); + return new RubyBignum(runtime, bi); + } catch (InvalidIntegerException e2) { + return str2inumIIE(strict, runtime, str); + } + } + + public static RubyFloat str2fnum(Ruby runtime, RubyString arg) { + return str2fnum(runtime,arg,false); + } + + /** + * Converts a string representation of a floating-point number to the + * numeric value. Parsing starts at the beginning of the string (after + * leading and trailing whitespace have been removed), and stops at the + * end or at the first character that can't be part of a number. If + * the string fails to parse as a number, 0.0 is returned. + * + * @param runtime the ruby runtime + * @param arg the string to be converted + * @param strict if true, enforce the strict criteria for String encoding of + * numeric values, as required by Float('n'), and raise an + * exception when those criteria are not met. Otherwise, allow + * lax expression of values, as permitted by String#to_f, and + * return a value in all cases. + * TODO: describe the rules/criteria + * @return a RubyFloat representing the result of the conversion, which + * will be 0.0 if the conversion failed. + */ + public static RubyFloat str2fnum(Ruby runtime, RubyString arg, boolean strict) { + final double ZERO = 0.0; + + try { + return new RubyFloat(runtime,Convert.byteListToDouble(arg.getByteList(),strict)); + } catch (NumberFormatException e) { + if (strict) { + throw runtime.newArgumentError("invalid value for Float(): " + + arg.callMethod(runtime.getCurrentContext(), "inspect").toString()); + } + return new RubyFloat(runtime,ZERO); + } + } + + /** Numeric methods. (num_*) + * + */ + + protected IRubyObject[] getCoerced(ThreadContext context, IRubyObject other, boolean error) { + IRubyObject result; + + try { + result = other.callMethod(context, "coerce", this); + } catch (RaiseException e) { + if (error) { + throw getRuntime().newTypeError( + other.getMetaClass().getName() + " can't be coerced into " + getMetaClass().getName()); + } + + return null; + } + + if (!(result instanceof RubyArray) || ((RubyArray)result).getLength() != 2) { + throw getRuntime().newTypeError("coerce must return [x, y]"); + } + + return ((RubyArray)result).toJavaArray(); + } + + protected IRubyObject callCoerced(ThreadContext context, String method, IRubyObject other, boolean err) { + IRubyObject[] args = getCoerced(context, other, err); + if(args == null) { + return getRuntime().getNil(); + } + return args[0].callMethod(context, method, args[1]); + } + + protected IRubyObject callCoerced(ThreadContext context, String method, IRubyObject other) { + IRubyObject[] args = getCoerced(context, other, false); + if(args == null) { + return getRuntime().getNil(); + } + return args[0].callMethod(context, method, args[1]); + } + + // beneath are rewritten coercions that reflect MRI logic, the aboves are used only by RubyBigDecimal + + /** coerce_body + * + */ + protected final IRubyObject coerceBody(ThreadContext context, IRubyObject other) { + return other.callMethod(context, "coerce", this); + } + + /** do_coerce + * + */ + protected final RubyArray doCoerce(ThreadContext context, IRubyObject other, boolean err) { + IRubyObject result; + try { + result = coerceBody(context, other); + } catch (RaiseException e) { + if (err) { + throw getRuntime().newTypeError( + other.getMetaClass().getName() + " can't be coerced into " + getMetaClass().getName()); + } + return null; + } + + if (!(result instanceof RubyArray) || ((RubyArray) result).getLength() != 2) { + throw getRuntime().newTypeError("coerce must return [x, y]"); + } + return (RubyArray) result; + } + + /** rb_num_coerce_bin + * coercion taking two arguments + */ + protected final IRubyObject coerceBin(ThreadContext context, String method, IRubyObject other) { + RubyArray ary = doCoerce(context, other, true); + return (ary.eltInternal(0)).callMethod(context, method, ary.eltInternal(1)); + } + + /** rb_num_coerce_cmp + * coercion used for comparisons + */ + protected final IRubyObject coerceCmp(ThreadContext context, String method, IRubyObject other) { + RubyArray ary = doCoerce(context, other, false); + if (ary == null) { + return getRuntime().getNil(); // MRI does it! + } + return (ary.eltInternal(0)).callMethod(context, method, ary.eltInternal(1)); + } + + /** rb_num_coerce_relop + * coercion used for relative operators + */ + protected final IRubyObject coerceRelOp(ThreadContext context, String method, IRubyObject other) { + RubyArray ary = doCoerce(context, other, false); + if (ary == null) { + return RubyComparable.cmperr(this, other); + } + + return unwrapCoerced(context, method, other, ary); + } + + private final IRubyObject unwrapCoerced(ThreadContext context, String method, IRubyObject other, RubyArray ary) { + IRubyObject result = (ary.eltInternal(0)).callMethod(context, method, ary.eltInternal(1)); + if (result.isNil()) { + return RubyComparable.cmperr(this, other); + } + return result; + } + + public RubyNumeric asNumeric() { + return this; + } + + /* ================ + * Instance Methods + * ================ + */ + + /** num_sadded + * + */ + @JRubyMethod(name = "singleton_method_added") + public IRubyObject sadded(IRubyObject name) { + throw getRuntime().newTypeError("can't define singleton method " + name + " for " + getType().getName()); + } + + /** num_init_copy + * + */ + @Override + @JRubyMethod(name = "initialize_copy", visibility = Visibility.PRIVATE) + public IRubyObject initialize_copy(IRubyObject arg) { + throw getRuntime().newTypeError("can't copy " + getType().getName()); + } + + /** num_coerce + * + */ + @JRubyMethod(name = "coerce") + public IRubyObject coerce(IRubyObject other) { + if (getClass() == other.getClass()) return getRuntime().newArray(other, this); + + IRubyObject cdr = RubyKernel.new_float(this, this); + IRubyObject car = RubyKernel.new_float(this, other); + + return getRuntime().newArray(car, cdr); + } + + /** num_uplus + * + */ + @JRubyMethod(name = "+@") + public IRubyObject op_uplus() { + return this; + } + + /** num_uminus + * + */ + @JRubyMethod(name = "-@") + public IRubyObject op_uminus(ThreadContext context) { + RubyFixnum zero = RubyFixnum.zero(getRuntime()); + RubyArray ary = zero.doCoerce(context, this, true); + return ary.eltInternal(0).callMethod(context, MethodIndex.OP_MINUS, "-", ary.eltInternal(1)); + } + + /** num_cmp + * + */ + @JRubyMethod(name = "<=>") + public IRubyObject op_cmp(IRubyObject other) { + if (this == other) { // won't hurt fixnums + return RubyFixnum.zero(getRuntime()); + } + return getRuntime().getNil(); + } + + /** num_eql + * + */ + @JRubyMethod(name = "eql?") + public IRubyObject eql_p(ThreadContext context, IRubyObject other) { + if (getClass() != other.getClass()) return getRuntime().getFalse(); + return equalInternal(context, this, other) ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + /** num_quo + * + */ + @JRubyMethod(name = "quo") + public IRubyObject quo(ThreadContext context, IRubyObject other) { + return callMethod(context, "/", other); + } + + /** num_quo + * + */ + @JRubyMethod(name = "quo", compat = CompatVersion.RUBY1_9) + public IRubyObject quo_19(ThreadContext context, IRubyObject other) { + return RubyRational.newRationalRaw(context.getRuntime(), this).callMethod(context, "/", other); + } + + /** num_div + * + */ + @JRubyMethod(name = "div") + public IRubyObject div(ThreadContext context, IRubyObject other) { + return callMethod(context, "/", other).convertToFloat().floor(); + } + + /** num_divmod + * + */ + @JRubyMethod(name = "divmod") + public IRubyObject divmod(ThreadContext context, IRubyObject other) { + return RubyArray.newArray(getRuntime(), div(context, other), modulo(context, other)); + } + + /** num_fdiv (1.9) */ + @JRubyMethod(name = "fdiv", compat = CompatVersion.RUBY1_9) + public IRubyObject fdiv(ThreadContext context, IRubyObject other) { + return RuntimeHelpers.invoke(context, this.convertToFloat(), "/", other); + } + + /** num_modulo + * + */ + @JRubyMethod(name = "modulo") + public IRubyObject modulo(ThreadContext context, IRubyObject other) { + return callMethod(context, "%", other); + } + + /** num_remainder + * + */ + @JRubyMethod(name = "remainder") + public IRubyObject remainder(ThreadContext context, IRubyObject dividend) { + IRubyObject z = callMethod(context, "%", dividend); + IRubyObject x = this; + RubyFixnum zero = RubyFixnum.zero(getRuntime()); + + if (!equalInternal(context, z, zero) && + ((x.callMethod(context, MethodIndex.OP_LT, "<", zero).isTrue() && + dividend.callMethod(context, MethodIndex.OP_GT, ">", zero).isTrue()) || + (x.callMethod(context, MethodIndex.OP_GT, ">", zero).isTrue() && + dividend.callMethod(context, MethodIndex.OP_LT, "<", zero).isTrue()))) { + return z.callMethod(context, MethodIndex.OP_MINUS, "-", dividend); + } else { + return z; + } + } + + /** num_abs + * + */ + @JRubyMethod(name = "abs") + public IRubyObject abs(ThreadContext context) { + if (callMethod(context, MethodIndex.OP_LT, "<", RubyFixnum.zero(getRuntime())).isTrue()) { + return callMethod(context, "-@"); + } + return this; + } + + /** num_to_int + * + */ + @JRubyMethod(name = "to_int") + public IRubyObject to_int(ThreadContext context) { + return RuntimeHelpers.invoke(context, this, "to_i"); + } + + /** num_scalar_p + * + */ + @JRubyMethod(name = "scalar?", compat = CompatVersion.RUBY1_9) + public IRubyObject scalar_p() { + return getRuntime().getTrue(); + } + + /** num_int_p + * + */ + @JRubyMethod(name = "integer?") + public IRubyObject integer_p() { + return getRuntime().getFalse(); + } + + /** num_zero_p + * + */ + @JRubyMethod(name = "zero?") + public IRubyObject zero_p(ThreadContext context) { + return equalInternal(context, this, RubyFixnum.zero(getRuntime())) ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + /** num_nonzero_p + * + */ + @JRubyMethod(name = "nonzero?") + public IRubyObject nonzero_p(ThreadContext context) { + if (callMethod(context, "zero?").isTrue()) { + return getRuntime().getNil(); + } + return this; + } + + /** num_floor + * + */ + @JRubyMethod(name = "floor") + public IRubyObject floor() { + return convertToFloat().floor(); + } + + /** num_ceil + * + */ + @JRubyMethod(name = "ceil") + public IRubyObject ceil() { + return convertToFloat().ceil(); + } + + /** num_round + * + */ + @JRubyMethod(name = "round") + public IRubyObject round() { + return convertToFloat().round(); + } + + /** num_truncate + * + */ + @JRubyMethod(name = "truncate") + public IRubyObject truncate() { + return convertToFloat().truncate(); + } + + @JRubyMethod(name = "step", required = 1, optional = 1, frame = true) + public IRubyObject step(ThreadContext context, IRubyObject[] args, Block block) { + switch (args.length) { + case 0: throw context.getRuntime().newArgumentError(0, 1); + case 1: return step(context, args[0], block); + case 2: return step(context, args[0], args[1], block); + default: throw context.getRuntime().newArgumentError(args.length, 2); + } + } + + @JRubyMethod(name = "step", frame = true) + public IRubyObject step(ThreadContext context, IRubyObject arg0, Block block) { + return step(context, arg0, RubyFixnum.one(context.getRuntime()), block); + } + + @JRubyMethod(name = "step", frame = true) + public IRubyObject step(ThreadContext context, IRubyObject to, IRubyObject step, Block block) { + if (this instanceof RubyFixnum && to instanceof RubyFixnum && step instanceof RubyFixnum) { + long value = getLongValue(); + long end = ((RubyFixnum) to).getLongValue(); + long diff = ((RubyFixnum) step).getLongValue(); + + if (diff == 0) { + throw getRuntime().newArgumentError("step cannot be 0"); + } + if (diff > 0) { + for (long i = value; i <= end; i += diff) { + block.yield(context, RubyFixnum.newFixnum(getRuntime(), i)); + } + } else { + for (long i = value; i >= end; i += diff) { + block.yield(context, RubyFixnum.newFixnum(getRuntime(), i)); + } + } + } else if (this instanceof RubyFloat || to instanceof RubyFloat || step instanceof RubyFloat) { + double beg = num2dbl(this); + double end = num2dbl(to); + double unit = num2dbl(step); + + if (unit == 0) { + throw getRuntime().newArgumentError("step cannot be 0"); + } + + double n = (end - beg)/unit; + double err = (Math.abs(beg) + Math.abs(end) + Math.abs(end - beg)) / Math.abs(unit) * DBL_EPSILON; + + if (err>0.5) { + err=0.5; + } + n = Math.floor(n + err) + 1; + + for(double i = 0; i < n; i++){ + block.yield(context, RubyFloat.newFloat(getRuntime(), i * unit + beg)); + } + + } else { + RubyNumeric i = this; + + int cmp; + String cmpString; + if (((RubyBoolean) step.callMethod(context, MethodIndex.OP_GT, ">", RubyFixnum.zero(getRuntime()))).isTrue()) { + cmp = MethodIndex.OP_GT; + } else { + cmp = MethodIndex.OP_LT; + } + cmpString = MethodIndex.NAMES.get(cmp); + + while (true) { + if (i.callMethod(context, cmp, cmpString, to).isTrue()) { + break; + } + block.yield(context, i); + i = (RubyNumeric) i.callMethod(context, MethodIndex.OP_PLUS, "+", step); + } + } + return this; + } + + /** num_equal, doesn't override RubyObject.op_equal + * + */ + protected final IRubyObject op_num_equal(ThreadContext context, IRubyObject other) { + // it won't hurt fixnums + if (this == other) return getRuntime().getTrue(); + + return other.callMethod(context, MethodIndex.EQUALEQUAL, "==", this); + } + + /** num_numerator + * + */ + @JRubyMethod(name = "numerator", compat = CompatVersion.RUBY1_9) + public IRubyObject numerator(ThreadContext context) { + return RubyRational.newRationalConvert(context, this).callMethod(context, "numerator"); + } + + /** num_denominator + * + */ + @JRubyMethod(name = "denominator", compat = CompatVersion.RUBY1_9) + public IRubyObject denominator(ThreadContext context) { + return RubyRational.newRationalConvert(context, this).callMethod(context, "denominator"); + } + + /** numeric_to_c + * + */ + @JRubyMethod(name = "to_c", compat = CompatVersion.RUBY1_9) + public IRubyObject to_c(ThreadContext context) { + return RubyComplex.newComplexCanonicalize(context, this); + } + + /** numeric_re + * + */ + @JRubyMethod(name = "re", compat = CompatVersion.RUBY1_9) + public IRubyObject re(ThreadContext context) { + return RubyComplex.newComplexConvert(context, this); + } + + /** numeric_im + * + */ + @JRubyMethod(name = "im", compat = CompatVersion.RUBY1_9) + public IRubyObject im(ThreadContext context) { + return RubyComplex.newComplexConvert(context, RubyFixnum.zero(context.getRuntime()), this); + } + + /** numeric_real + * + */ + @JRubyMethod(name = "real", compat = CompatVersion.RUBY1_9) + public IRubyObject real(ThreadContext context) { + return this; + } + + /** numeric_image + * + */ + @JRubyMethod(name = {"image", "imag"}, compat = CompatVersion.RUBY1_9) + public IRubyObject image(ThreadContext context) { + return RubyFixnum.zero(context.getRuntime()); + } + + /** numeric_arg + * + */ + @JRubyMethod(name = "arg", compat = CompatVersion.RUBY1_9) + public IRubyObject arg(ThreadContext context) { + if (!f_negative_p(context, this)) return RubyFixnum.zero(context.getRuntime()); + return context.getRuntime().getMath().fastFetchConstant("PI"); + } + + /** numeric_polar + * + */ + @JRubyMethod(name = "polar", compat = CompatVersion.RUBY1_9) + public IRubyObject polar(ThreadContext context) { + return context.getRuntime().newArray(f_abs(context, this), f_arg(context, this)); + } + + /** numeric_real + * + */ + @JRubyMethod(name = "conjugate", compat = CompatVersion.RUBY1_9) + public IRubyObject conjugate(ThreadContext context) { + return this; + } + + public static class InvalidIntegerException extends NumberFormatException { + private static final long serialVersionUID = 55019452543252148L; + + public InvalidIntegerException() { + super(); + } + public InvalidIntegerException(String message) { + super(message); + } + public Throwable fillInStackTrace() { + return this; + } + } + + public static class NumberTooLargeException extends NumberFormatException { + private static final long serialVersionUID = -1835120694982699449L; + public NumberTooLargeException() { + super(); + } + public NumberTooLargeException(String message) { + super(message); + } + public Throwable fillInStackTrace() { + return this; + } + } +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Ola Bini <ola.bini@ki.se> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2007 MenTaLguY <mental@rydia.net> + * Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.evaluator.ASTInterpreter; +import org.jruby.exceptions.JumpException; +import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallType; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.builtin.Variable; +import org.jruby.runtime.component.VariableEntry; +import org.jruby.util.IdUtil; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.javasupport.JavaObject; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.builtin.InstanceVariables; +import org.jruby.runtime.builtin.InternalVariables; +import org.jruby.runtime.marshal.CoreObjectType; +import org.jruby.util.TypeConverter; + +/** + * RubyObject is the only implementation of the + * {@link org.jruby.runtime.builtin.IRubyObject}. Every Ruby object in JRuby + * is represented by something that is an instance of RubyObject. In + * some of the core class implementations, this means doing a subclass + * that extends RubyObject, in other cases it means using a simple + * RubyObject instance and the data field to store specific + * information about the Ruby object. + * + * Some care has been taken to make the implementation be as + * monomorphic as possible, so that the Java Hotspot engine can + * improve performance of it. That is the reason for several patterns + * that might seem odd in this class. + * + * The IRubyObject interface used to have lots of methods for + * different things, but these have now mostly been refactored into + * several interfaces that gives access to that specific part of the + * object. This gives us the possibility to switch out that subsystem + * without changing interfaces again. For example, instance variable + * and internal variables are handled this way, but the implementation + * in RubyObject only returns "this" in {@link #getInstanceVariables()} and + * {@link #getInternalVariables()}. + * + * @author jpetersen + */ +@JRubyClass(name="Object", include="Kernel") +public class RubyObject implements Cloneable, IRubyObject, Serializable, CoreObjectType, InstanceVariables, InternalVariables { + + /** + * It's not valid to create a totally empty RubyObject. Since the + * RubyObject is always defined in relation to a runtime, that + * means that creating RubyObjects from outside the class might + * cause problems. + */ + private RubyObject(){}; + + /** + * A value that is used as a null sentinel in among other places + * the RubyArray implementation. It will cause large problems to + * call any methods on this object. + */ + public static final IRubyObject NEVER = new RubyObject(); + + /** + * A value that specifies an undefined value. This value is used + * as a sentinel for undefined constant values, and other places + * where neither null nor NEVER makes sense. + */ + public static final IRubyObject UNDEF = new RubyObject(); + + // The class of this object + protected transient RubyClass metaClass; + + /** + * The variableTable contains variables for an object, defined as: + * <ul> + * <li> instance variables + * <li> class variables (for classes/modules) + * <li> internal variables (such as those used when marshaling RubyRange and RubyException) + * </ul> + * + * Constants are stored separately, see {@link RubyModule}. + * + */ + protected transient volatile VariableTableEntry[] variableTable; + protected transient int variableTableSize; + protected transient int variableTableThreshold; + + // The dataStruct is a place where custom information can be + // contained for core implementations that doesn't necessarily + // want to go to the trouble of creating a subclass of + // RubyObject. The OpenSSL implementation uses this heavily to + // save holder objects containing Java cryptography objects. + // Java integration uses this to store the Java object ref. + protected transient Object dataStruct; + + protected int flags; // zeroed by jvm + public static final int ALL_F = -1; + public static final int FALSE_F = 1 << 0; + + /** + * This flag is a bit funny. It's used to denote that this value + * is nil. It's a bit counterintuitive for a Java programmer to + * not use subclassing to handle this case, since we have a + * RubyNil subclass anyway. Well, the reason for it being a flag + * is that the {@link #isNil()} method is called extremely often. So often + * that it gives a good speed boost to make it monomorphic and + * final. It turns out using a flag for this actually gives us + * better performance than having a polymorphic {@link #isNil()} method. + */ + public static final int NIL_F = 1 << 1; + + public static final int FROZEN_F = 1 << 2; + public static final int TAINTED_F = 1 << 3; + + public static final int FL_USHIFT = 4; + + public static final int USER0_F = (1<<(FL_USHIFT+0)); + public static final int USER1_F = (1<<(FL_USHIFT+1)); + public static final int USER2_F = (1<<(FL_USHIFT+2)); + public static final int USER3_F = (1<<(FL_USHIFT+3)); + public static final int USER4_F = (1<<(FL_USHIFT+4)); + public static final int USER5_F = (1<<(FL_USHIFT+5)); + public static final int USER6_F = (1<<(FL_USHIFT+6)); + public static final int USER7_F = (1<<(FL_USHIFT+7)); + + /** + * Sets or unsets a flag on this object. The only flags that are + * guaranteed to be valid to use as the first argument is: + * + * <ul> + * <li>{@link #FALSE_F}</li> + * <li>{@link NIL_F}</li> + * <li>{@link FROZEN_F}</li> + * <li>{@link TAINTED_F}</li> + * <li>{@link USER0_F}</li> + * <li>{@link USER1_F}</li> + * <li>{@link USER2_F}</li> + * <li>{@link USER3_F}</li> + * <li>{@link USER4_F}</li> + * <li>{@link USER5_F}</li> + * <li>{@link USER6_F}</li> + * <li>{@link USER7_F}</li> + * </ul> + * + * @param flag the actual flag to set or unset. + * @param set if true, the flag will be set, if false, the flag will be unset. + */ + public final void setFlag(int flag, boolean set) { + if (set) { + flags |= flag; + } else { + flags &= ~flag; + } + } + + /** + * Get the value of a custom flag on this object. The only + * guaranteed flags that can be sent in to this method is: + * + * <ul> + * <li>{@link #FALSE_F}</li> + * <li>{@link NIL_F}</li> + * <li>{@link FROZEN_F}</li> + * <li>{@link TAINTED_F}</li> + * <li>{@link USER0_F}</li> + * <li>{@link USER1_F}</li> + * <li>{@link USER2_F}</li> + * <li>{@link USER3_F}</li> + * <li>{@link USER4_F}</li> + * <li>{@link USER5_F}</li> + * <li>{@link USER6_F}</li> + * <li>{@link USER7_F}</li> + * </ul> + * + * @param flag the flag to get + * @return true if the flag is set, false otherwise + */ + public final boolean getFlag(int flag) { + return (flags & flag) != 0; + } + + private transient Finalizer finalizer; + + /** + * Class that keeps track of the finalizers for the object under + * operation. + */ + public class Finalizer implements Finalizable { + private long id; + private List<IRubyObject> finalizers; + private AtomicBoolean finalized; + + public Finalizer(long id) { + this.id = id; + this.finalized = new AtomicBoolean(false); + } + + public void addFinalizer(IRubyObject finalizer) { + if (finalizers == null) { + finalizers = new ArrayList<IRubyObject>(); + } + finalizers.add(finalizer); + } + + public void removeFinalizers() { + finalizers = null; + } + + @Override + public void finalize() { + if (finalized.compareAndSet(false, true)) { + if (finalizers != null) { + for (int i = 0; i < finalizers.size(); i++) { + IRubyObject finalizer = finalizers.get(i); + RuntimeHelpers.invoke( + finalizer.getRuntime().getCurrentContext(), + finalizer, "call", RubyObject.this.id()); + } + } + } + } + } + + /** + * Standard path for object creation. Objects are entered into ObjectSpace + * only if ObjectSpace is enabled. + */ + public RubyObject(Ruby runtime, RubyClass metaClass) { + this.metaClass = metaClass; + + if (runtime.isObjectSpaceEnabled()) addToObjectSpace(runtime); + if (runtime.getSafeLevel() >= 3) taint(runtime); + } + + /** + * Path for objects who want to decide whether they don't want to be in + * ObjectSpace even when it is on. (notably used by objects being + * considered immediate, they'll always pass false here) + */ + protected RubyObject(Ruby runtime, RubyClass metaClass, boolean useObjectSpace) { + this.metaClass = metaClass; + + if (useObjectSpace) addToObjectSpace(runtime); + if (runtime.getSafeLevel() >= 3) taint(runtime); + } + + private void addToObjectSpace(Ruby runtime) { + assert runtime.isObjectSpaceEnabled(); + runtime.getObjectSpace().add(this); + } + + /** + * Will create the Ruby class Object in the runtime + * specified. This method needs to take the actual class as an + * argument because of the Object class' central part in runtime + * initialization. + */ + public static RubyClass createObjectClass(Ruby runtime, RubyClass objectClass) { + objectClass.index = ClassIndex.OBJECT; + + objectClass.defineAnnotatedMethods(ObjectMethods.class); + + return objectClass; + } + + /** + * Interestingly, the Object class doesn't really have that many + * methods for itself. Instead almost all of the Object methods + * are really defined on the Kernel module. This class is a holder + * for all Object methods. + * + * @see RubyKernel + */ + public static class ObjectMethods { + @JRubyMethod(name = "initialize", visibility = Visibility.PRIVATE) + public static IRubyObject intialize(IRubyObject self) { + return self.getRuntime().getNil(); + } + } + + /** + * Default allocator instance for all Ruby objects. The only + * reason to not use this allocator is if you actually need to + * have all instances of something be a subclass of RubyObject. + * + * @see org.jruby.runtime.ObjectAllocator + */ + public static final ObjectAllocator OBJECT_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyObject(runtime, klass); + } + }; + + /** + * Will make sure that this object is added to the current object + * space. + * + * @see org.jruby.runtime.ObjectSpace + */ + public void attachToObjectSpace() { + getRuntime().getObjectSpace().add(this); + } + + /** + * This is overridden in the other concrete Java builtins to provide a fast way + * to determine what type they are. + * + * Will generally return a value from org.jruby.runtime.ClassIndex + * + * @see org.jruby.runtime.ClassInde + */ + public int getNativeTypeIndex() { + return ClassIndex.OBJECT; + } + + /** + * Specifically polymorphic method that are meant to be overridden + * by modules to specify that they are modules in an easy way. + */ + public boolean isModule() { + return false; + } + + /** + * Specifically polymorphic method that are meant to be overridden + * by classes to specify that they are classes in an easy way. + */ + public boolean isClass() { + return false; + } + + /** + * Is object immediate (def: Fixnum, Symbol, true, false, nil?). + */ + public boolean isImmediate() { + return false; + } + + /** rb_make_metaclass + * + * Will create a new meta class, insert this in the chain of + * classes for this specific object, and return the generated meta + * class. + */ + public RubyClass makeMetaClass(RubyClass superClass) { + MetaClass klass = new MetaClass(getRuntime(), superClass); // rb_class_boot + setMetaClass(klass); + + klass.setAttached(this); + klass.setMetaClass(superClass.getRealClass().getMetaClass()); + + return klass; + } + + /** + * Will return the Java interface that most closely can represent + * this object, when working through JAva integration + * translations. + */ + public Class getJavaClass() { + if (dataGetStruct() instanceof JavaObject) { + return ((JavaObject)dataGetStruct()).getValue().getClass(); + } + return getClass(); + } + + /** + * Simple helper to print any objects. + */ + public static void puts(Object obj) { + System.out.println(obj.toString()); + } + + /** + * This method is just a wrapper around the Ruby "==" method, + * provided so that RubyObjects can be used as keys in the Java + * HashMap object underlying RubyHash. + */ + @Override + public boolean equals(Object other) { + return other == this || + other instanceof IRubyObject && + callMethod(getRuntime().getCurrentContext(), MethodIndex.EQUALEQUAL, "==", (IRubyObject) other).isTrue(); + } + + /** + * The default toString method is just a wrapper that calls the + * Ruby "to_s" method. + */ + @Override + public String toString() { + return RuntimeHelpers.invoke(getRuntime().getCurrentContext(), this, "to_s").toString(); + } + + /** + * Will return the runtime that this object is associated with. + * + * @return current runtime + */ + public final Ruby getRuntime() { + return getMetaClass().getClassRuntime(); + } + + /** + * if exist return the meta-class else return the type of the object. + * + */ + public final RubyClass getMetaClass() { + return metaClass; + } + + /** + * Makes it possible to change the metaclass of an object. In + * practice, this is a simple version of Smalltalks Become, except + * that it doesn't work when we're dealing with subclasses. In + * practice it's used to change the singleton/meta class used, + * without changing the "real" inheritance chain. + */ + public void setMetaClass(RubyClass metaClass) { + this.metaClass = metaClass; + } + + /** + * Is this value frozen or not? Shortcut for doing + * getFlag(FROZEN_F). + * + * @return true if this object is frozen, false otherwise + */ + public boolean isFrozen() { + return (flags & FROZEN_F) != 0; + } + + /** + * Sets whether this object is frozen or not. Shortcut for doing + * setFlag(FROZEN_F, frozen). + * + * @param frozen should this object be frozen? + */ + public void setFrozen(boolean frozen) { + if (frozen) { + flags |= FROZEN_F; + } else { + flags &= ~FROZEN_F; + } + } + + /** rb_frozen_class_p + * + * Helper to test whether this object is frozen, and if it is will + * throw an exception based on the message. + */ + protected final void testFrozen(String message) { + if (isFrozen()) { + throw getRuntime().newFrozenError(message + " " + getMetaClass().getName()); + } + } + + /** + * The actual method that checks frozen with the default frozen message from MRI. + * If possible, call this instead of {@link #testFrozen}. + */ + protected void checkFrozen() { + testFrozen("can't modify frozen "); + } + + /** + * Gets the taint. Shortcut for getFlag(TAINTED_F). + * + * @return true if this object is tainted + */ + public boolean isTaint() { + return (flags & TAINTED_F) != 0; + } + + /** + * Sets the taint flag. Shortcut for setFlag(TAINTED_F, taint) + * + * @param taint should this object be tainted or not? + */ + public void setTaint(boolean taint) { + if (taint) { + flags |= TAINTED_F; + } else { + flags &= ~TAINTED_F; + } + } + + /** + * Does this object represent nil? See the docs for the {@link + * #NIL_F} flag for more information. + */ + public final boolean isNil() { + return (flags & NIL_F) != 0; + } + + /** + * Is this value a true value or not? Based on the {@link #FALSE_F} flag. + */ + public final boolean isTrue() { + return (flags & FALSE_F) == 0; + } + + /** + * Is this value a false value or not? Based on the {@link #FALSE_F} flag. + */ + public final boolean isFalse() { + return (flags & FALSE_F) != 0; + } + + /** + * Does this object respond to the specified message? Uses a + * shortcut if it can be proved that respond_to? haven't been + * overridden. + */ + public final boolean respondsTo(String name) { + if(getMetaClass().searchMethod("respond_to?") == getRuntime().getRespondToMethod()) { + return getMetaClass().isMethodBound(name, false); + } else { + return callMethod(getRuntime().getCurrentContext(),"respond_to?",getRuntime().newSymbol(name)).isTrue(); + } + } + + /** rb_singleton_class + * + * Note: this method is specialized for RubyFixnum, RubySymbol, + * RubyNil and RubyBoolean + * + * Will either return the existing singleton class for this + * object, or create a new one and return that. + */ + public RubyClass getSingletonClass() { + RubyClass klass; + + if (getMetaClass().isSingleton() && ((MetaClass)getMetaClass()).getAttached() == this) { + klass = getMetaClass(); + } else { + klass = makeMetaClass(getMetaClass()); + } + + klass.setTaint(isTaint()); + if (isFrozen()) klass.setFrozen(true); + + return klass; + } + + /** rb_singleton_class_clone + * + * Will make sure that if the current objects class is a + * singleton, it will get cloned. + * + * @return either a real class, or a clone of the current singleton class + */ + protected RubyClass getSingletonClassClone() { + RubyClass klass = getMetaClass(); + + if (!klass.isSingleton()) return klass; + + MetaClass clone = new MetaClass(getRuntime()); + clone.flags = flags; + + if (this instanceof RubyClass) { + clone.setMetaClass(clone); + } else { + clone.setMetaClass(klass.getSingletonClassClone()); + } + + clone.setSuperClass(klass.getSuperClass()); + + if (klass.hasVariables()) { + clone.syncVariables(klass.getVariableList()); + } + + klass.cloneMethods(clone); + + ((MetaClass)clone.getMetaClass()).setAttached(clone); + + ((MetaClass)clone).setAttached(((MetaClass)klass).getAttached()); + + return clone; + } + + /** init_copy + * + * Initializes a copy with variable and special instance variable + * information, and then call the initialize_copy Ruby method. + */ + private static void initCopy(IRubyObject clone, RubyObject original) { + assert !clone.isFrozen() : "frozen object (" + clone.getMetaClass().getName() + ") allocated"; + + original.copySpecialInstanceVariables(clone); + + if (original.hasVariables()) { + clone.syncVariables(original.getVariableList()); + } + + /* FIXME: finalizer should be dupped here */ + clone.callMethod(clone.getRuntime().getCurrentContext(), "initialize_copy", original); + } + + /** OBJ_INFECT + * + * Infects this object with traits from the argument obj. In real + * terms this currently means that if obj is tainted, this object + * will get tainted too. It's possible to hijack this method to do + * other infections if that would be interesting. + */ + public IRubyObject infectBy(IRubyObject obj) { + if (obj.isTaint()) setTaint(true); + return this; + } + + /** + * The protocol for super method invocation is a bit complicated + * in Ruby. In real terms it involves first finding the real + * implementation class (the super class), getting the name of the + * method to call from the frame, and then invoke that on the + * super class with the current self as the actual object + * invoking. + */ + public IRubyObject callSuper(ThreadContext context, IRubyObject[] args, Block block) { + RubyModule klazz = context.getFrameKlazz(); + + RubyClass superClass = RuntimeHelpers.findImplementerIfNecessary(getMetaClass(), klazz).getSuperClass(); + + if (superClass == null) { + String name = context.getFrameName(); + return RuntimeHelpers.callMethodMissing(context, this, klazz.searchMethod(name), name, args, this, CallType.SUPER, block); + } + return RuntimeHelpers.invokeAs(context, superClass, this, context.getFrameName(), args, CallType.SUPER, block); + } + + /** + * Will invoke a named method with no arguments and no block. + */ + public final IRubyObject callMethod(ThreadContext context, String name) { + return RuntimeHelpers.invoke(context, this, name); + } + + /** + * Will invoke a named method with one argument and no block with + * functional invocation. + */ + public final IRubyObject callMethod(ThreadContext context, String name, IRubyObject arg) { + return RuntimeHelpers.invoke(context, this, name, arg); + } + + /** + * Will invoke a named method with the supplied arguments and no + * block with functional invocation. + */ + public final IRubyObject callMethod(ThreadContext context, String name, IRubyObject[] args) { + return RuntimeHelpers.invoke(context, this, name, args); + } + + /** + * Will invoke a named method with the supplied arguments and + * supplied block with functional invocation. + */ + public final IRubyObject callMethod(ThreadContext context, String name, IRubyObject[] args, Block block) { + return RuntimeHelpers.invoke(context, this, name, args, block); + } + + /** + * Will invoke an indexed method with the no arguments and no + * block. + */ + public final IRubyObject callMethod(ThreadContext context, int methodIndex, String name) { + return RuntimeHelpers.invoke(context, this, name); + } + + /** + * Will invoke an indexed method with the one argument and no + * block with a functional invocation. + */ + public final IRubyObject callMethod(ThreadContext context, int methodIndex, String name, IRubyObject arg) { + return RuntimeHelpers.invoke(context, this, name, arg, Block.NULL_BLOCK); + } + + /** + * Call the Ruby initialize method with the supplied arguments and block. + */ + public final void callInit(IRubyObject[] args, Block block) { + callMethod(getRuntime().getCurrentContext(), "initialize", args, block); + } + + /** rb_to_id + * + * Will try to convert this object to a String using the Ruby + * "to_str" if the object isn't already a String. If this still + * doesn't work, will throw a Ruby TypeError. + * + */ + public String asJavaString() { + IRubyObject asString = checkStringType(); + if(!asString.isNil()) return ((RubyString)asString).asJavaString(); + throw getRuntime().newTypeError(inspect().toString() + " is not a symbol"); + } + + /** + * Tries to convert this object to a Ruby Array using the "to_ary" + * method. + */ + public RubyArray convertToArray() { + return (RubyArray) TypeConverter.convertToType(this, getRuntime().getArray(), MethodIndex.TO_ARY, "to_ary"); + } + + /** + * Tries to convert this object to a Ruby Hash using the "to_hash" + * method. + */ + public RubyHash convertToHash() { + return (RubyHash)TypeConverter.convertToType(this, getRuntime().getHash(), MethodIndex.TO_HASH, "to_hash"); + } + + /** + * Tries to convert this object to a Ruby Float using the "to_f" + * method. + */ + public RubyFloat convertToFloat() { + return (RubyFloat) TypeConverter.convertToType(this, getRuntime().getFloat(), MethodIndex.TO_F, "to_f"); + } + + /** + * Tries to convert this object to a Ruby Integer using the "to_int" + * method. + */ + public RubyInteger convertToInteger() { + return convertToInteger(MethodIndex.TO_INT, "to_int"); + } + + /** + * Tries to convert this object to a Ruby Integer using the + * supplied conversion method. + */ + public RubyInteger convertToInteger(int convertMethodIndex, String convertMethod) { + IRubyObject val = TypeConverter.convertToType(this, getRuntime().getInteger(), convertMethodIndex, convertMethod, true); + if (!(val instanceof RubyInteger)) throw getRuntime().newTypeError(getMetaClass().getName() + "#" + convertMethod + " should return Integer"); + return (RubyInteger)val; + } + + /** + * Tries to convert this object to a Ruby String using the + * "to_str" method. + */ + public RubyString convertToString() { + return (RubyString) TypeConverter.convertToType(this, getRuntime().getString(), MethodIndex.TO_STR, "to_str"); + } + + /** + * Tries to convert this object to the specified Ruby type, using + * a specific conversion method. + */ + public final IRubyObject convertToType(RubyClass target, int convertMethodIndex) { + return TypeConverter.convertToType(this, target, convertMethodIndex, (String)MethodIndex.NAMES.get(convertMethodIndex)); + } + + /** rb_obj_as_string + * + * First converts this object into a String using the "to_s" + * method, infects it with the current taint and returns it. If + * to_s doesn't return a Ruby String, {@link #anyToString} is used + * instead. + */ + public RubyString asString() { + IRubyObject str = RuntimeHelpers.invoke(getRuntime().getCurrentContext(), this, "to_s"); + + if (!(str instanceof RubyString)) return (RubyString)anyToString(); + if (isTaint()) str.setTaint(true); + return (RubyString) str; + } + + /** rb_check_string_type + * + * Tries to return a coerced string representation of this object, + * using "to_str". If that returns something other than a String + * or nil, an empty String will be returned. + * + */ + public IRubyObject checkStringType() { + IRubyObject str = TypeConverter.convertToTypeWithCheck(this, getRuntime().getString(), MethodIndex.TO_STR, "to_str"); + if(!str.isNil() && !(str instanceof RubyString)) { + str = RubyString.newEmptyString(getRuntime()); + } + return str; + } + + /** rb_check_array_type + * + * Returns the result of trying to convert this object to an Array + * with "to_ary". + */ + public IRubyObject checkArrayType() { + return TypeConverter.convertToTypeWithCheck(this, getRuntime().getArray(), MethodIndex.TO_ARY, "to_ary"); + } + + /** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */ + @Deprecated + public IRubyObject specificEval(ThreadContext context, RubyModule mod, IRubyObject[] args, Block block) { + if (block.isGiven()) { + if (args.length > 0) throw getRuntime().newArgumentError(args.length, 0); + + return yieldUnder(context, mod, block); + } + + if (args.length == 0) { + throw getRuntime().newArgumentError("block not supplied"); + } else if (args.length > 3) { + String lastFuncName = context.getFrameName(); + throw getRuntime().newArgumentError( + "wrong # of arguments: " + lastFuncName + "(src) or " + lastFuncName + "{..}"); + } + + // We just want the TypeError if the argument doesn't convert to a String (JRUBY-386) + RubyString evalStr; + if (args[0] instanceof RubyString) { + evalStr = (RubyString)args[0]; + } else { + evalStr = args[0].convertToString(); + } + + String file; + int line; + if (args.length > 1) { + file = args[1].convertToString().asJavaString(); + if (args.length > 2) { + line = (int)(args[2].convertToInteger().getLongValue() - 1); + } else { + line = 0; + } + } else { + file = "(eval)"; + line = 0; + } + + return evalUnder(context, mod, evalStr, file, line); + } + + /** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */ + public IRubyObject specificEval(ThreadContext context, RubyModule mod, Block block) { + if (block.isGiven()) { + return yieldUnder(context, mod, block); + } else { + throw context.getRuntime().newArgumentError("block not supplied"); + } + } + + /** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */ + public IRubyObject specificEval(ThreadContext context, RubyModule mod, IRubyObject arg, Block block) { + if (block.isGiven()) throw context.getRuntime().newArgumentError(1, 0); + + // We just want the TypeError if the argument doesn't convert to a String (JRUBY-386) + RubyString evalStr; + if (arg instanceof RubyString) { + evalStr = (RubyString)arg; + } else { + evalStr = arg.convertToString(); + } + + String file = "(eval)"; + int line = 0; + + return evalUnder(context, mod, evalStr, file, line); + } + + /** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */ + public IRubyObject specificEval(ThreadContext context, RubyModule mod, IRubyObject arg0, IRubyObject arg1, Block block) { + if (block.isGiven()) throw context.getRuntime().newArgumentError(2, 0); + + // We just want the TypeError if the argument doesn't convert to a String (JRUBY-386) + RubyString evalStr; + if (arg0 instanceof RubyString) { + evalStr = (RubyString)arg0; + } else { + evalStr = arg0.convertToString(); + } + + String file = arg1.convertToString().asJavaString(); + int line = 0; + + return evalUnder(context, mod, evalStr, file, line); + } + + /** specific_eval + * + * Evaluates the block or string inside of the context of this + * object, using the supplied arguments. If a block is given, this + * will be yielded in the specific context of this object. If no + * block is given then a String-like object needs to be the first + * argument, and this string will be evaluated. Second and third + * arguments in the args-array is optional, but can contain the + * filename and line of the string under evaluation. + */ + public IRubyObject specificEval(ThreadContext context, RubyModule mod, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) { + if (block.isGiven()) throw context.getRuntime().newArgumentError(2, 0); + + // We just want the TypeError if the argument doesn't convert to a String (JRUBY-386) + RubyString evalStr; + if (arg0 instanceof RubyString) { + evalStr = (RubyString)arg0; + } else { + evalStr = arg0.convertToString(); + } + + String file = arg1.convertToString().asJavaString(); + int line = (int)(arg2.convertToInteger().getLongValue() - 1); + + return evalUnder(context, mod, evalStr, file, line); + } + + /** + * Evaluates the string src with self set to the current object, + * using the module under as the context. + * @deprecated Call with an int line number and String file + */ + public IRubyObject evalUnder(final ThreadContext context, RubyModule under, IRubyObject src, IRubyObject file, IRubyObject line) { + return evalUnder(context, under, src.convertToString(), file.convertToString().toString(), (int) (line.convertToInteger().getLongValue() - 1)); + } + + /** + * Evaluates the string src with self set to the current object, + * using the module under as the context. + */ + public IRubyObject evalUnder(final ThreadContext context, RubyModule under, RubyString src, String file, int line) { + Visibility savedVisibility = context.getCurrentVisibility(); + context.setCurrentVisibility(Visibility.PUBLIC); + context.preExecuteUnder(under, Block.NULL_BLOCK); + try { + return ASTInterpreter.evalSimple(context, this, src, + file, line); + } finally { + context.postExecuteUnder(); + context.setCurrentVisibility(savedVisibility); + } + } + + /** + * Will yield to the specific block changing the self to be the + * current object instead of the self that is part of the frame + * saved in the block frame. This method is the basis for the Ruby + * instance_eval and module_eval methods. The arguments sent in to + * it in the args array will be yielded to the block. This makes + * it possible to emulate both instance_eval and instance_exec + * with this implementation. + */ + private IRubyObject yieldUnder(final ThreadContext context, RubyModule under, IRubyObject[] args, Block block) { + context.preExecuteUnder(under, block); + + Visibility savedVisibility = block.getBinding().getVisibility(); + block.getBinding().setVisibility(Visibility.PUBLIC); + + try { + IRubyObject valueInYield; + boolean aValue; + if (args.length == 1) { + valueInYield = args[0]; + aValue = false; + } else { + valueInYield = RubyArray.newArrayNoCopy(context.getRuntime(), args); + aValue = true; + } + + // FIXME: This is an ugly hack to resolve JRUBY-1381; I'm not proud of it + block = block.cloneBlock(); + block.getBinding().setSelf(RubyObject.this); + block.getBinding().getFrame().setSelf(RubyObject.this); + // end hack + + return block.yield(context, valueInYield, RubyObject.this, context.getRubyClass(), aValue); + //TODO: Should next and return also catch here? + } catch (JumpException.BreakJump bj) { + return (IRubyObject) bj.getValue(); + } finally { + block.getBinding().setVisibility(savedVisibility); + + context.postExecuteUnder(); + } + } + + /** + * Will yield to the specific block changing the self to be the + * current object instead of the self that is part of the frame + * saved in the block frame. This method is the basis for the Ruby + * instance_eval and module_eval methods. The arguments sent in to + * it in the args array will be yielded to the block. This makes + * it possible to emulate both instance_eval and instance_exec + * with this implementation. + */ + private IRubyObject yieldUnder(final ThreadContext context, RubyModule under, Block block) { + context.preExecuteUnder(under, block); + + Visibility savedVisibility = block.getBinding().getVisibility(); + block.getBinding().setVisibility(Visibility.PUBLIC); + + try { + // FIXME: This is an ugly hack to resolve JRUBY-1381; I'm not proud of it + block = block.cloneBlock(); + block.getBinding().setSelf(RubyObject.this); + block.getBinding().getFrame().setSelf(RubyObject.this); + // end hack + + return block.yield(context, this, this, context.getRubyClass(), false); + //TODO: Should next and return also catch here? + } catch (JumpException.BreakJump bj) { + return (IRubyObject) bj.getValue(); + } finally { + block.getBinding().setVisibility(savedVisibility); + + context.postExecuteUnder(); + } + } + + // Methods of the Object class (rb_obj_*): + + /** rb_obj_equal + * + * Will by default use identity equality to compare objects. This + * follows the Ruby semantics. + */ + @JRubyMethod(name = "==", required = 1) + public IRubyObject op_equal(ThreadContext context, IRubyObject obj) { + return this == obj ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + /** rb_obj_equal + * + * Will use Java identity equality. + */ + @JRubyMethod(name = "equal?", required = 1) + public IRubyObject equal_p(ThreadContext context, IRubyObject obj) { + return this == obj ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + /** method used for Hash key comparison (specialized for String, Symbol and Fixnum) + * + * Will by default just call the Ruby method "eql?" + */ + public boolean eql(IRubyObject other) { + return callMethod(getRuntime().getCurrentContext(), MethodIndex.EQL_P, "eql?", other).isTrue(); + } + + /** rb_obj_equal + * + * Just like "==" and "equal?", "eql?" will use identity equality for Object. + */ + @JRubyMethod(name = "eql?", required = 1) + public IRubyObject eql_p(IRubyObject obj) { + return this == obj ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + /** rb_equal + * + * The Ruby "===" method is used by default in case/when + * statements. The Object implementation first checks Java identity + * equality and then calls the "==" method too. + */ + @JRubyMethod(name = "===", required = 1) + public IRubyObject op_eqq(ThreadContext context, IRubyObject other) { + return context.getRuntime().newBoolean(equalInternal(context, this, other)); + } + + /** + * Helper method for checking equality, first using Java identity + * equality, and then calling the "==" method. + */ + protected static boolean equalInternal(final ThreadContext context, final IRubyObject that, final IRubyObject other){ + return that == other || that.callMethod(context, MethodIndex.EQUALEQUAL, "==", other).isTrue(); + } + + /** + * Helper method for checking equality, first using Java identity + * equality, and then calling the "eql?" method. + */ + protected static boolean eqlInternal(final ThreadContext context, final IRubyObject that, final IRubyObject other){ + return that == other || that.callMethod(context, MethodIndex.EQL_P, "eql?", other).isTrue(); + } + + /** rb_obj_init_copy + * + * Initializes this object as a copy of the original, that is the + * parameter to this object. Will make sure that the argument + * actually has the same real class as this object. It shouldn't + * be possible to initialize an object with something totally + * different. + */ + @JRubyMethod(name = "initialize_copy", required = 1, visibility = Visibility.PRIVATE) + public IRubyObject initialize_copy(IRubyObject original) { + if (this == original) return this; + checkFrozen(); + + if (getMetaClass().getRealClass() != original.getMetaClass().getRealClass()) { + throw getRuntime().newTypeError("initialize_copy should take same class object"); + } + + return this; + } + + /** obj_respond_to + * + * respond_to?( aSymbol, includePriv=false ) -> true or false + * + * Returns true if this object responds to the given method. Private + * methods are included in the search only if the optional second + * parameter evaluates to true. + * + * @return true if this responds to the given method + * + * !!! For some reason MRI shows the arity of respond_to? as -1, when it should be -2; that's why this is rest instead of required, optional = 1 + * + * Going back to splitting according to method arity. MRI is wrong + * about most of these anyway, and since we have arity splitting + * in both the compiler and the interpreter, the performance + * benefit is important for this method. + */ + @JRubyMethod(name = "respond_to?") + public RubyBoolean respond_to_p(IRubyObject mname) { + String name = mname.asJavaString(); + return getRuntime().newBoolean(getMetaClass().isMethodBound(name, true)); + } + + /** obj_respond_to + * + * respond_to?( aSymbol, includePriv=false ) -> true or false + * + * Returns true if this object responds to the given method. Private + * methods are included in the search only if the optional second + * parameter evaluates to true. + * + * @return true if this responds to the given method + * + * !!! For some reason MRI shows the arity of respond_to? as -1, when it should be -2; that's why this is rest instead of required, optional = 1 + * + * Going back to splitting according to method arity. MRI is wrong + * about most of these anyway, and since we have arity splitting + * in both the compiler and the interpreter, the performance + * benefit is important for this method. + */ + @JRubyMethod(name = "respond_to?") + public RubyBoolean respond_to_p(IRubyObject mname, IRubyObject includePrivate) { + String name = mname.asJavaString(); + return getRuntime().newBoolean(getMetaClass().isMethodBound(name, !includePrivate.isTrue())); + } + + /** rb_obj_id + * + * Return the internal id of an object. + * + * FIXME: Should this be renamed to match its ruby name? + */ + @JRubyMethod(name = {"object_id", "__id__"}) + public synchronized IRubyObject id() { + return getRuntime().newFixnum(getRuntime().getObjectSpace().idOf(this)); + } + + /** rb_obj_id_obsolete + * + * Old id version. This one is bound to the "id" name and will emit a deprecation warning. + */ + @JRubyMethod(name = "id") + public synchronized IRubyObject id_deprecated() { + getRuntime().getWarnings().warn(ID.DEPRECATED_METHOD, "Object#id will be deprecated; use Object#object_id", "Object#id", "Object#object_id"); + return id(); + } + + /** rb_obj_id + * + * Will return the hash code of this object. In comparison to MRI, + * this method will use the Java identity hash code instead of + * using rb_obj_id, since the usage of id in JRuby will incur the + * cost of some. ObjectSpace maintenance. + */ + @JRubyMethod(name = "hash") + public RubyFixnum hash() { + return getRuntime().newFixnum(super.hashCode()); + } + + /** + * Override the Object#hashCode method to make sure that the Ruby + * hash is actually used as the hashcode for Ruby objects. If the + * Ruby "hash" method doesn't return a number, the Object#hashCode + * implementation will be used instead. + */ + @Override + public int hashCode() { + IRubyObject hashValue = callMethod(getRuntime().getCurrentContext(), MethodIndex.HASH, "hash"); + + if (hashValue instanceof RubyFixnum) return (int) RubyNumeric.fix2long(hashValue); + + return super.hashCode(); + } + + /** rb_obj_class + * + * Returns the real class of this object, excluding any + * singleton/meta class in the inheritance chain. + */ + @JRubyMethod(name = "class") + public RubyClass type() { + return getMetaClass().getRealClass(); + } + + /** rb_obj_type + * + * The deprecated version of type, that emits a deprecation + * warning. + */ + @JRubyMethod(name = "type") + public RubyClass type_deprecated() { + getRuntime().getWarnings().warn(ID.DEPRECATED_METHOD, "Object#type is deprecated; use Object#class", "Object#type", "Object#class"); + return type(); + } + + /** rb_obj_clone + * + * This method should be overridden only by: Proc, Method, + * UnboundedMethod, Binding. It will use the defined allocated of + * the object, then clone the singleton class, taint the object, + * call initCopy and then copy frozen state. + */ + @JRubyMethod(name = "clone", frame = true) + public IRubyObject rbClone() { + if (isImmediate()) throw getRuntime().newTypeError("can't clone " + getMetaClass().getName()); + + // We're cloning ourselves, so we know the result should be a RubyObject + RubyObject clone = (RubyObject)getMetaClass().getRealClass().allocate(); + clone.setMetaClass(getSingletonClassClone()); + if (isTaint()) clone.setTaint(true); + + initCopy(clone, this); + + if (isFrozen()) clone.setFrozen(true); + return clone; + } + + /** rb_obj_dup + * + * This method should be overridden only by: Proc + * + * Will allocate a new instance of the real class of this object, + * and then initialize that copy. It's different from {@link + * #rbClone} in that it doesn't copy the singleton class. + */ + @JRubyMethod(name = "dup") + public IRubyObject dup() { + if (isImmediate()) throw getRuntime().newTypeError("can't dup " + getMetaClass().getName()); + + IRubyObject dup = getMetaClass().getRealClass().allocate(); + if (isTaint()) dup.setTaint(true); + + initCopy(dup, this); + + return dup; + } + + /** + * Lots of MRI objects keep their state in non-lookupable ivars + * (e:g. Range, Struct, etc). This method is responsible for + * dupping our java field equivalents + */ + protected void copySpecialInstanceVariables(IRubyObject clone) { + } + + /** rb_obj_display + * + * call-seq: + * obj.display(port=$>) => nil + * + * Prints <i>obj</i> on the given port (default <code>$></code>). + * Equivalent to: + * + * def display(port=$>) + * port.write self + * end + * + * For example: + * + * 1.display + * "cat".display + * [ 4, 5, 6 ].display + * puts + * + * <em>produces:</em> + * + * 1cat456 + * + */ + @JRubyMethod(name = "display", optional = 1) + public IRubyObject display(ThreadContext context, IRubyObject[] args) { + IRubyObject port = args.length == 0 ? context.getRuntime().getGlobalVariables().get("$>") : args[0]; + + port.callMethod(context, "write", this); + + return context.getRuntime().getNil(); + } + + /** rb_obj_tainted + * + * call-seq: + * obj.tainted? => true or false + * + * Returns <code>true</code> if the object is tainted. + * + */ + @JRubyMethod(name = "tainted?") + public RubyBoolean tainted_p(ThreadContext context) { + return context.getRuntime().newBoolean(isTaint()); + } + + /** rb_obj_taint + * + * call-seq: + * obj.taint -> obj + * + * Marks <i>obj</i> as tainted---if the <code>$SAFE</code> level is + * set appropriately, many method calls which might alter the running + * programs environment will refuse to accept tainted strings. + */ + @JRubyMethod(name = "taint") + public IRubyObject taint(ThreadContext context) { + taint(context.getRuntime()); + return this; + } + + private void taint(Ruby runtime) { + runtime.secure(4); + if (!isTaint()) { + testFrozen("object"); + setTaint(true); + } + } + + /** rb_obj_untaint + * + * call-seq: + * obj.untaint => obj + * + * Removes the taint from <i>obj</i>. + * + * Only callable in if more secure than 3. + */ + @JRubyMethod(name = "untaint") + public IRubyObject untaint(ThreadContext context) { + context.getRuntime().secure(3); + + if (isTaint()) { + testFrozen("object"); + setTaint(false); + } + + return this; + } + + /** rb_obj_freeze + * + * call-seq: + * obj.freeze => obj + * + * Prevents further modifications to <i>obj</i>. A + * <code>TypeError</code> will be raised if modification is attempted. + * There is no way to unfreeze a frozen object. See also + * <code>Object#frozen?</code>. + * + * a = [ "a", "b", "c" ] + * a.freeze + * a << "z" + * + * <em>produces:</em> + * + * prog.rb:3:in `<<': can't modify frozen array (TypeError) + * from prog.rb:3 + */ + @JRubyMethod(name = "freeze") + public IRubyObject freeze(ThreadContext context) { + if ((flags & FROZEN_F) == 0) { + if (context.getRuntime().getSafeLevel() >= 4 && isTaint()) { + throw context.getRuntime().newSecurityError("Insecure: can't freeze object"); + } + flags |= FROZEN_F; + } + return this; + } + + /** rb_obj_frozen_p + * + * call-seq: + * obj.frozen? => true or false + * + * Returns the freeze status of <i>obj</i>. + * + * a = [ "a", "b", "c" ] + * a.freeze #=> ["a", "b", "c"] + * a.frozen? #=> true + */ + @JRubyMethod(name = "frozen?") + public RubyBoolean frozen_p(ThreadContext context) { + return context.getRuntime().newBoolean(isFrozen()); + } + + /** inspect_obj + * + * The internal helper method that takes care of the part of the + * inspection that inspects instance variables. + */ + private StringBuilder inspectObj(StringBuilder part) { + ThreadContext context = getRuntime().getCurrentContext(); + String sep = ""; + + for (Variable<IRubyObject> ivar : getInstanceVariableList()) { + part.append(sep).append(" ").append(ivar.getName()).append("="); + part.append(ivar.getValue().callMethod(context, "inspect")); + sep = ","; + } + part.append(">"); + return part; + } + + /** rb_inspect + * + * The internal helper that ensures a RubyString instance is returned + * so dangerous casting can be omitted + * Prefered over callMethod(context, "inspect") + */ + static RubyString inspect(ThreadContext context, IRubyObject object) { + return RubyString.objAsString(context, object.callMethod(context, "inspect")); + } + + /** rb_obj_inspect + * + * call-seq: + * obj.inspect => string + * + * Returns a string containing a human-readable representation of + * <i>obj</i>. If not overridden, uses the <code>to_s</code> method to + * generate the string. + * + * [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]" + * Time.new.inspect #=> "Wed Apr 09 08:54:39 CDT 2003" + */ + @JRubyMethod(name = "inspect") + public IRubyObject inspect() { + Ruby runtime = getRuntime(); + if ((!isImmediate()) && + // TYPE(obj) == T_OBJECT + !(this instanceof RubyClass) && + this != runtime.getObject() && + this != runtime.getModule() && + !(this instanceof RubyModule) && + // TODO: should have #hasInstanceVariables method, though + // this will work here: + hasVariables()) { + + StringBuilder part = new StringBuilder(); + String cname = getMetaClass().getRealClass().getName(); + part.append("#<").append(cname).append(":0x"); + part.append(Integer.toHexString(System.identityHashCode(this))); + + if (runtime.isInspecting(this)) { + /* 6:tags 16:addr 1:eos */ + part.append(" ...>"); + return runtime.newString(part.toString()); + } + try { + runtime.registerInspecting(this); + return runtime.newString(inspectObj(part).toString()); + } finally { + runtime.unregisterInspecting(this); + } + } + + if (isNil()) return RubyNil.inspect(this); + return RuntimeHelpers.invoke(runtime.getCurrentContext(), this, "to_s"); + } + + /** rb_obj_is_instance_of + * + * call-seq: + * obj.instance_of?(class) => true or false + * + * Returns <code>true</code> if <i>obj</i> is an instance of the given + * class. See also <code>Object#kind_of?</code>. + */ + @JRubyMethod(name = "instance_of?", required = 1) + public RubyBoolean instance_of_p(ThreadContext context, IRubyObject type) { + if (type() == type) { + return context.getRuntime().getTrue(); + } else if (!(type instanceof RubyModule)) { + throw context.getRuntime().newTypeError("class or module required"); + } else { + return context.getRuntime().getFalse(); + } + } + + + /** rb_obj_is_kind_of + * + * call-seq: + * obj.is_a?(class) => true or false + * obj.kind_of?(class) => true or false + * + * Returns <code>true</code> if <i>class</i> is the class of + * <i>obj</i>, or if <i>class</i> is one of the superclasses of + * <i>obj</i> or modules included in <i>obj</i>. + * + * module M; end + * class A + * include M + * end + * class B < A; end + * class C < B; end + * b = B.new + * b.instance_of? A #=> false + * b.instance_of? B #=> true + * b.instance_of? C #=> false + * b.instance_of? M #=> false + * b.kind_of? A #=> true + * b.kind_of? B #=> true + * b.kind_of? C #=> false + * b.kind_of? M #=> true + */ + @JRubyMethod(name = {"kind_of?", "is_a?"}, required = 1) + public RubyBoolean kind_of_p(ThreadContext context, IRubyObject type) { + // TODO: Generalize this type-checking code into IRubyObject helper. + if (!(type instanceof RubyModule)) { + // TODO: newTypeError does not offer enough for ruby error string... + throw context.getRuntime().newTypeError("class or module required"); + } + + return context.getRuntime().newBoolean(((RubyModule)type).isInstance(this)); + } + + /** rb_obj_methods + * + * call-seq: + * obj.methods => array + * + * Returns a list of the names of methods publicly accessible in + * <i>obj</i>. This will include all the methods accessible in + * <i>obj</i>'s ancestors. + * + * class Klass + * def kMethod() + * end + * end + * k = Klass.new + * k.methods[0..9] #=> ["kMethod", "freeze", "nil?", "is_a?", + * "class", "instance_variable_set", + * "methods", "extend", "__send__", "instance_eval"] + * k.methods.length #=> 42 + */ + @JRubyMethod(name = "methods", optional = 1) + public IRubyObject methods(ThreadContext context, IRubyObject[] args) { + boolean all = true; + if (args.length == 1) { + all = args[0].isTrue(); + } + + RubyArray singletonMethods = null; + if (getMetaClass().isSingleton()) { + singletonMethods = + getMetaClass().instance_methods(new IRubyObject[] {context.getRuntime().getFalse()}); + if (all) { + singletonMethods.concat(getMetaClass().getSuperClass().instance_methods(new IRubyObject[] {context.getRuntime().getTrue()})); + } + } else { + if (all) { + singletonMethods = getMetaClass().instance_methods(new IRubyObject[] {context.getRuntime().getTrue()}); + } else { + singletonMethods = context.getRuntime().newEmptyArray(); + } + } + + return singletonMethods; + } + + /** rb_obj_public_methods + * + * call-seq: + * obj.public_methods(all=true) => array + * + * Returns the list of public methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + */ + @JRubyMethod(name = "public_methods", optional = 1) + public IRubyObject public_methods(ThreadContext context, IRubyObject[] args) { + if (args.length == 0) { + args = new IRubyObject[] { context.getRuntime().getTrue() }; + } + + return getMetaClass().public_instance_methods(args); + } + + /** rb_obj_protected_methods + * + * call-seq: + * obj.protected_methods(all=true) => array + * + * Returns the list of protected methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + * + * Internally this implementation uses the + * {@link RubyModule#protected_instance_methods} method. + */ + @JRubyMethod(name = "protected_methods", optional = 1) + public IRubyObject protected_methods(ThreadContext context, IRubyObject[] args) { + if (args.length == 0) { + args = new IRubyObject[] { context.getRuntime().getTrue() }; + } + + return getMetaClass().protected_instance_methods(args); + } + + /** rb_obj_private_methods + * + * call-seq: + * obj.private_methods(all=true) => array + * + * Returns the list of private methods accessible to <i>obj</i>. If + * the <i>all</i> parameter is set to <code>false</code>, only those methods + * in the receiver will be listed. + * + * Internally this implementation uses the + * {@link RubyModule#private_instance_methods} method. + */ + @JRubyMethod(name = "private_methods", optional = 1) + public IRubyObject private_methods(ThreadContext context, IRubyObject[] args) { + if (args.length == 0) { + args = new IRubyObject[] { context.getRuntime().getTrue() }; + } + + return getMetaClass().private_instance_methods(args); + } + + /** rb_obj_singleton_methods + * + * call-seq: + * obj.singleton_methods(all=true) => array + * + * Returns an array of the names of singleton methods for <i>obj</i>. + * If the optional <i>all</i> parameter is true, the list will include + * methods in modules included in <i>obj</i>. + * + * module Other + * def three() end + * end + * + * class Single + * def Single.four() end + * end + * + * a = Single.new + * + * def a.one() + * end + * + * class << a + * include Other + * def two() + * end + * end + * + * Single.singleton_methods #=> ["four"] + * a.singleton_methods(false) #=> ["two", "one"] + * a.singleton_methods #=> ["two", "one", "three"] + */ + // TODO: This is almost RubyModule#instance_methods on the metaClass. Perhaps refactor. + @JRubyMethod(name = "singleton_methods", optional = 1) + public RubyArray singleton_methods(ThreadContext context, IRubyObject[] args) { + boolean all = true; + if(args.length == 1) { + all = args[0].isTrue(); + } + + RubyArray singletonMethods; + if (getMetaClass().isSingleton()) { + singletonMethods = getMetaClass().instance_methods(new IRubyObject[] {context.getRuntime().getFalse()}); + if (all) { + RubyClass superClass = getMetaClass().getSuperClass(); + while (superClass.isIncluded()) { + singletonMethods.concat(superClass.instance_methods(new IRubyObject[] {context.getRuntime().getFalse()})); + superClass = superClass.getSuperClass(); + } + } + } else { + singletonMethods = context.getRuntime().newEmptyArray(); + } + + return singletonMethods; + } + + /** rb_obj_method + * + * call-seq: + * obj.method(sym) => method + * + * Looks up the named method as a receiver in <i>obj</i>, returning a + * <code>Method</code> object (or raising <code>NameError</code>). The + * <code>Method</code> object acts as a closure in <i>obj</i>'s object + * instance, so instance variables and the value of <code>self</code> + * remain available. + * + * class Demo + * def initialize(n) + * @iv = n + * end + * def hello() + * "Hello, @iv = #{@iv}" + * end + * end + * + * k = Demo.new(99) + * m = k.method(:hello) + * m.call #=> "Hello, @iv = 99" + * + * l = Demo.new('Fred') + * m = l.method("hello") + * m.call #=> "Hello, @iv = Fred" + */ + @JRubyMethod(name = "method", required = 1) + public IRubyObject method(IRubyObject symbol) { + return getMetaClass().newMethod(this, symbol.asJavaString(), true); + } + + /** + * Internal method that helps to convert any object into the + * format of a class name and a hex string inside of #<>. + */ + public IRubyObject anyToString() { + String cname = getMetaClass().getRealClass().getName(); + /* 6:tags 16:addr 1:eos */ + RubyString str = getRuntime().newString("#<" + cname + ":0x" + Integer.toHexString(System.identityHashCode(this)) + ">"); + str.setTaint(isTaint()); + return str; + } + + /** rb_any_to_s + * + * call-seq: + * obj.to_s => string + * + * Returns a string representing <i>obj</i>. The default + * <code>to_s</code> prints the object's class and an encoding of the + * object id. As a special case, the top-level object that is the + * initial execution context of Ruby programs returns ``main.'' + */ + @JRubyMethod(name = "to_s") + public IRubyObject to_s() { + return anyToString(); + } + + /** rb_any_to_a + * + * call-seq: + * obj.to_a -> anArray + * + * Returns an array representation of <i>obj</i>. For objects of class + * <code>Object</code> and others that don't explicitly override the + * method, the return value is an array containing <code>self</code>. + * However, this latter behavior will soon be obsolete. + * + * self.to_a #=> -:1: warning: default `to_a' will be obsolete + * "hello".to_a #=> ["hello"] + * Time.new.to_a #=> [39, 54, 8, 9, 4, 2003, 3, 99, true, "CDT"] + * + * The default to_a method is deprecated. + */ + @JRubyMethod(name = "to_a", visibility = Visibility.PUBLIC) + public RubyArray to_a() { + getRuntime().getWarnings().warn(ID.DEPRECATED_METHOD, "default 'to_a' will be obsolete", "to_a"); + return getRuntime().newArray(this); + } + + /** rb_obj_instance_eval + * + * call-seq: + * obj.instance_eval(string [, filename [, lineno]] ) => obj + * obj.instance_eval {| | block } => obj + * + * Evaluates a string containing Ruby source code, or the given block, + * within the context of the receiver (_obj_). In order to set the + * context, the variable +self+ is set to _obj_ while + * the code is executing, giving the code access to _obj_'s + * instance variables. In the version of <code>instance_eval</code> + * that takes a +String+, the optional second and third + * parameters supply a filename and starting line number that are used + * when reporting compilation errors. + * + * class Klass + * def initialize + * @secret = 99 + * end + * end + * k = Klass.new + * k.instance_eval { @secret } #=> 99 + */ + @JRubyMethod(name = "instance_eval", frame = true) + public IRubyObject instance_eval(ThreadContext context, Block block) { + return specificEval(context, getInstanceEvalClass(), block); + } + @JRubyMethod(name = "instance_eval", frame = true) + public IRubyObject instance_eval(ThreadContext context, IRubyObject arg0, Block block) { + return specificEval(context, getInstanceEvalClass(), arg0, block); + } + @JRubyMethod(name = "instance_eval", frame = true) + public IRubyObject instance_eval(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + return specificEval(context, getInstanceEvalClass(), arg0, arg1, block); + } + @JRubyMethod(name = "instance_eval", frame = true) + public IRubyObject instance_eval(ThreadContext context, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) { + return specificEval(context, getInstanceEvalClass(), arg0, arg1, arg2, block); + } + @Deprecated + public IRubyObject instance_eval(ThreadContext context, IRubyObject[] args, Block block) { + RubyModule klazz; + + if (isImmediate()) { + // Ruby uses Qnil here, we use "dummy" because we need a class + klazz = context.getRuntime().getDummy(); + } else { + klazz = getSingletonClass(); + } + + return specificEval(context, klazz, args, block); + } + + private RubyModule getInstanceEvalClass() { + if (isImmediate()) { + // Ruby uses Qnil here, we use "dummy" because we need a class + return getRuntime().getDummy(); + } else { + return getSingletonClass(); + } + } + + /** rb_obj_instance_exec + * + * call-seq: + * obj.instance_exec(arg...) {|var...| block } => obj + * + * Executes the given block within the context of the receiver + * (_obj_). In order to set the context, the variable +self+ is set + * to _obj_ while the code is executing, giving the code access to + * _obj_'s instance variables. Arguments are passed as block parameters. + * + * class Klass + * def initialize + * @secret = 99 + * end + * end + * k = Klass.new + * k.instance_exec(5) {|x| @secret+x } #=> 104 + */ + @JRubyMethod(name = "instance_exec", optional = 3, frame = true) + public IRubyObject instance_exec(ThreadContext context, IRubyObject[] args, Block block) { + if (!block.isGiven()) throw context.getRuntime().newArgumentError("block not supplied"); + + RubyModule klazz; + if (isImmediate()) { + // Ruby uses Qnil here, we use "dummy" because we need a class + klazz = context.getRuntime().getDummy(); + } else { + klazz = getSingletonClass(); + } + + return yieldUnder(context, klazz, args, block); + } + + /** rb_obj_extend + * + * call-seq: + * obj.extend(module, ...) => obj + * + * Adds to _obj_ the instance methods from each module given as a + * parameter. + * + * module Mod + * def hello + * "Hello from Mod.\n" + * end + * end + * + * class Klass + * def hello + * "Hello from Klass.\n" + * end + * end + * + * k = Klass.new + * k.hello #=> "Hello from Klass.\n" + * k.extend(Mod) #=> #<Klass:0x401b3bc8> + * k.hello #=> "Hello from Mod.\n" + */ + @JRubyMethod(name = "extend", required = 1, rest = true) + public IRubyObject extend(IRubyObject[] args) { + Ruby runtime = getRuntime(); + + // Make sure all arguments are modules before calling the callbacks + for (int i = 0; i < args.length; i++) { + if (!args[i].isModule()) throw runtime.newTypeError(args[i], runtime.getModule()); + } + + ThreadContext context = runtime.getCurrentContext(); + + // MRI extends in order from last to first + for (int i = args.length - 1; i >= 0; i--) { + args[i].callMethod(context, "extend_object", this); + args[i].callMethod(context, "extended", this); + } + return this; + } + + /** rb_obj_dummy + * + * Default initialize method. This one gets defined in some other + * place as a Ruby method. + */ + public IRubyObject initialize() { + return getRuntime().getNil(); + } + + /** rb_f_send + * + * send( aSymbol [, args ]* ) -> anObject + * + * Invokes the method identified by aSymbol, passing it any arguments + * specified. You can use __send__ if the name send clashes with an + * existing method in this object. + * + * <pre> + * class Klass + * def hello(*args) + * "Hello " + args.join(' ') + * end + * end + * + * k = Klass.new + * k.send :hello, "gentle", "readers" + * </pre> + * + * @return the result of invoking the method identified by aSymbol. + */ + @JRubyMethod(name = {"send", "__send__"}) + public IRubyObject send(ThreadContext context, Block block) { + throw context.getRuntime().newArgumentError(0, 1); + } + @JRubyMethod(name = {"send", "__send__"}) + public IRubyObject send(ThreadContext context, IRubyObject arg0, Block block) { + String name = arg0.asJavaString(); + + return getMetaClass().finvoke(context, this, name, block); + } + @JRubyMethod(name = {"send", "__send__"}) + public IRubyObject send(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + String name = arg0.asJavaString(); + + return getMetaClass().finvoke(context, this, name, arg1, block); + } + @JRubyMethod(name = {"send", "__send__"}) + public IRubyObject send(ThreadContext context, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) { + String name = arg0.asJavaString(); + + return getMetaClass().finvoke(context, this, name, arg1, arg2, block); + } + @JRubyMethod(name = {"send", "__send__"}, rest = true) + public IRubyObject send(ThreadContext context, IRubyObject[] args, Block block) { + String name = args[0].asJavaString(); + int newArgsLength = args.length - 1; + + IRubyObject[] newArgs; + if (newArgsLength == 0) { + newArgs = IRubyObject.NULL_ARRAY; + } else { + newArgs = new IRubyObject[newArgsLength]; + System.arraycopy(args, 1, newArgs, 0, newArgs.length); + } + + return getMetaClass().finvoke(context, this, name, newArgs, block); + } + + /** rb_false + * + * call_seq: + * nil.nil? => true + * <anything_else>.nil? => false + * + * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>. + */ + @JRubyMethod(name = "nil?") + public IRubyObject nil_p(ThreadContext context) { + return context.getRuntime().getFalse(); + } + + /** rb_obj_pattern_match + * + * call-seq: + * obj =~ other => false + * + * Pattern Match---Overridden by descendents (notably + * <code>Regexp</code> and <code>String</code>) to provide meaningful + * pattern-match semantics. + */ + @JRubyMethod(name = "=~", required = 1) + public IRubyObject op_match(ThreadContext context, IRubyObject arg) { + return context.getRuntime().getFalse(); + } + + public IRubyObject to_java() { + throw getRuntime().newTypeError(getMetaClass().getBaseName() + " cannot coerce to a Java type."); + } + + public IRubyObject as(Class javaClass) { + throw getRuntime().newTypeError(getMetaClass().getBaseName() + " cannot coerce to a Java type."); + } + + /** + * @see org.jruby.runtime.builtin.IRubyObject#getType() + */ + public RubyClass getType() { + return type(); + } + + /** + * @see org.jruby.runtime.builtin.IRubyObject#dataWrapStruct() + */ + public synchronized void dataWrapStruct(Object obj) { + this.dataStruct = obj; + } + + /** + * @see org.jruby.runtime.builtin.IRubyObject#dataGetStruct() + */ + public synchronized Object dataGetStruct() { + return dataStruct; + } + + /** + * Adds the specified object as a finalizer for this object. + */ + public void addFinalizer(IRubyObject finalizer) { + if (this.finalizer == null) { + this.finalizer = new Finalizer(getRuntime().getObjectSpace().idOf(this)); + getRuntime().addFinalizer(this.finalizer); + } + this.finalizer.addFinalizer(finalizer); + } + + /** + * Remove all the finalizers for this object. + */ + public void removeFinalizers() { + if (finalizer != null) { + finalizer.removeFinalizers(); + finalizer = null; + getRuntime().removeFinalizer(this.finalizer); + } + } + + + // + // INSTANCE VARIABLE RUBY METHODS + // + + /** rb_obj_ivar_defined + * + * call-seq: + * obj.instance_variable_defined?(symbol) => true or false + * + * Returns <code>true</code> if the given instance variable is + * defined in <i>obj</i>. + * + * class Fred + * def initialize(p1, p2) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99) + * fred.instance_variable_defined?(:@a) #=> true + * fred.instance_variable_defined?("@b") #=> true + * fred.instance_variable_defined?("@c") #=> false + */ + @JRubyMethod(name = "instance_variable_defined?", required = 1) + public IRubyObject instance_variable_defined_p(ThreadContext context, IRubyObject name) { + if (variableTableContains(validateInstanceVariable(name.asJavaString()))) { + return context.getRuntime().getTrue(); + } + return context.getRuntime().getFalse(); + } + + /** rb_obj_ivar_get + * + * call-seq: + * obj.instance_variable_get(symbol) => obj + * + * Returns the value of the given instance variable, or nil if the + * instance variable is not set. The <code>@</code> part of the + * variable name should be included for regular instance + * variables. Throws a <code>NameError</code> exception if the + * supplied symbol is not valid as an instance variable name. + * + * class Fred + * def initialize(p1, p2) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99) + * fred.instance_variable_get(:@a) #=> "cat" + * fred.instance_variable_get("@b") #=> 99 + */ + @JRubyMethod(name = "instance_variable_get", required = 1) + public IRubyObject instance_variable_get(ThreadContext context, IRubyObject name) { + IRubyObject value; + if ((value = variableTableFetch(validateInstanceVariable(name.asJavaString()))) != null) { + return value; + } + return context.getRuntime().getNil(); + } + + /** rb_obj_ivar_set + * + * call-seq: + * obj.instance_variable_set(symbol, obj) => obj + * + * Sets the instance variable names by <i>symbol</i> to + * <i>object</i>, thereby frustrating the efforts of the class's + * author to attempt to provide proper encapsulation. The variable + * did not have to exist prior to this call. + * + * class Fred + * def initialize(p1, p2) + * @a, @b = p1, p2 + * end + * end + * fred = Fred.new('cat', 99) + * fred.instance_variable_set(:@a, 'dog') #=> "dog" + * fred.instance_variable_set(:@c, 'cat') #=> "cat" + * fred.inspect #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">" + */ + @JRubyMethod(name = "instance_variable_set", required = 2) + public IRubyObject instance_variable_set(IRubyObject name, IRubyObject value) { + ensureInstanceVariablesSettable(); + return variableTableStore(validateInstanceVariable(name.asJavaString()), value); + } + + /** rb_obj_remove_instance_variable + * + * call-seq: + * obj.remove_instance_variable(symbol) => obj + * + * Removes the named instance variable from <i>obj</i>, returning that + * variable's value. + * + * class Dummy + * attr_reader :var + * def initialize + * @var = 99 + * end + * def remove + * remove_instance_variable(:@var) + * end + * end + * d = Dummy.new + * d.var #=> 99 + * d.remove #=> 99 + * d.var #=> nil + */ + @JRubyMethod(name = "remove_instance_variable", required = 1, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject remove_instance_variable(ThreadContext context, IRubyObject name, Block block) { + ensureInstanceVariablesSettable(); + IRubyObject value; + if ((value = variableTableRemove(validateInstanceVariable(name.asJavaString()))) != null) { + return value; + } + throw context.getRuntime().newNameError("instance variable " + name.asJavaString() + " not defined", name.asJavaString()); + } + + /** rb_obj_instance_variables + * + * call-seq: + * obj.instance_variables => array + * + * Returns an array of instance variable names for the receiver. Note + * that simply defining an accessor does not create the corresponding + * instance variable. + * + * class Fred + * attr_accessor :a1 + * def initialize + * @iv = 3 + * end + * end + * Fred.new.instance_variables #=> ["@iv"] + */ + @JRubyMethod(name = "instance_variables") + public RubyArray instance_variables(ThreadContext context) { + Ruby runtime = context.getRuntime(); + List<String> nameList = getInstanceVariableNameList(); + + RubyArray array = runtime.newArray(nameList.size()); + + for (String name : nameList) { + array.append(runtime.newString(name)); + } + + return array; + } + + // + // INSTANCE VARIABLE API METHODS + // + + /** + * Dummy method to avoid a cast, and to avoid polluting the + * IRubyObject interface with all the instance variable management + * methods. + */ + public InstanceVariables getInstanceVariables() { + return this; + } + + /** + * @see org.jruby.runtime.builtin.InstanceVariables#hasInstanceVariable + */ + public boolean hasInstanceVariable(String name) { + assert IdUtil.isInstanceVariable(name); + return variableTableContains(name); + } + + /** + * @see org.jruby.runtime.builtin.InstanceVariables#fastHasInstanceVariable + */ + public boolean fastHasInstanceVariable(String internedName) { + assert IdUtil.isInstanceVariable(internedName); + return variableTableFastContains(internedName); + } + + /** + * @see org.jruby.runtime.builtin.InstanceVariables#getInstanceVariable + */ + public IRubyObject getInstanceVariable(String name) { + assert IdUtil.isInstanceVariable(name); + return variableTableFetch(name); + } + + /** + * @see org.jruby.runtime.builtin.InstanceVariables#fastGetInstanceVariable + */ + public IRubyObject fastGetInstanceVariable(String internedName) { + assert IdUtil.isInstanceVariable(internedName); + return variableTableFastFetch(internedName); + } + + /** rb_iv_set / rb_ivar_set + * + * @see org.jruby.runtime.builtin.InstanceVariables#setInstanceVariable + */ + public IRubyObject setInstanceVariable(String name, IRubyObject value) { + assert IdUtil.isInstanceVariable(name) && value != null; + ensureInstanceVariablesSettable(); + return variableTableStore(name, value); + } + + /** + * @see org.jruby.runtime.builtin.InstanceVariables#fastSetInstanceVariable + */ + public IRubyObject fastSetInstanceVariable(String internedName, IRubyObject value) { + assert IdUtil.isInstanceVariable(internedName) && value != null; + ensureInstanceVariablesSettable(); + return variableTableFastStore(internedName, value); + } + + /** + * @see org.jruby.runtime.builtin.InstanceVariables#removeInstanceVariable + */ + public IRubyObject removeInstanceVariable(String name) { + assert IdUtil.isInstanceVariable(name); + ensureInstanceVariablesSettable(); + return variableTableRemove(name); + } + + /** + * @see org.jruby.runtime.builtin.InstanceVariables#getInstanceVariableList + */ + public List<Variable<IRubyObject>> getInstanceVariableList() { + VariableTableEntry[] table = variableTableGetTable(); + ArrayList<Variable<IRubyObject>> list = new ArrayList<Variable<IRubyObject>>(); + IRubyObject readValue; + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + if (IdUtil.isInstanceVariable(e.name)) { + if ((readValue = e.value) == null) readValue = variableTableReadLocked(e); + list.add(new VariableEntry<IRubyObject>(e.name, readValue)); + } + } + } + return list; + } + + /** + * @see org.jruby.runtime.builtin.InstanceVariables#getInstanceVariableNameList + */ + public List<String> getInstanceVariableNameList() { + VariableTableEntry[] table = variableTableGetTable(); + ArrayList<String> list = new ArrayList<String>(); + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + if (IdUtil.isInstanceVariable(e.name)) { + list.add(e.name); + } + } + } + return list; + } + + /** + * The error message used when some one tries to modify an + * instance variable in a high security setting. + */ + protected static final String ERR_INSECURE_SET_INST_VAR = "Insecure: can't modify instance variable"; + + /** + * Checks if the name parameter represents a legal instance variable name, and otherwise throws a Ruby NameError + */ + protected String validateInstanceVariable(String name) { + if (IdUtil.isValidInstanceVariableName(name)) return name; + + throw getRuntime().newNameError("`" + name + "' is not allowable as an instance variable name", name); + } + + /** + * Makes sure that instance variables can be set on this object, + * including information about whether this object is frozen, or + * tainted. Will throw a suitable exception in that case. + */ + protected void ensureInstanceVariablesSettable() { + if (!isFrozen() && (getRuntime().getSafeLevel() < 4 || isTaint())) { + return; + } + + if (getRuntime().getSafeLevel() >= 4 && !isTaint()) { + throw getRuntime().newSecurityError(ERR_INSECURE_SET_INST_VAR); + } + if (isFrozen()) { + if (this instanceof RubyModule) { + throw getRuntime().newFrozenError("class/module "); + } else { + throw getRuntime().newFrozenError(""); + } + } + } + + // + // INTERNAL VARIABLE METHODS + // + + /** + * Dummy method to avoid a cast, and to avoid polluting the + * IRubyObject interface with all the instance variable management + * methods. + */ + public InternalVariables getInternalVariables() { + return this; + } + + /** + * @see org.jruby.runtime.builtin.InternalVariables#hasInternalVariable + */ + public boolean hasInternalVariable(String name) { + assert !isRubyVariable(name); + return variableTableContains(name); + } + + /** + * @see org.jruby.runtime.builtin.InternalVariables#fastHasInternalVariable + */ + public boolean fastHasInternalVariable(String internedName) { + assert !isRubyVariable(internedName); + return variableTableFastContains(internedName); + } + + /** + * @see org.jruby.runtime.builtin.InternalVariables#getInternalVariable + */ + public IRubyObject getInternalVariable(String name) { + assert !isRubyVariable(name); + return variableTableFetch(name); + } + + /** + * @see org.jruby.runtime.builtin.InternalVariables#fastGetInternalVariable + */ + public IRubyObject fastGetInternalVariable(String internedName) { + assert !isRubyVariable(internedName); + return variableTableFastFetch(internedName); + } + + /** + * @see org.jruby.runtime.builtin.InternalVariables#setInternalVariable + */ + public void setInternalVariable(String name, IRubyObject value) { + assert !isRubyVariable(name); + variableTableStore(name, value); + } + + /** + * @see org.jruby.runtime.builtin.InternalVariables#fastSetInternalVariable + */ + public void fastSetInternalVariable(String internedName, IRubyObject value) { + assert !isRubyVariable(internedName); + variableTableFastStore(internedName, value); + } + + /** + * @see org.jruby.runtime.builtin.InternalVariables#removeInternalVariable + */ + public IRubyObject removeInternalVariable(String name) { + assert !isRubyVariable(name); + return variableTableRemove(name); + } + + /** + * Sync one variable table with another - this is used to make + * rbClone work correctly. + */ + public void syncVariables(List<Variable<IRubyObject>> variables) { + variableTableSync(variables); + } + + /** + * @see org.jruby.runtime.builtin.InternalVariables#getInternalVariableList + */ + public List<Variable<IRubyObject>> getInternalVariableList() { + VariableTableEntry[] table = variableTableGetTable(); + ArrayList<Variable<IRubyObject>> list = new ArrayList<Variable<IRubyObject>>(); + IRubyObject readValue; + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + if (!isRubyVariable(e.name)) { + if ((readValue = e.value) == null) readValue = variableTableReadLocked(e); + list.add(new VariableEntry<IRubyObject>(e.name, readValue)); + } + } + } + return list; + } + + + // + // COMMON VARIABLE METHODS + // + + /** + * Returns true if object has any variables, defined as: + * <ul> + * <li> instance variables + * <li> class variables + * <li> constants + * <li> internal variables, such as those used when marshaling Ranges and Exceptions + * </ul> + * @return true if object has any variables, else false + */ + public boolean hasVariables() { + return variableTableGetSize() > 0; + } + + /** + * Returns the amount of instance variables, class variables, + * constants and internal variables this object has. + */ + public int getVariableCount() { + return variableTableGetSize(); + } + + /** + * Gets a list of all variables in this object. + */ + // TODO: must override in RubyModule to pick up constants + public List<Variable<IRubyObject>> getVariableList() { + VariableTableEntry[] table = variableTableGetTable(); + ArrayList<Variable<IRubyObject>> list = new ArrayList<Variable<IRubyObject>>(); + IRubyObject readValue; + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + if ((readValue = e.value) == null) readValue = variableTableReadLocked(e); + list.add(new VariableEntry<IRubyObject>(e.name, readValue)); + } + } + return list; + } + + /** + * Gets a name list of all variables in this object. + */ + // TODO: must override in RubyModule to pick up constants + public List<String> getVariableNameList() { + VariableTableEntry[] table = variableTableGetTable(); + ArrayList<String> list = new ArrayList<String>(); + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + list.add(e.name); + } + } + return list; + } + + /** + * Gets internal access to the getmap for variables. + */ + @SuppressWarnings("unchecked") + @Deprecated // born deprecated + public Map getVariableMap() { + return variableTableGetMap(); + } + + /** + * Check the syntax of a Ruby variable, including that it's longer + * than zero characters, and starts with either an @ or a capital + * letter. + */ + // FIXME: this should go somewhere more generic -- maybe IdUtil + protected static final boolean isRubyVariable(String name) { + char c; + return name.length() > 0 && ((c = name.charAt(0)) == '@' || (c <= 'Z' && c >= 'A')); + } + + // + // VARIABLE TABLE METHODS, ETC. + // + + protected static final int VARIABLE_TABLE_DEFAULT_CAPACITY = 8; // MUST be power of 2! + protected static final int VARIABLE_TABLE_MAXIMUM_CAPACITY = 1 << 30; + protected static final float VARIABLE_TABLE_LOAD_FACTOR = 0.75f; + protected static final VariableTableEntry[] VARIABLE_TABLE_EMPTY_TABLE = new VariableTableEntry[0]; + + /** + * Every entry in the variable map is represented by an instance + * of this class. + */ + protected static final class VariableTableEntry { + final int hash; + final String name; + volatile IRubyObject value; + final VariableTableEntry next; + + VariableTableEntry(int hash, String name, IRubyObject value, VariableTableEntry next) { + assert name == name.intern() : name + " is not interned"; + this.hash = hash; + this.name = name; + this.value = value; + this.next = next; + } + } + + /** + * Reads the value of the specified entry, locked on the current + * object. + */ + protected synchronized IRubyObject variableTableReadLocked(VariableTableEntry entry) { + return entry.value; + } + + /** + * Checks if the variable table contains a variable of the + * specified name. + */ + protected boolean variableTableContains(String name) { + VariableTableEntry[] table; + if ((table = variableTable) != null) { + int hash = name.hashCode(); + for (VariableTableEntry e = table[hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + return true; + } + } + } + return false; + } + + /** + * Checks if the variable table contains the the variable of the + * specified name, where the precondition is that the name must be + * an interned Java String. + */ + protected boolean variableTableFastContains(String internedName) { + assert internedName == internedName.intern() : internedName + " not interned"; + VariableTableEntry[] table; + if ((table = variableTable) != null) { + for (VariableTableEntry e = table[internedName.hashCode() & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + return true; + } + } + } + return false; + } + + /** + * Fetch an object from the variable table based on the name. + * + * @return the object or null if not found + */ + protected IRubyObject variableTableFetch(String name) { + VariableTableEntry[] table; + IRubyObject readValue; + if ((table = variableTable) != null) { + int hash = name.hashCode(); + for (VariableTableEntry e = table[hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + if ((readValue = e.value) != null) return readValue; + return variableTableReadLocked(e); + } + } + } + return null; + } + + /** + * Fetch an object from the variable table based on the name, + * where the name must be an interned Java String. + * + * @return the object or null if not found + */ + protected IRubyObject variableTableFastFetch(String internedName) { + assert internedName == internedName.intern() : internedName + " not interned"; + VariableTableEntry[] table; + IRubyObject readValue; + if ((table = variableTable) != null) { + for (VariableTableEntry e = table[internedName.hashCode() & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + if ((readValue = e.value) != null) return readValue; + return variableTableReadLocked(e); + } + } + } + return null; + } + + /** + * Store a value in the variable store under the specific name. + */ + protected IRubyObject variableTableStore(String name, IRubyObject value) { + int hash = name.hashCode(); + synchronized(this) { + VariableTableEntry[] table; + VariableTableEntry e; + if ((table = variableTable) == null) { + table = new VariableTableEntry[VARIABLE_TABLE_DEFAULT_CAPACITY]; + e = new VariableTableEntry(hash, name.intern(), value, null); + table[hash & (VARIABLE_TABLE_DEFAULT_CAPACITY - 1)] = e; + variableTableThreshold = (int)(VARIABLE_TABLE_DEFAULT_CAPACITY * VARIABLE_TABLE_LOAD_FACTOR); + variableTableSize = 1; + variableTable = table; + return value; + } + int potentialNewSize; + if ((potentialNewSize = variableTableSize + 1) > variableTableThreshold) { + table = variableTableRehash(); + } + int index; + for (e = table[index = hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + e.value = value; + return value; + } + } + e = new VariableTableEntry(hash, name.intern(), value, table[index]); + table[index] = e; + variableTableSize = potentialNewSize; + variableTable = table; // write-volatile + } + return value; + } + + /** + * Will store the value under the specified name, where the name + * needs to be an interned Java String. + */ + protected IRubyObject variableTableFastStore(String internedName, IRubyObject value) { + assert internedName == internedName.intern() : internedName + " not interned"; + int hash = internedName.hashCode(); + synchronized(this) { + VariableTableEntry[] table; + VariableTableEntry e; + if ((table = variableTable) == null) { + table = new VariableTableEntry[VARIABLE_TABLE_DEFAULT_CAPACITY]; + e = new VariableTableEntry(hash, internedName, value, null); + table[hash & (VARIABLE_TABLE_DEFAULT_CAPACITY - 1)] = e; + variableTableThreshold = (int)(VARIABLE_TABLE_DEFAULT_CAPACITY * VARIABLE_TABLE_LOAD_FACTOR); + variableTableSize = 1; + variableTable = table; + return value; + } + int potentialNewSize; + if ((potentialNewSize = variableTableSize + 1) > variableTableThreshold) { + table = variableTableRehash(); + } + int index; + for (e = table[index = hash & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + e.value = value; + return value; + } + } + e = new VariableTableEntry(hash, internedName, value, table[index]); + table[index] = e; + variableTableSize = potentialNewSize; + variableTable = table; // write-volatile + } + return value; + } + + /** + * Removes the entry with the specified name from the variable + * table, and returning the removed value. + */ + protected IRubyObject variableTableRemove(String name) { + synchronized(this) { + VariableTableEntry[] table; + if ((table = variableTable) != null) { + int hash = name.hashCode(); + int index = hash & (table.length - 1); + VariableTableEntry first = table[index]; + VariableTableEntry e; + for (e = first; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + IRubyObject oldValue = e.value; + // All entries following removed node can stay + // in list, but all preceding ones need to be + // cloned. + VariableTableEntry newFirst = e.next; + for (VariableTableEntry p = first; p != e; p = p.next) { + newFirst = new VariableTableEntry(p.hash, p.name, p.value, newFirst); + } + table[index] = newFirst; + variableTableSize--; + variableTable = table; // write-volatile + return oldValue; + } + } + } + } + return null; + } + + /** + * Get the actual table used to save variable entries. + */ + protected VariableTableEntry[] variableTableGetTable() { + VariableTableEntry[] table; + if ((table = variableTable) != null) { + return table; + } + return VARIABLE_TABLE_EMPTY_TABLE; + } + + /** + * Get the size of the variable table. + */ + protected int variableTableGetSize() { + if (variableTable != null) { + return variableTableSize; + } + return 0; + } + + /** + * Synchronize the variable table with the argument. In real terms + * this means copy all entries into a newly allocated table. + */ + protected void variableTableSync(List<Variable<IRubyObject>> vars) { + synchronized(this) { + variableTableSize = 0; + variableTableThreshold = (int)(VARIABLE_TABLE_DEFAULT_CAPACITY * VARIABLE_TABLE_LOAD_FACTOR); + variableTable = new VariableTableEntry[VARIABLE_TABLE_DEFAULT_CAPACITY]; + for (Variable<IRubyObject> var : vars) { + variableTableStore(var.getName(), var.getValue()); + } + } + } + + /** + * Rehashes the variable table. Must be called from a synchronized + * block. + */ + // MUST be called from synchronized/locked block! + // should only be called by variableTableStore/variableTableFastStore + protected final VariableTableEntry[] variableTableRehash() { + VariableTableEntry[] oldTable = variableTable; + int oldCapacity; + if ((oldCapacity = oldTable.length) >= VARIABLE_TABLE_MAXIMUM_CAPACITY) { + return oldTable; + } + + int newCapacity = oldCapacity << 1; + VariableTableEntry[] newTable = new VariableTableEntry[newCapacity]; + variableTableThreshold = (int)(newCapacity * VARIABLE_TABLE_LOAD_FACTOR); + int sizeMask = newCapacity - 1; + VariableTableEntry e; + for (int i = oldCapacity; --i >= 0; ) { + // We need to guarantee that any existing reads of old Map can + // proceed. So we cannot yet null out each bin. + e = oldTable[i]; + + if (e != null) { + VariableTableEntry next = e.next; + int idx = e.hash & sizeMask; + + // Single node on list + if (next == null) + newTable[idx] = e; + + else { + // Reuse trailing consecutive sequence at same slot + VariableTableEntry lastRun = e; + int lastIdx = idx; + for (VariableTableEntry last = next; + last != null; + last = last.next) { + int k = last.hash & sizeMask; + if (k != lastIdx) { + lastIdx = k; + lastRun = last; + } + } + newTable[lastIdx] = lastRun; + + // Clone all remaining nodes + for (VariableTableEntry p = e; p != lastRun; p = p.next) { + int k = p.hash & sizeMask; + VariableTableEntry m = new VariableTableEntry(p.hash, p.name, p.value, newTable[k]); + newTable[k] = m; + } + } + } + } + variableTable = newTable; + return newTable; + } + + /** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */ + @SuppressWarnings("unchecked") + protected Map variableTableGetMap() { + HashMap map = new HashMap(); + VariableTableEntry[] table; + IRubyObject readValue; + if ((table = variableTable) != null) { + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + if ((readValue = e.value) == null) readValue = variableTableReadLocked(e); + map.put(e.name, readValue); + } + } + } + return map; + } + + /** + * Method to help ease transition to new variables implementation. + * Will likely be deprecated in the near future. + */ + @SuppressWarnings("unchecked") + protected Map variableTableGetMap(Map map) { + VariableTableEntry[] table; + IRubyObject readValue; + if ((table = variableTable) != null) { + for (int i = table.length; --i >= 0; ) { + for (VariableTableEntry e = table[i]; e != null; e = e.next) { + if ((readValue = e.value) == null) readValue = variableTableReadLocked(e); + map.put(e.name, readValue); + } + } + } + return map; + } + + /** + * Tries to support Java serialization of Ruby objects. This is + * still experimental and might not work. + */ + // NOTE: Serialization is primarily supported for testing purposes, and there is no general + // guarantee that serialization will work correctly. Specifically, instance variables pointing + // at symbols, threads, modules, classes, and other unserializable types are not detected. + private void writeObject(ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); + // write out ivar count followed by name/value pairs + List<String> names = getInstanceVariableNameList(); + out.writeInt(names.size()); + for (String name : names) { + out.writeObject(name); + out.writeObject(getInstanceVariables().getInstanceVariable(name)); + } + } + + /** + * Tries to support Java unserialization of Ruby objects. This is + * still experimental and might not work. + */ + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + // rest in ivar count followed by name/value pairs + int ivarCount = in.readInt(); + for (int i = 0; i < ivarCount; i++) { + setInstanceVariable((String)in.readObject(), (IRubyObject)in.readObject()); + } + } + +} + +package org.jruby; + +import org.jruby.runtime.Block; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * + * @author nicksieger + */ +public interface RubyObjectAdapter { + + boolean isKindOf(IRubyObject value, RubyModule rubyModule); + + IRubyObject setInstanceVariable(IRubyObject obj, String variableName, IRubyObject value); + + IRubyObject[] convertToJavaArray(IRubyObject array); + + RubyInteger convertToRubyInteger(IRubyObject obj); + + IRubyObject getInstanceVariable(IRubyObject obj, String variableName); + + RubyString convertToRubyString(IRubyObject obj); + + // These call* assume ThreadContext = receiver.getRuntime().getCurrentContext() + IRubyObject callMethod(IRubyObject receiver, String methodName); + + IRubyObject callMethod(IRubyObject receiver, String methodName, IRubyObject singleArg); + + IRubyObject callMethod(IRubyObject receiver, String methodName, IRubyObject[] args); + + IRubyObject callMethod(IRubyObject receiver, String methodName, IRubyObject[] args, Block block); + + IRubyObject callSuper(IRubyObject receiver, IRubyObject[] args); + + IRubyObject callSuper(IRubyObject receiver, IRubyObject[] args, Block block); +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.util.Iterator; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.runtime.Block; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +@JRubyModule(name="ObjectSpace") +public class RubyObjectSpace { + + /** Create the ObjectSpace module and add it to the Ruby runtime. + * + */ + public static RubyModule createObjectSpaceModule(Ruby runtime) { + RubyModule objectSpaceModule = runtime.defineModule("ObjectSpace"); + runtime.setObjectSpaceModule(objectSpaceModule); + + objectSpaceModule.defineAnnotatedMethods(RubyObjectSpace.class); + + return objectSpaceModule; + } + + @JRubyMethod(name = "define_finalizer", required = 1, optional = 1, frame = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject define_finalizer(IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = recv.getRuntime(); + IRubyObject finalizer = null; + if (args.length == 2) { + finalizer = args[1]; + if (!finalizer.respondsTo("call")) { + throw runtime.newArgumentError("wrong type argument " + + finalizer.getType() + " (should be callable)"); + } + } else { + finalizer = runtime.newProc(Block.Type.PROC, block); + } + IRubyObject obj = args[0]; + runtime.getObjectSpace().addFinalizer(obj, finalizer); + return runtime.newArray(runtime.newFixnum(runtime.getSafeLevel()), finalizer); + } + + @JRubyMethod(name = "undefine_finalizer", required = 1, frame = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject undefine_finalizer(IRubyObject recv, IRubyObject arg1, Block block) { + recv.getRuntime().getObjectSpace().removeFinalizers(RubyNumeric.fix2long(arg1.id())); + return recv; + } + + @JRubyMethod(name = "_id2ref", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject id2ref(IRubyObject recv, IRubyObject id) { + Ruby runtime = id.getRuntime(); + if (!(id instanceof RubyFixnum)) { + throw recv.getRuntime().newTypeError(id, recv.getRuntime().getFixnum()); + } + RubyFixnum idFixnum = (RubyFixnum) id; + long longId = idFixnum.getLongValue(); + if (longId == 0) { + return runtime.getFalse(); + } else if (longId == 2) { + return runtime.getTrue(); + } else if (longId == 4) { + return runtime.getNil(); + } else if (longId % 2 != 0) { + // odd + return runtime.newFixnum((longId - 1) / 2); + } else { + IRubyObject object = runtime.getObjectSpace().id2ref(longId); + if (object == null) { + return runtime.getNil(); + } + return object; + } + } + + @JRubyMethod(name = "each_object", optional = 1, frame = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject each_object(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + RubyModule rubyClass; + if (args.length == 0) { + rubyClass = recv.getRuntime().getObject(); + } else { + if (!(args[0] instanceof RubyModule)) throw recv.getRuntime().newTypeError("class or module required"); + rubyClass = (RubyModule) args[0]; + } + Ruby runtime = recv.getRuntime(); + int count = 0; + if (rubyClass != runtime.getClassClass()) { + if (!runtime.isObjectSpaceEnabled()) { + throw runtime.newRuntimeError("ObjectSpace is disabled; each_object will only work with Class, pass +O to enable"); + } + Iterator iter = recv.getRuntime().getObjectSpace().iterator(rubyClass); + + IRubyObject obj = null; + while ((obj = (IRubyObject)iter.next()) != null) { + count++; + block.yield(context, obj); + } + } else { + Iterator iter = runtime.getObject().subclasses(true).iterator(); + + while (iter.hasNext()) { + count++; + block.yield(context, (IRubyObject)iter.next()); + } + } + return recv.getRuntime().newFixnum(count); + } + + @JRubyMethod(name = "garbage_collect", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject garbage_collect(IRubyObject recv) { + return RubyGC.start(recv); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.callback.Callback; + +/** + * + * @author jpetersen + */ +@JRubyModule(name="Precision") +public class RubyPrecision { + + public static RubyModule createPrecisionModule(Ruby runtime) { + RubyModule precisionModule = runtime.defineModule("Precision"); + runtime.setPrecision(precisionModule); + + precisionModule.defineAnnotatedMethods(RubyPrecision.class); + + return precisionModule; + } + + public static IRubyObject induced_from(IRubyObject receiver, IRubyObject source, Block block) { + throw receiver.getRuntime().newTypeError("Undefined conversion from " + source.getMetaClass().getName() + " into " + ((RubyClass)receiver).getName()); + } + + @JRubyMethod(name = "append_features", required = 1, frame = true, module = true) + public static IRubyObject append_features(IRubyObject receiver, IRubyObject include, Block block) { + if (include instanceof RubyModule) { + ((RubyModule) include).includeModule(receiver); + include.getSingletonClass().defineMethod("induced_from", new Callback() { + + public IRubyObject execute(IRubyObject recv, IRubyObject[] args, Block block) { + Arity.checkArgumentCount(recv.getRuntime(), args, 1, 1); + + return RubyPrecision.induced_from(recv, args[0], block); + } + + public Arity getArity() { + return Arity.ONE_ARGUMENT; + } + }); + } + return receiver; + } + + + @JRubyMethod(name = "prec", required = 1, frame = true) + public static IRubyObject prec(ThreadContext context, IRubyObject receiver, IRubyObject type, Block block) { + return type.callMethod(context, "induced_from", receiver); + } + + @JRubyMethod(name = "prec_i", frame = true) + public static IRubyObject prec_i(ThreadContext context, IRubyObject receiver, Block block) { + return receiver.getRuntime().getInteger().callMethod(context, "induced_from", receiver); + } + + @JRubyMethod(name = "prec_f", frame = true) + public static IRubyObject prec_f(ThreadContext context, IRubyObject receiver, Block block) { + return receiver.getRuntime().getFloat().callMethod(context, "induced_from", receiver); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2007 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.exceptions.JumpException; +import org.jruby.internal.runtime.JumpTarget; +import org.jruby.java.MiniJava; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * @author jpetersen + */ +@JRubyClass(name="Proc") +public class RubyProc extends RubyObject implements JumpTarget { + private Block block = Block.NULL_BLOCK; + private Block.Type type; + private String file; + private int line; + + public RubyProc(Ruby runtime, RubyClass rubyClass, Block.Type type) { + super(runtime, rubyClass); + + this.type = type; + } + + private static ObjectAllocator PROC_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + RubyProc instance = RubyProc.newProc(runtime, Block.Type.PROC); + + instance.setMetaClass(klass); + + return instance; + } + }; + + public static RubyClass createProcClass(Ruby runtime) { + RubyClass procClass = runtime.defineClass("Proc", runtime.getObject(), PROC_ALLOCATOR); + runtime.setProc(procClass); + + procClass.defineAnnotatedMethods(RubyProc.class); + + return procClass; + } + + public Block getBlock() { + return block; + } + + // Proc class + + public static RubyProc newProc(Ruby runtime, Block.Type type) { + return new RubyProc(runtime, runtime.getProc(), type); + } + public static RubyProc newProc(Ruby runtime, Block block, Block.Type type) { + RubyProc proc = new RubyProc(runtime, runtime.getProc(), type); + proc.callInit(NULL_ARRAY, block); + + return proc; + } + + /** + * Create a new instance of a Proc object. We override this method (from RubyClass) + * since we need to deal with special case of Proc.new with no arguments or block arg. In + * this case, we need to check previous frame for a block to consume. + */ + @JRubyMethod(name = "new", rest = true, frame = true, meta = true) + public static IRubyObject newInstance(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + // No passed in block, lets check next outer frame for one ('Proc.new') + if (!block.isGiven()) { + block = context.getPreviousFrame().getBlock(); + } + + if (block.isGiven() && block.getProcObject() != null) { + return block.getProcObject(); + } + + IRubyObject obj = ((RubyClass) recv).allocate(); + + obj.callMethod(context, "initialize", args, block); + return obj; + } + + @JRubyMethod(name = "initialize", frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(ThreadContext context, Block procBlock) { + if (!procBlock.isGiven()) { + throw getRuntime().newArgumentError("tried to create Proc object without a block"); + } + + if (type == Block.Type.LAMBDA && procBlock == null) { + // TODO: warn "tried to create Proc object without a block" + } + + block = procBlock.cloneBlock(); + block.type = type; + block.setProcObject(this); + + file = context.getFile(); + line = context.getLine(); + return this; + } + + @JRubyMethod(name = "clone") + public IRubyObject rbClone() { + RubyProc newProc = new RubyProc(getRuntime(), getRuntime().getProc(), type); + newProc.block = getBlock(); + newProc.file = file; + newProc.line = line; + // TODO: CLONE_SETUP here + return newProc; + } + + @JRubyMethod(name = "dup") + public IRubyObject dup() { + RubyProc newProc = new RubyProc(getRuntime(), getRuntime().getProc(), type); + newProc.block = getBlock(); + newProc.file = file; + newProc.line = line; + return newProc; + } + + @JRubyMethod(name = "==", required = 1) + public IRubyObject op_equal(IRubyObject other) { + if (!(other instanceof RubyProc)) return getRuntime().getFalse(); + + if (this == other || this.block == ((RubyProc)other).block) { + return getRuntime().getTrue(); + } + + return getRuntime().getFalse(); + } + + @JRubyMethod(name = "to_s") + public IRubyObject to_s() { + return RubyString.newString(getRuntime(), + "#<Proc:0x" + Integer.toString(block.hashCode(), 16) + "@" + + file + ":" + (line + 1) + ">"); + } + + @JRubyMethod(name = "binding") + public IRubyObject binding() { + return getRuntime().newBinding(block.getBinding()); + } + + @JRubyMethod(name = {"call", "[]"}, rest = true, frame = true) + public IRubyObject call(ThreadContext context, IRubyObject[] args) { + return call(context, args, null); + } + + public IRubyObject call(ThreadContext context, IRubyObject[] args, IRubyObject self) { + assert args != null; + + Ruby runtime = getRuntime(); + Block newBlock = block.cloneBlock(); + JumpTarget jumpTarget = newBlock.getBinding().getFrame().getJumpTarget(); + + try { + if (self != null) newBlock.getBinding().setSelf(self); + + return newBlock.call(context, args); + } catch (JumpException.BreakJump bj) { + switch(block.type) { + case LAMBDA: if (bj.getTarget() == jumpTarget) { + return (IRubyObject) bj.getValue(); + } else { + throw runtime.newLocalJumpError("break", (IRubyObject)bj.getValue(), "unexpected break"); + } + case PROC: + if (newBlock.isEscaped()) { + throw runtime.newLocalJumpError("break", (IRubyObject)bj.getValue(), "break from proc-closure"); + } else { + throw bj; + } + default: throw bj; + } + } catch (JumpException.ReturnJump rj) { + Object target = rj.getTarget(); + + if (target == jumpTarget && block.type == Block.Type.LAMBDA) return (IRubyObject) rj.getValue(); + + if (type == Block.Type.THREAD) { + throw runtime.newThreadError("return can't jump across threads"); + } + throw rj; + } catch (JumpException.RetryJump rj) { + throw runtime.newLocalJumpError("retry", (IRubyObject)rj.getValue(), "retry not supported outside rescue"); + } + } + + @JRubyMethod(name = "arity") + public RubyFixnum arity() { + return getRuntime().newFixnum(block.arity().getValue()); + } + + @JRubyMethod(name = "to_proc") + public RubyProc to_proc() { + return this; + } + + public IRubyObject as(Class asClass) { + final Ruby ruby = getRuntime(); + if (!asClass.isInterface()) { + throw ruby.newTypeError(asClass.getCanonicalName() + " is not an interface"); + } + + return MiniJava.javaToRuby(ruby, Proxy.newProxyInstance(Ruby.getClassLoader(), new Class[] {asClass}, new InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + IRubyObject[] rubyArgs = new IRubyObject[args.length + 1]; + rubyArgs[0] = RubySymbol.newSymbol(ruby, method.getName()); + for (int i = 1; i < rubyArgs.length; i++) { + rubyArgs[i] = MiniJava.javaToRuby(ruby, args[i - 1]); + } + return MiniJava.rubyToJava(call(ruby.getCurrentContext(), rubyArgs)); + } + })); + } +} +/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.ext.posix.POSIX; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.BlockCallback; +import org.jruby.runtime.CallBlock; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + + +/** + */ + +@JRubyModule(name="Process") +public class RubyProcess { + + public static RubyModule createProcessModule(Ruby runtime) { + RubyModule process = runtime.defineModule("Process"); + runtime.setProcess(process); + + // TODO: NOT_ALLOCATABLE_ALLOCATOR is probably ok here. Confirm. JRUBY-415 + RubyClass process_status = process.defineClassUnder("Status", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setProcStatus(process_status); + + RubyModule process_uid = process.defineModuleUnder("UID"); + runtime.setProcUID(process_uid); + + RubyModule process_gid = process.defineModuleUnder("GID"); + runtime.setProcGID(process_gid); + + RubyModule process_sys = process.defineModuleUnder("Sys"); + runtime.setProcSys(process_sys); + + process.defineAnnotatedMethods(RubyProcess.class); + process_status.defineAnnotatedMethods(RubyStatus.class); + process_uid.defineAnnotatedMethods(UserID.class); + process_gid.defineAnnotatedMethods(GroupID.class); + process_sys.defineAnnotatedMethods(Sys.class); + + process.defineConstant("PRIO_PROCESS", runtime.newFixnum(0)); + process.defineConstant("PRIO_PGRP", runtime.newFixnum(1)); + process.defineConstant("PRIO_USER", runtime.newFixnum(2)); + + process.defineConstant("WNOHANG", runtime.newFixnum(1)); + + return process; + } + + @JRubyClass(name="Process::Status") + public static class RubyStatus extends RubyObject { + private long status = 0L; + + private static final long EXIT_SUCCESS = 0L; + public RubyStatus(Ruby runtime, RubyClass metaClass, long status) { + super(runtime, metaClass); + this.status = status; + } + + public static RubyStatus newProcessStatus(Ruby runtime, long status) { + return new RubyStatus(runtime, runtime.getProcStatus(), status); + } + + // Bunch of methods still not implemented + @JRubyMethod(name = {"to_int", "pid", "stopped?", "stopsig", "signaled?", "termsig?", "exited?", "coredump?"}) + public IRubyObject not_implemented() { + String error = "Process::Status#" + getRuntime().getCurrentContext().getFrameName() + " not implemented"; + throw getRuntime().newNotImplementedError(error); + } + + @JRubyMethod(name = {"&"}) + public IRubyObject not_implemented1(IRubyObject arg) { + String error = "Process::Status#" + getRuntime().getCurrentContext().getFrameName() + " not implemented"; + throw getRuntime().newNotImplementedError(error); + } + + @JRubyMethod + public IRubyObject exitstatus() { + return getRuntime().newFixnum(status); + } + + @JRubyMethod(name = ">>") + public IRubyObject op_rshift(IRubyObject other) { + long shiftValue = other.convertToInteger().getLongValue(); + return getRuntime().newFixnum(status >> shiftValue); + } + + @JRubyMethod(name = "==") + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + return other.callMethod(context, MethodIndex.EQUALEQUAL, "==", this.to_i()); + } + + @JRubyMethod + public IRubyObject to_i() { + return getRuntime().newFixnum(shiftedValue()); + } + + @JRubyMethod + public IRubyObject to_s() { + return getRuntime().newString(String.valueOf(shiftedValue())); + } + + @JRubyMethod + public IRubyObject inspect() { + return getRuntime().newString("#<Process::Status: pid=????,exited(" + String.valueOf(status) + ")>"); + } + + @JRubyMethod(name = "success?") + public IRubyObject success_p() { + return getRuntime().newBoolean(status == EXIT_SUCCESS); + } + + private long shiftedValue() { + return status << 8; + } + } + + @JRubyModule(name="Process::UID") + public static class UserID { + @JRubyMethod(name = "change_privilege", module = true) + public static IRubyObject change_privilege(IRubyObject self, IRubyObject arg) { + throw self.getRuntime().newNotImplementedError("Process::UID::change_privilege not implemented yet"); + } + + @JRubyMethod(name = "eid", module = true) + public static IRubyObject eid(IRubyObject self) { + return euid(self); + } + + @JRubyMethod(name = "eid=", module = true) + public static IRubyObject eid(IRubyObject self, IRubyObject arg) { + return euid_set(self, arg); + } + + @JRubyMethod(name = "grant_privilege", module = true) + public static IRubyObject grant_privilege(IRubyObject self, IRubyObject arg) { + throw self.getRuntime().newNotImplementedError("Process::UID::grant_privilege not implemented yet"); + } + + @JRubyMethod(name = "re_exchange", module = true) + public static IRubyObject re_exchange(ThreadContext context, IRubyObject self) { + return switch_rb(context, self, Block.NULL_BLOCK); + } + + @JRubyMethod(name = "re_exchangeable?", module = true) + public static IRubyObject re_exchangeable_p(IRubyObject self) { + throw self.getRuntime().newNotImplementedError("Process::UID::re_exchangeable? not implemented yet"); + } + + @JRubyMethod(name = "rid", module = true) + public static IRubyObject rid(IRubyObject self) { + return uid(self); + } + + @JRubyMethod(name = "sid_available?", module = true) + public static IRubyObject sid_available_p(IRubyObject self) { + throw self.getRuntime().newNotImplementedError("Process::UID::sid_available not implemented yet"); + } + + @JRubyMethod(name = "switch", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject switch_rb(ThreadContext context, IRubyObject self, Block block) { + Ruby runtime = self.getRuntime(); + int uid = runtime.getPosix().getuid(); + int euid = runtime.getPosix().geteuid(); + + if (block.isGiven()) { + try { + runtime.getPosix().seteuid(uid); + runtime.getPosix().setuid(euid); + + return block.yield(context, runtime.getNil()); + } finally { + runtime.getPosix().seteuid(euid); + runtime.getPosix().setuid(uid); + } + } else { + runtime.getPosix().seteuid(uid); + runtime.getPosix().setuid(euid); + + return RubyFixnum.zero(runtime); + } + } + } + + @JRubyModule(name="Process::GID") + public static class GroupID { + @JRubyMethod(name = "change_privilege", module = true) + public static IRubyObject change_privilege(IRubyObject self, IRubyObject arg) { + throw self.getRuntime().newNotImplementedError("Process::GID::change_privilege not implemented yet"); + } + + @JRubyMethod(name = "eid", module = true) + public static IRubyObject eid(IRubyObject self) { + return egid(self); + } + + @JRubyMethod(name = "eid=", module = true) + public static IRubyObject eid(IRubyObject self, IRubyObject arg) { + return RubyProcess.egid_set(self, arg); + } + + @JRubyMethod(name = "grant_privilege", module = true) + public static IRubyObject grant_privilege(IRubyObject self, IRubyObject arg) { + throw self.getRuntime().newNotImplementedError("Process::GID::grant_privilege not implemented yet"); + } + + @JRubyMethod(name = "re_exchange", module = true) + public static IRubyObject re_exchange(ThreadContext context, IRubyObject self) { + return switch_rb(context, self, Block.NULL_BLOCK); + } + + @JRubyMethod(name = "re_exchangeable?", module = true) + public static IRubyObject re_exchangeable_p(IRubyObject self) { + throw self.getRuntime().newNotImplementedError("Process::GID::re_exchangeable? not implemented yet"); + } + + @JRubyMethod(name = "rid", module = true) + public static IRubyObject rid(IRubyObject self) { + return gid(self); + } + + @JRubyMethod(name = "sid_available?", module = true) + public static IRubyObject sid_available_p(IRubyObject self) { + throw self.getRuntime().newNotImplementedError("Process::GID::sid_available not implemented yet"); + } + + @JRubyMethod(name = "switch", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject switch_rb(ThreadContext context, IRubyObject self, Block block) { + Ruby runtime = self.getRuntime(); + int gid = runtime.getPosix().getgid(); + int egid = runtime.getPosix().getegid(); + + if (block.isGiven()) { + try { + runtime.getPosix().setegid(gid); + runtime.getPosix().setgid(egid); + + return block.yield(context, runtime.getNil()); + } finally { + runtime.getPosix().setegid(egid); + runtime.getPosix().setgid(gid); + } + } else { + runtime.getPosix().setegid(gid); + runtime.getPosix().setgid(egid); + + return RubyFixnum.zero(runtime); + } + } + } + + @JRubyModule(name="Process::Sys") + public static class Sys { + @JRubyMethod(name = "getegid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject getegid(IRubyObject self) { + return egid(self); + } + + @JRubyMethod(name = "geteuid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject geteuid(IRubyObject self) { + return euid(self); + } + + @JRubyMethod(name = "getgid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject getgid(IRubyObject self) { + return gid(self); + } + + @JRubyMethod(name = "getuid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject getuid(IRubyObject self) { + return uid(self); + } + + @JRubyMethod(name = "setegid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject setegid(IRubyObject recv, IRubyObject arg) { + return egid_set(recv, arg); + } + + @JRubyMethod(name = "seteuid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject seteuid(IRubyObject recv, IRubyObject arg) { + return euid_set(recv, arg); + } + + @JRubyMethod(name = "setgid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject setgid(IRubyObject recv, IRubyObject arg) { + return gid_set(recv, arg); + } + + @JRubyMethod(name = "setuid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject setuid(IRubyObject recv, IRubyObject arg) { + return uid_set(recv, arg); + } + } + + @JRubyMethod(name = "abort", optional = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject abort(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + return RubyKernel.abort(context, recv, args); + } + + @JRubyMethod(name = "exit!", optional = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject exit_bang(IRubyObject recv, IRubyObject[] args) { + return RubyKernel.exit_bang(recv, args); + } + + @JRubyMethod(name = "groups", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject groups(IRubyObject recv) { + throw recv.getRuntime().newNotImplementedError("Process#groups not yet implemented"); + } + + @JRubyMethod(name = "setrlimit", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject setrlimit(IRubyObject recv, IRubyObject[] args) { + throw recv.getRuntime().newNotImplementedError("Process#setrlimit not yet implemented"); + } + + @JRubyMethod(name = "getpgrp", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject getpgrp(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().getpgrp()); + } + + @JRubyMethod(name = "groups=", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject groups_set(IRubyObject recv, IRubyObject arg) { + throw recv.getRuntime().newNotImplementedError("Process#groups not yet implemented"); + } + + @JRubyMethod(name = "waitpid", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject waitpid(IRubyObject recv, IRubyObject[] args) { + Ruby runtime = recv.getRuntime(); + int pid = -1; + int flags = 0; + if (args.length > 0) { + pid = (int)args[0].convertToInteger().getLongValue(); + } + if (args.length > 1) { + flags = (int)args[1].convertToInteger().getLongValue(); + } + + int[] status = new int[1]; + pid = runtime.getPosix().waitpid(pid, status, flags); + + if (pid == -1) { + throw runtime.newErrnoECHILDError(); + } + + runtime.getGlobalVariables().set( + "$?", + RubyProcess.RubyStatus.newProcessStatus(runtime, status[0])); + return runtime.newFixnum(pid); + } + + @JRubyMethod(name = "wait", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject wait(IRubyObject recv, IRubyObject[] args) { + Ruby runtime = recv.getRuntime(); + + if (args.length > 0) { + return waitpid(recv, args); + } + + int[] status = new int[1]; + int pid = runtime.getPosix().wait(status); + + if (pid == -1) { + throw runtime.newErrnoECHILDError(); + } + + runtime.getGlobalVariables().set( + "$?", + RubyProcess.RubyStatus.newProcessStatus(runtime, status[0])); + return runtime.newFixnum(pid); + } + + @JRubyMethod(name = "waitall", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject waitall(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + POSIX posix = runtime.getPosix(); + RubyArray results = recv.getRuntime().newArray(); + + int[] status = new int[1]; + int result = posix.wait(status); + while (result != -1) { + results.append(runtime.newArray(runtime.newFixnum(result), RubyProcess.RubyStatus.newProcessStatus(runtime, status[0]))); + result = posix.wait(status); + } + + return results; + } + + @JRubyMethod(name = "setsid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject setsid(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().setsid()); + } + + @JRubyMethod(name = "setpgrp", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject setpgrp(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().setpgid(0, 0)); + } + + @JRubyMethod(name = "egid=", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject egid_set(IRubyObject recv, IRubyObject arg) { + recv.getRuntime().getPosix().setegid((int)arg.convertToInteger().getLongValue()); + return RubyFixnum.zero(recv.getRuntime()); + } + + @JRubyMethod(name = "euid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject euid(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().geteuid()); + } + + @JRubyMethod(name = "uid=", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject uid_set(IRubyObject recv, IRubyObject arg) { + recv.getRuntime().getPosix().setuid((int)arg.convertToInteger().getLongValue()); + return RubyFixnum.zero(recv.getRuntime()); + } + + @JRubyMethod(name = "gid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject gid(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().getgid()); + } + + @JRubyMethod(name = "maxgroups", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject maxgroups(IRubyObject recv) { + throw recv.getRuntime().newNotImplementedError("Process#maxgroups not yet implemented"); + } + + @JRubyMethod(name = "getpriority", required = 2, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject getpriority(IRubyObject recv, IRubyObject arg1, IRubyObject arg2) { + int which = (int)arg1.convertToInteger().getLongValue(); + int who = (int)arg2.convertToInteger().getLongValue(); + int result = recv.getRuntime().getPosix().getpriority(which, who); + + return recv.getRuntime().newFixnum(result); + } + + @JRubyMethod(name = "uid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject uid(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().getuid()); + } + + @JRubyMethod(name = "waitpid2", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject waitpid2(IRubyObject recv, IRubyObject[] args) { + Ruby runtime = recv.getRuntime(); + int pid = -1; + int flags = 0; + if (args.length > 0) { + pid = (int)args[0].convertToInteger().getLongValue(); + } + if (args.length > 1) { + flags = (int)args[1].convertToInteger().getLongValue(); + } + + int[] status = new int[1]; + pid = runtime.getPosix().waitpid(pid, status, flags); + + if (pid == -1) { + throw runtime.newErrnoECHILDError(); + } + + return runtime.newArray(runtime.newFixnum(pid), RubyProcess.RubyStatus.newProcessStatus(runtime, status[0])); + } + + @JRubyMethod(name = "initgroups", required = 2, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject initgroups(IRubyObject recv, IRubyObject arg1, IRubyObject arg2) { + throw recv.getRuntime().newNotImplementedError("Process#initgroups not yet implemented"); + } + + @JRubyMethod(name = "maxgroups=", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject maxgroups_set(IRubyObject recv, IRubyObject arg) { + throw recv.getRuntime().newNotImplementedError("Process#maxgroups_set not yet implemented"); + } + + @JRubyMethod(name = "ppid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject ppid(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().getppid()); + } + + @JRubyMethod(name = "gid=", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject gid_set(IRubyObject recv, IRubyObject arg) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().setgid((int)arg.convertToInteger().getLongValue())); + } + + @JRubyMethod(name = "wait2", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject wait2(IRubyObject recv, IRubyObject[] args) { + return waitpid2(recv, args); + } + + @JRubyMethod(name = "euid=", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject euid_set(IRubyObject recv, IRubyObject arg) { + recv.getRuntime().getPosix().seteuid((int)arg.convertToInteger().getLongValue()); + return RubyFixnum.zero(recv.getRuntime()); + } + + @JRubyMethod(name = "setpriority", required = 3, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject setpriority(IRubyObject recv, IRubyObject arg1, IRubyObject arg2, IRubyObject arg3) { + int which = (int)arg1.convertToInteger().getLongValue(); + int who = (int)arg2.convertToInteger().getLongValue(); + int prio = (int)arg3.convertToInteger().getLongValue(); + int result = recv.getRuntime().getPosix().setpriority(which, who, prio); + + return recv.getRuntime().newFixnum(result); + } + + @JRubyMethod(name = "setpgid", required = 2, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject setpgid(IRubyObject recv, IRubyObject arg1, IRubyObject arg2) { + int pid = (int)arg1.convertToInteger().getLongValue(); + int gid = (int)arg2.convertToInteger().getLongValue(); + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().setpgid(pid, gid)); + } + + @JRubyMethod(name = "getpgid", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject getpgid(IRubyObject recv, IRubyObject arg) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().getpgid((int)arg.convertToInteger().getLongValue())); + } + + @JRubyMethod(name = "getrlimit", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject getrlimit(IRubyObject recv, IRubyObject arg) { + throw recv.getRuntime().newNotImplementedError("Process#getrlimit not yet implemented"); + } + + @JRubyMethod(name = "egid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject egid(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().getegid()); + } + + private static String[] signals = new String[] {"EXIT", "HUP", "INT", "QUIT", "ILL", "TRAP", + "ABRT", "POLL", "FPE", "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "URG", "STOP", + "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "XCPU", "XFSZ", "VTALRM", "PROF", "USR1", "USR2"}; + + private static int parseSignalString(Ruby runtime, String value) { + int startIndex = 0; + boolean negative = value.startsWith("-"); + + if (negative) startIndex++; + + boolean signalString = value.startsWith("SIG", startIndex); + + if (signalString) startIndex += 3; + + String signalName = value.substring(startIndex); + + // FIXME: This table will get moved into POSIX library so we can get all actual supported + // signals. This is a quick fix to support basic signals until that happens. + for (int i = 0; i < signals.length; i++) { + if (signals[i].equals(signalName)) return negative ? -i : i; + } + + throw runtime.newArgumentError("unsupported name `SIG" + signalName + "'"); + } + + @JRubyMethod(name = "kill", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject kill(IRubyObject recv, IRubyObject[] args) { + if (args.length < 2) { + throw recv.getRuntime().newArgumentError("wrong number of arguments -- kill(sig, pid...)"); + } + + Ruby runtime = recv.getRuntime(); + int signal; + if (args[0] instanceof RubyFixnum) { + signal = (int) ((RubyFixnum) args[0]).getLongValue(); + } else if (args[0] instanceof RubySymbol) { + signal = parseSignalString(runtime, args[0].toString()); + } else if (args[0] instanceof RubyString) { + signal = parseSignalString(runtime, args[0].toString()); + } else { + signal = parseSignalString(runtime, args[0].checkStringType().toString()); + } + + boolean processGroupKill = signal < 0; + + if (processGroupKill) signal = -signal; + + POSIX posix = runtime.getPosix(); + for (int i = 1; i < args.length; i++) { + int pid = RubyNumeric.num2int(args[i]); + + // FIXME: It may be possible to killpg on systems which support it. POSIX library + // needs to tell whether a particular method works or not + if (pid == 0) pid = runtime.getPosix().getpid(); + posix.kill(processGroupKill ? -pid : pid, signal); + } + + return runtime.newFixnum(args.length - 1); + + } + + @JRubyMethod(name = "detach", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject detach(ThreadContext context, IRubyObject recv, IRubyObject arg) { + final int pid = (int)arg.convertToInteger().getLongValue(); + Ruby runtime = recv.getRuntime(); + + BlockCallback callback = new BlockCallback() { + public IRubyObject call(ThreadContext context, IRubyObject[] args, Block block) { + int[] status = new int[1]; + int result = context.getRuntime().getPosix().waitpid(pid, status, 0); + + return context.getRuntime().newFixnum(result); + } + }; + + return RubyThread.newInstance( + runtime.getThread(), + IRubyObject.NULL_ARRAY, + CallBlock.newCallClosure(recv, (RubyModule)recv, Arity.NO_ARGUMENTS, callback, context)); + } + + @JRubyMethod(name = "times", frame = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject times(IRubyObject recv, Block unusedBlock) { + Ruby runtime = recv.getRuntime(); + double currentTime = System.currentTimeMillis() / 1000.0; + double startTime = runtime.getStartTime() / 1000.0; + RubyFloat zero = runtime.newFloat(0.0); + return RubyStruct.newStruct(runtime.getTmsStruct(), + new IRubyObject[] { runtime.newFloat(currentTime - startTime), zero, zero, zero }, + Block.NULL_BLOCK); + } + + @JRubyMethod(name = "pid", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject pid(IRubyObject recv) { + return recv.getRuntime().newFixnum(recv.getRuntime().getPosix().getpid()); + } + + @JRubyMethod(name = "fork", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject fork(ThreadContext context, IRubyObject recv, Block block) { + return RubyKernel.fork(context, recv, block); + } + + @JRubyMethod(name = "exit", optional = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject exit(IRubyObject recv, IRubyObject[] args) { + return RubyKernel.exit(recv, args); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001 Ed Sinjiashvili <slorcim@users.sourceforge.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; +import java.util.List; + +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.exceptions.RaiseException; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.BlockCallback; +import org.jruby.runtime.CallBlock; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ObjectMarshal; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.builtin.Variable; +import org.jruby.runtime.component.VariableEntry; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; + +/** + * @author jpetersen + */ +@JRubyClass(name="Range", include="Enumerable") +public class RubyRange extends RubyObject { + private IRubyObject begin; + private IRubyObject end; + private boolean isExclusive; + + public static RubyClass createRangeClass(Ruby runtime) { + RubyClass result = runtime.defineClass("Range", runtime.getObject(), RANGE_ALLOCATOR); + runtime.setRange(result); + result.kindOf = new RubyModule.KindOf() { + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyRange; + } + }; + + result.setMarshal(RANGE_MARSHAL); + result.includeModule(runtime.getEnumerable()); + + // We override Enumerable#member? since ranges in 1.8.1 are continuous. + // result.defineMethod("member?", callbackFactory.getMethod("include_p", RubyKernel.IRUBY_OBJECT)); + // result.defineMethod("===", callbackFactory.getMethod("include_p", RubyKernel.IRUBY_OBJECT)); + + result.defineAnnotatedMethods(RubyRange.class); + return result; + } + + private static final ObjectAllocator RANGE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyRange(runtime, klass); + } + }; + + private RubyRange(Ruby runtime, RubyClass klass) { + super(runtime, klass); + begin = end = runtime.getNil(); + } + + public static RubyRange newRange(Ruby runtime, ThreadContext context, IRubyObject begin, IRubyObject end, boolean isExclusive) { + RubyRange range = new RubyRange(runtime, runtime.getRange()); + range.init(context, begin, end, isExclusive); + return range; + } + + public static RubyRange newExclusiveRange(Ruby runtime, ThreadContext context, IRubyObject begin, IRubyObject end) { + RubyRange range = new RubyRange(runtime, runtime.getRange()); + range.init(context, begin, end, true); + return range; + } + + public static RubyRange newInclusiveRange(Ruby runtime, ThreadContext context, IRubyObject begin, IRubyObject end) { + RubyRange range = new RubyRange(runtime, runtime.getRange()); + range.init(context, begin, end, false); + return range; + } + + protected void copySpecialInstanceVariables(IRubyObject clone) { + RubyRange range = (RubyRange)clone; + range.begin = begin; + range.end = end; + range.isExclusive = isExclusive; + } + + final long[] begLen(long len, int err){ + long beg = RubyNumeric.num2long(this.begin); + long end = RubyNumeric.num2long(this.end); + + if (beg < 0) { + beg += len; + if (beg < 0) { + if (err != 0) throw getRuntime().newRangeError(beg + ".." + (isExclusive ? "." : "") + end + " out of range"); + return null; + } + } + + if (err == 0 || err == 2) { + if (beg > len) { + if (err != 0) throw getRuntime().newRangeError(beg + ".." + (isExclusive ? "." : "") + end + " out of range"); + return null; + } + if (end > len) end = len; + } + + if (end < 0) end += len; + if (!isExclusive) end++; + len = end - beg; + if (len < 0) len = 0; + + return new long[]{beg, len}; + } + + private void init(ThreadContext context, IRubyObject begin, IRubyObject end, boolean isExclusive) { + if (!(begin instanceof RubyFixnum && end instanceof RubyFixnum)) { + try { + IRubyObject result = begin.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", end); + if (result.isNil()) throw getRuntime().newArgumentError("bad value for range"); + } catch (RaiseException re) { + throw getRuntime().newArgumentError("bad value for range"); + } + } + + this.begin = begin; + this.end = end; + this.isExclusive = isExclusive; + } + + @JRubyMethod(name = "initialize", required = 2, optional = 1, frame = true) + public IRubyObject initialize(ThreadContext context, IRubyObject[] args, Block unusedBlock) { + init(context, args[0], args[1], args.length > 2 && args[2].isTrue()); + return getRuntime().getNil(); + } + + @JRubyMethod(name = {"first", "begin"}) + public IRubyObject first() { + return begin; + } + + @JRubyMethod(name = {"last", "end"}) + public IRubyObject last() { + return end; + } + + @JRubyMethod(name = "hash") + public RubyFixnum hash(ThreadContext context) { + long hash = isExclusive ? 1 : 0; + long h = hash; + + long v = begin.callMethod(context, MethodIndex.HASH, "hash").convertToInteger().getLongValue(); + hash ^= v << 1; + v = end.callMethod(context, MethodIndex.HASH, "hash").convertToInteger().getLongValue(); + hash ^= v << 9; + hash ^= h << 24; + return getRuntime().newFixnum(hash); + } + + private static byte[] DOTDOTDOT = "...".getBytes(); + private static byte[] DOTDOT = "..".getBytes(); + + @JRubyMethod(name = "inspect") + public IRubyObject inspect(ThreadContext context) { + RubyString str = inspect(context, begin).strDup(context.getRuntime()); + RubyString str2 = inspect(context, end); + + str.cat(isExclusive ? DOTDOTDOT : DOTDOT); + str.concat(str2); + str.infectBy(str2); + return str; + } + + @JRubyMethod(name = "to_s") + public IRubyObject to_s(ThreadContext context) { + RubyString str = RubyString.objAsString(context, begin).strDup(context.getRuntime()); + RubyString str2 = RubyString.objAsString(context, end); + + str.cat(isExclusive ? DOTDOTDOT : DOTDOT); + str.concat(str2); + str.infectBy(str2); + return str; + + } + + @JRubyMethod(name = "exclude_end?") + public RubyBoolean exclude_end_p() { + return getRuntime().newBoolean(isExclusive); + } + + @JRubyMethod(name = "==", required = 1) + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + if (this == other) return getRuntime().getTrue(); + if (!(other instanceof RubyRange)) return getRuntime().getFalse(); + RubyRange otherRange = (RubyRange) other; + + if (equalInternal(context, begin, otherRange.begin) && + equalInternal(context, end, otherRange.end) && + isExclusive == otherRange.isExclusive) return getRuntime().getTrue(); + + return getRuntime().getFalse(); + } + + @JRubyMethod(name = "eql?", required = 1) + public IRubyObject eql_p(ThreadContext context, IRubyObject other) { + if (this == other) return getRuntime().getTrue(); + if (!(other instanceof RubyRange)) return getRuntime().getFalse(); + RubyRange otherRange = (RubyRange)other; + + if (eqlInternal(context, begin, otherRange.begin) && + eqlInternal(context, end, otherRange.end) && + isExclusive == otherRange.isExclusive) return getRuntime().getTrue(); + + return getRuntime().getFalse(); + } + + private static abstract class RangeCallBack { + abstract void call(ThreadContext context, IRubyObject arg); + } + + private static final class StepBlockCallBack extends RangeCallBack implements BlockCallback { + final Block block; + IRubyObject iter; + final IRubyObject step; + + StepBlockCallBack(Block block, IRubyObject iter, IRubyObject step) { + this.block = block; + this.iter = iter; + this.step = step; + } + + public IRubyObject call(ThreadContext context, IRubyObject[] args, Block originalBlock) { + call(context, args[0]); + return context.getRuntime().getNil(); + } + + void call(ThreadContext context, IRubyObject arg) { + if (iter instanceof RubyFixnum) { + iter = RubyFixnum.newFixnum(context.getRuntime(), ((RubyFixnum)iter).getLongValue() - 1); + } else { + iter = iter.callMethod(context, MethodIndex.OP_MINUS, "-", RubyFixnum.one(context.getRuntime())); + } + if (iter == RubyFixnum.zero(context.getRuntime())) { + block.yield(context, arg); + iter = step; + } + } + } + + private IRubyObject rangeLt(ThreadContext context, IRubyObject a, IRubyObject b) { + IRubyObject result = a.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", b); + if (result.isNil()) return null; + return RubyComparable.cmpint(context, result, a, b) < 0 ? getRuntime().getTrue() : null; + } + + private IRubyObject rangeLe(ThreadContext context, IRubyObject a, IRubyObject b) { + IRubyObject result = a.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", b); + if (result.isNil()) return null; + int c = RubyComparable.cmpint(context, result, a, b); + if (c == 0) return RubyFixnum.zero(getRuntime()); + return c < 0 ? getRuntime().getTrue() : null; + } + + private void rangeEach(ThreadContext context, RangeCallBack callback) { + IRubyObject v = begin; + if (isExclusive) { + while (rangeLt(context, v, end) != null) { + callback.call(context, v); + v = v.callMethod(context, "succ"); + } + } else { + IRubyObject c; + while ((c = rangeLe(context, v, end)) != null && c.isTrue()) { + callback.call(context, v); + if (c == RubyFixnum.zero(getRuntime())) break; + v = v.callMethod(context, "succ"); + } + } + } + + @JRubyMethod(name = "each", frame = true) + public IRubyObject each(ThreadContext context, final Block block) { + final Ruby runtime = context.getRuntime(); + + if (begin instanceof RubyFixnum && end instanceof RubyFixnum) { + long lim = ((RubyFixnum) end).getLongValue(); + if (!isExclusive) lim++; + + for (long i = ((RubyFixnum) begin).getLongValue(); i < lim; i++) { + block.yield(context, RubyFixnum.newFixnum(runtime, i)); + } + } else if (begin instanceof RubyString) { + ((RubyString) begin).upto(context, end, isExclusive, block); + } else { + if (!begin.respondsTo("succ")) throw getRuntime().newTypeError( + "can't iterate from " + begin.getMetaClass().getName()); + rangeEach(context, new RangeCallBack() { + @Override + void call(ThreadContext context, IRubyObject arg) { + block.yield(context, arg); + } + }); + } + return this; + } + + @JRubyMethod(name = "step", optional = 1, frame = true) + public IRubyObject step(ThreadContext context, IRubyObject[] args, Block block) { + final Ruby runtime = context.getRuntime(); + final IRubyObject step; + if (args.length == 0) { + step = RubyFixnum.one(runtime); + } else { + step = args[0]; + } + + long unit = RubyNumeric.num2long(step); + if (unit < 0) throw runtime.newArgumentError("step can't be negative"); + + if (begin instanceof RubyFixnum && end instanceof RubyFixnum) { + if (unit == 0) throw runtime.newArgumentError("step can't be 0"); + + long e = ((RubyFixnum)end).getLongValue(); + if (!isExclusive) e++; + + for (long i = ((RubyFixnum)begin).getLongValue(); i < e; i += unit) { + block.yield(context, RubyFixnum.newFixnum(runtime, i)); + } + } else { + IRubyObject tmp = begin.checkStringType(); + if (!tmp.isNil()) { + if (unit == 0) throw runtime.newArgumentError("step can't be 0"); + // rb_iterate((VALUE(*)_((VALUE)))str_step, (VALUE)args, step_i, (VALUE)iter); + StepBlockCallBack callback = new StepBlockCallBack(block, RubyFixnum.one(runtime), step); + Block blockCallback = CallBlock.newCallClosure(this, runtime.getRange(), Arity.singleArgument(), callback, context); + ((RubyString)tmp).upto(context, end, isExclusive, blockCallback); + } else if (begin instanceof RubyNumeric) { + if (equalInternal(context, step, RubyFixnum.zero(runtime))) { + throw runtime.newArgumentError("step can't be 0"); + } + final String method; + final int methodIndex; + if (isExclusive) { + method = "<"; + methodIndex = MethodIndex.OP_LT; + } else { + method = "<="; + methodIndex = MethodIndex.OP_LE; + } + IRubyObject beg = begin; + while (beg.callMethod(context, methodIndex, method, end).isTrue()) { + block.yield(context, beg); + beg = beg.callMethod(context, MethodIndex.OP_PLUS, "+", step); + } + } else { + if (unit == 0) throw runtime.newArgumentError("step can't be 0"); + if (!begin.respondsTo("succ")) throw runtime.newTypeError( + "can't iterate from " + begin.getMetaClass().getName()); + // range_each_func(range, step_i, b, e, args); + rangeEach(context, new StepBlockCallBack(block, RubyFixnum.one(runtime), step)); + } + } + return this; + } + + @JRubyMethod(name = {"include?", "member?", "==="}, required = 1) + public RubyBoolean include_p(ThreadContext context, IRubyObject obj) { + if (rangeLe(context, begin, obj) != null) { + if (isExclusive) { + if (rangeLt(context, obj, end) != null) return context.getRuntime().getTrue(); + } else { + if (rangeLe(context, obj, end) != null) return context.getRuntime().getTrue(); + } + } + return context.getRuntime().getFalse(); + } + + private static final ObjectMarshal RANGE_MARSHAL = new ObjectMarshal() { + public void marshalTo(Ruby runtime, Object obj, RubyClass type, + MarshalStream marshalStream) throws IOException { + RubyRange range = (RubyRange)obj; + + marshalStream.registerLinkTarget(range); + List<Variable<IRubyObject>> attrs = range.getVariableList(); + + attrs.add(new VariableEntry<IRubyObject>("begin", range.begin)); + attrs.add(new VariableEntry<IRubyObject>("end", range.end)); + attrs.add(new VariableEntry<IRubyObject>("excl", range.isExclusive ? runtime.getTrue() : runtime.getFalse())); + + marshalStream.dumpVariables(attrs); + } + + public Object unmarshalFrom(Ruby runtime, RubyClass type, + UnmarshalStream unmarshalStream) throws IOException { + RubyRange range = (RubyRange)type.allocate(); + + unmarshalStream.registerLinkTarget(range); + + unmarshalStream.defaultVariablesUnmarshal(range); + + range.begin = range.removeInternalVariable("begin"); + range.end = range.removeInternalVariable("end"); + range.isExclusive = range.removeInternalVariable("excl").isTrue(); + + return range; + } + }; +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import static org.jruby.util.Numeric.f_add; +import static org.jruby.util.Numeric.f_cmp; +import static org.jruby.util.Numeric.f_div; +import static org.jruby.util.Numeric.f_equal_p; +import static org.jruby.util.Numeric.f_expt; +import static org.jruby.util.Numeric.f_floor; +import static org.jruby.util.Numeric.f_gcd; +import static org.jruby.util.Numeric.f_idiv; +import static org.jruby.util.Numeric.f_mul; +import static org.jruby.util.Numeric.f_negate; +import static org.jruby.util.Numeric.f_negative_p; +import static org.jruby.util.Numeric.f_one_p; +import static org.jruby.util.Numeric.f_rshift; +import static org.jruby.util.Numeric.f_sub; +import static org.jruby.util.Numeric.f_to_f; +import static org.jruby.util.Numeric.f_to_i; +import static org.jruby.util.Numeric.f_to_r; +import static org.jruby.util.Numeric.f_to_s; +import static org.jruby.util.Numeric.f_truncate; +import static org.jruby.util.Numeric.f_xor; +import static org.jruby.util.Numeric.f_zero_p; +import static org.jruby.util.Numeric.i_gcd; +import static org.jruby.util.Numeric.i_ilog2; +import static org.jruby.util.Numeric.ldexp; + +import org.joni.encoding.specific.ASCIIEncoding; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.common.IRubyWarnings; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Arity; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.Frame; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.Numeric; + +/** + * 1.9 rational.c as of revision: 18876 + */ + +@JRubyClass(name = "Rational", parent = "Numeric", include = "Precision") +public class RubyRational extends RubyNumeric { + + public static RubyClass createRationalClass(Ruby runtime) { + RubyClass rationalc = runtime.defineClass("Rational", runtime.getNumeric(), RATIONAL_ALLOCATOR); // because one can Complex.send(:allocate) + runtime.setRational(rationalc); + + rationalc.index = ClassIndex.RATIONAL; + rationalc.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyRational; + } + }; + + ThreadContext context = runtime.getCurrentContext(); + rationalc.callMethod(context, "private_class_method", runtime.newSymbol("allocate")); + + rationalc.defineAnnotatedMethods(RubyRational.class); + + return rationalc; + } + + private static ObjectAllocator RATIONAL_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyRational(runtime, klass, RubyFixnum.zero(runtime), RubyFixnum.one(runtime)); + } + }; + + /** internal + * + */ + private RubyRational(Ruby runtime, IRubyObject clazz, IRubyObject num, IRubyObject den) { + super(runtime, (RubyClass)clazz); + this.num = num; + this.den = den; + } + + /** rb_rational_raw + * + */ + static RubyRational newRationalRaw(Ruby runtime, IRubyObject x, RubyObject y) { + return new RubyRational(runtime, runtime.getRational(), x, y); + } + + /** rb_rational_raw1 + * + */ + static RubyRational newRationalRaw(Ruby runtime, IRubyObject x) { + return new RubyRational(runtime, runtime.getRational(), x, RubyFixnum.one(runtime)); + } + + /** rb_rational_new1 + * + */ + static IRubyObject newRationalCanonicalize(ThreadContext context, IRubyObject x) { + return newRationalCanonicalize(context, x, RubyFixnum.one(context.getRuntime())); + } + + /** rb_rational_new + * + */ + private static IRubyObject newRationalCanonicalize(ThreadContext context, IRubyObject x, IRubyObject y) { + return canonicalizeInternal(context, context.getRuntime().getRational(), x, y); + } + + /** f_rational_new2 + * + */ + private static IRubyObject newRational(ThreadContext context, IRubyObject clazz, IRubyObject x, IRubyObject y) { + assert x instanceof RubyRational && y instanceof RubyRational; + return canonicalizeInternal(context, clazz, x, y); + } + + /** f_rational_new1 + * + */ + private static IRubyObject newRational(ThreadContext context, IRubyObject clazz, IRubyObject x) { + assert x instanceof RubyRational; + return canonicalizeInternal(context, clazz, x, RubyFixnum.one(context.getRuntime())); + } + + /** f_rational_new_no_reduce2 + * + */ + private static IRubyObject newRationalNoReduce(ThreadContext context, IRubyObject clazz, IRubyObject x, IRubyObject y) { + assert x instanceof RubyRational && y instanceof RubyRational; + return canonicalizeInternalNoReduce(context, clazz, x, y); + } + + /** f_rational_new_no_reduce1 + * + */ + private static IRubyObject newRationalNoReduce(ThreadContext context, IRubyObject clazz, IRubyObject x) { + assert x instanceof RubyRational; + return canonicalizeInternalNoReduce(context, clazz, x, RubyFixnum.one(context.getRuntime())); + } + + /** f_rational_new_bang2 + * + */ + private static RubyRational newRationalBang(ThreadContext context, IRubyObject clazz, IRubyObject x, IRubyObject y) { + assert !f_negative_p(context, y) && !(f_zero_p(context, y)); + return new RubyRational(context.getRuntime(), clazz, x, y); + } + + /** f_rational_new_bang1 + * + */ + private static RubyRational newRationalBang(ThreadContext context, IRubyObject clazz, IRubyObject x) { + return newRationalBang(context, clazz, x, RubyFixnum.one(context.getRuntime())); + } + + private IRubyObject num; + private IRubyObject den; + + /** nurat_s_new_bang + * + */ + @Deprecated + public static IRubyObject newInstanceBang(ThreadContext context, IRubyObject recv, IRubyObject[]args) { + switch (args.length) { + case 1: return newInstanceBang(context, recv, args[0]); + case 2: return newInstanceBang(context, recv, args[0], args[1]); + } + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 1); + return null; + } + + @JRubyMethod(name = "new!", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject newInstanceBang(ThreadContext context, IRubyObject recv, IRubyObject num) { + return newInstanceBang(context, recv, num, RubyFixnum.one(context.getRuntime())); + } + + @JRubyMethod(name = "new!", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject newInstanceBang(ThreadContext context, IRubyObject recv, IRubyObject num, IRubyObject den) { + if (!(num instanceof RubyInteger)) num = f_to_i(context, num); + if (!(den instanceof RubyInteger)) den = f_to_i(context, den); + + Ruby runtime = context.getRuntime(); + IRubyObject res = f_cmp(context, den, RubyFixnum.zero(runtime)); + if (res == RubyFixnum.minus_one(runtime)) { + num = f_negate(context, num); + den = f_negate(context, den); + } else if (res == RubyFixnum.zero(runtime)) { + throw runtime.newZeroDivisionError(); + } + + return new RubyRational(runtime, recv, num, den); + } + + /** nurat_int_check + * + */ + private static void intCheck(IRubyObject num) { + if (!(num instanceof RubyFixnum ) && !(num instanceof RubyBignum)) throw num.getRuntime().newArgumentError("not an integer"); + } + + /** nurat_s_canonicalize_internal + * + */ + private static IRubyObject canonicalizeInternal(ThreadContext context, IRubyObject clazz, IRubyObject num, IRubyObject den) { + Ruby runtime = context.getRuntime(); + IRubyObject res = f_cmp(context, den, RubyFixnum.zero(runtime)); + if (res == RubyFixnum.minus_one(runtime)) { + num = f_negate(context, num); + den = f_negate(context, den); + } else if (res == RubyFixnum.zero(runtime)) { + throw runtime.newZeroDivisionError(); + } + + IRubyObject gcd = f_gcd(context, num, den); + num = f_idiv(context, num, gcd); + den = f_idiv(context, den, gcd); + + if (f_one_p(context, den) && ((RubyModule)clazz).fastHasConstant("Unify")) return num; + return new RubyRational(context.getRuntime(), clazz, num, den); + } + + /** nurat_s_canonicalize_internal_no_reduce + * + */ + private static IRubyObject canonicalizeInternalNoReduce(ThreadContext context, IRubyObject clazz, IRubyObject num, IRubyObject den) { + Ruby runtime = context.getRuntime(); + IRubyObject res = f_cmp(context, den, RubyFixnum.zero(runtime)); + if (res == RubyFixnum.minus_one(runtime)) { + num = f_negate(context, num); + den = f_negate(context, den); + } else if (res == RubyFixnum.zero(runtime)) { + throw runtime.newZeroDivisionError(); + } + + if (f_equal_p(context, den, RubyFixnum.one(runtime)) && ((RubyModule)clazz).fastHasConstant("Unify")) return num; + return new RubyRational(context.getRuntime(), clazz, num, den); + } + + /** nurat_s_new + * + */ + @Deprecated + public static IRubyObject newInstance(ThreadContext context, IRubyObject clazz, IRubyObject[]args) { + switch (args.length) { + case 1: return newInstance(context, clazz, args[0]); + case 2: return newInstance(context, clazz, args[0], args[1]); + } + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 1); + return null; + } + + @JRubyMethod(name = "new", meta = true) + public static IRubyObject newInstance(ThreadContext context, IRubyObject clazz, IRubyObject num) { + intCheck(num); + return canonicalizeInternal(context, clazz, num, RubyFixnum.one(context.getRuntime())); + } + + @JRubyMethod(name = "new", meta = true) + public static IRubyObject newInstance(ThreadContext context, IRubyObject clazz, IRubyObject num, IRubyObject den) { + intCheck(num); + intCheck(den); + return canonicalizeInternal(context, clazz, num, den); + } + + /** rb_Rational1 + * + */ + public static IRubyObject newRationalConvert(ThreadContext context, IRubyObject x) { + return newRationalConvert(context, x, RubyFixnum.one(context.getRuntime())); + } + + /** rb_Rational/rb_Rational2 + * + */ + public static IRubyObject newRationalConvert(ThreadContext context, IRubyObject x, IRubyObject y) { + return convert(context, context.getRuntime().getRational(), x, y); + } + + @Deprecated + public static IRubyObject convert(ThreadContext context, IRubyObject clazz, IRubyObject[]args) { + switch (args.length) { + case 0: return convert(context, clazz); + case 1: return convert(context, clazz, args[0]); + case 2: return convert(context, clazz, args[0], args[1]); + } + Arity.raiseArgumentError(context.getRuntime(), args.length, 0, 2); + return null; + } + + /** nurat_s_convert + * + */ + @JRubyMethod(name = "convert", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject convert(ThreadContext context, IRubyObject recv) { + IRubyObject nil = context.getRuntime().getNil(); + return convertCommon(context, recv, nil, nil); + } + + /** nurat_s_convert + * + */ + @JRubyMethod(name = "convert", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject convert(ThreadContext context, IRubyObject recv, IRubyObject a1) { + return convertCommon(context, recv, a1, context.getRuntime().getNil()); + } + + /** nurat_s_convert + * + */ + @JRubyMethod(name = "convert", meta = true, visibility = Visibility.PRIVATE) + public static IRubyObject convert(ThreadContext context, IRubyObject recv, IRubyObject a1, IRubyObject a2) { + return convertCommon(context, recv, a1, a2); + } + + private static IRubyObject convertCommon(ThreadContext context, IRubyObject recv, IRubyObject a1, IRubyObject a2) { + if (a1 instanceof RubyComplex) { + RubyComplex a1Complex = (RubyComplex)a1; + if (a1Complex.getImage() instanceof RubyFloat || !f_zero_p(context, a1Complex.getImage())) { + IRubyObject s = f_to_s(context, a1); + throw context.getRuntime().newArgumentError("can't accept " + s.convertToString()); + } + a1 = a1Complex.getReal(); + } + if (a2 instanceof RubyComplex) { + RubyComplex a2Complex = (RubyComplex)a2; + if (a2Complex.getImage() instanceof RubyFloat || !f_zero_p(context, a2Complex.getImage())) { + IRubyObject s = f_to_s(context, a2); + throw context.getRuntime().newArgumentError("can't accept " + s.convertToString()); + } + a2 = a2Complex.getReal(); + } + + Frame frame = context.getCurrentFrame(); + IRubyObject backref = frame.getBackRef(); + if (backref != null && backref instanceof RubyMatchData) ((RubyMatchData)backref).use(); + + if (a1 instanceof RubyFloat) { + a1 = f_to_r(context, a1); + } else if (a1 instanceof RubyString) { + a1 = str_to_r_strict(context, a1); + } + + if (a2 instanceof RubyFloat) { + a2 = f_to_r(context, a2); + } else if (a2 instanceof RubyString) { + a2 = str_to_r_strict(context, a2); + } + + frame.setBackRef(backref); + + if (a1 instanceof RubyRational) { + if (a2.isNil() || f_zero_p(context, a2)) return a1; + return f_div(context, a1, a2); + } + + if (a2 instanceof RubyRational) { + return f_div(context, a1, a2); + } + + return a2.isNil() ? newInstance(context, recv, a1) : newInstance(context, recv, a1, a2); + } + + /** nurat_s_induced_from + * + */ + @JRubyMethod(name = "induced_from", meta = true) + public static IRubyObject induced_from(ThreadContext context, IRubyObject recv, IRubyObject arg) { + return f_to_r(context, arg); + } + + /** nurat_numerator + * + */ + @JRubyMethod(name = "numerator") + public IRubyObject numerator(ThreadContext context) { + return num; + } + + /** nurat_denominator + * + */ + @JRubyMethod(name = "denominator") + public IRubyObject denominator(ThreadContext context) { + return den; + } + + /** f_imul + * + */ + private static IRubyObject f_imul(ThreadContext context, long a, long b) { + Ruby runtime = context.getRuntime(); + if (a == 0 || b == 0) { + return RubyFixnum.zero(runtime); + } else if (a == 1) { + return RubyFixnum.newFixnum(runtime, b); + } else if (b == 1) { + return RubyFixnum.newFixnum(runtime, a); + } + + long c = a * b; + if(c / a != b) { + return RubyBignum.newBignum(runtime, a).op_mul(context, RubyBignum.newBignum(runtime, b)); + } + return RubyFixnum.newFixnum(runtime, c); + } + + /** f_addsub + * + */ + private IRubyObject f_addsub(ThreadContext context, IRubyObject anum, IRubyObject aden, IRubyObject bnum, IRubyObject bden, boolean plus) { + Ruby runtime = context.getRuntime(); + IRubyObject num, den, g, a, b; + if (anum instanceof RubyFixnum && aden instanceof RubyFixnum && + bnum instanceof RubyFixnum && bden instanceof RubyFixnum) { + long an = ((RubyFixnum)anum).getLongValue(); + long ad = ((RubyFixnum)aden).getLongValue(); + long bn = ((RubyFixnum)bnum).getLongValue(); + long bd = ((RubyFixnum)bden).getLongValue(); + long ig = i_gcd(ad, bd); + + g = RubyFixnum.newFixnum(runtime, ig); + a = f_imul(context, an, bd / ig); + b = f_imul(context, bn, ad / ig); + } else { + g = f_gcd(context, aden, bden); + a = f_mul(context, anum, f_idiv(context, bden, g)); + b = f_mul(context, bnum, f_idiv(context, aden, g)); + } + + IRubyObject c = plus ? f_add(context, a, b) : f_sub(context, a, b); + + b = f_idiv(context, aden, g); + g = f_gcd(context, c, g); + num = f_idiv(context, c, g); + a = f_idiv(context, bden, g); + den = f_mul(context, a, b); + + return RubyRational.newRationalNoReduce(context, getMetaClass(), num, den); + } + + /** nurat_add + * + */ + @JRubyMethod(name = "+") + public IRubyObject op_add(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + return f_addsub(context, num, den, other, RubyFixnum.one(context.getRuntime()), true); + case ClassIndex.FLOAT: + return f_add(context, f_to_f(context, this), other); + case ClassIndex.RATIONAL: + RubyRational otherRational = (RubyRational)other; + return f_addsub(context, num, den, otherRational.num, otherRational.den, true); + } + return coerceBin(context, "+", other); + } + + /** nurat_sub + * + */ + @JRubyMethod(name = "-") + public IRubyObject op_sub(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + return f_addsub(context, num, den, other, RubyFixnum.one(context.getRuntime()), false); + case ClassIndex.FLOAT: + return f_sub(context, f_to_f(context, this), other); + case ClassIndex.RATIONAL: + RubyRational otherRational = (RubyRational)other; + return f_addsub(context, num, den, otherRational.num, otherRational.den, false); + } + return coerceBin(context, "-", other); + } + + /** f_muldiv + * + */ + private IRubyObject f_muldiv(ThreadContext context, IRubyObject anum, IRubyObject aden, IRubyObject bnum, IRubyObject bden, boolean mult) { + if (!mult) { + if (f_negative_p(context, bnum)) { + anum = f_negate(context, anum); + bnum = f_negate(context, bnum); + } + IRubyObject tmp = bnum; + bnum = bden; + bden = tmp; + } + + final IRubyObject num, den; + if (anum instanceof RubyFixnum && aden instanceof RubyFixnum && + bnum instanceof RubyFixnum && bden instanceof RubyFixnum) { + long an = ((RubyFixnum)anum).getLongValue(); + long ad = ((RubyFixnum)aden).getLongValue(); + long bn = ((RubyFixnum)bnum).getLongValue(); + long bd = ((RubyFixnum)bden).getLongValue(); + long g1 = i_gcd(an, bd); + long g2 = i_gcd(ad, bn); + + num = f_imul(context, an / g1, bn / g2); + den = f_imul(context, ad / g2, bd / g1); + } else { + IRubyObject g1 = f_gcd(context, anum, bden); + IRubyObject g2 = f_gcd(context, aden, bnum); + + num = f_mul(context, f_idiv(context, anum, g1), f_idiv(context, bnum, g2)); + den = f_mul(context, f_idiv(context, aden, g2), f_idiv(context, bden, g1)); + } + return RubyRational.newRationalNoReduce(context, getMetaClass(), num, den); + + } + + /** nurat_mul + * + */ + @JRubyMethod(name = "*") + public IRubyObject op_mul(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + return f_muldiv(context, num, den, other, RubyFixnum.one(context.getRuntime()), true); + case ClassIndex.FLOAT: + return f_mul(context, f_to_f(context, this), other); + case ClassIndex.RATIONAL: + RubyRational otherRational = (RubyRational)other; + return f_muldiv(context, num, den, otherRational.num, otherRational.den, true); + } + return coerceBin(context, "*", other); + } + + /** nurat_div + * + */ + @JRubyMethod(name = "/") + public IRubyObject op_div(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + if (f_zero_p(context, other)) throw context.getRuntime().newZeroDivisionError(); + return f_muldiv(context, num, den, other, RubyFixnum.one(context.getRuntime()), false); + case ClassIndex.FLOAT: + return f_to_f(context, this).callMethod(context, "/", other); + case ClassIndex.RATIONAL: + if (f_zero_p(context, other)) throw context.getRuntime().newZeroDivisionError(); + RubyRational otherRational = (RubyRational)other; + return f_muldiv(context, num, den, otherRational.num, otherRational.den, false); + } + return coerceBin(context, "/", other); + } + + /** nurat_fdiv + * + */ + @JRubyMethod(name = "fdiv") + public IRubyObject op_fdiv(ThreadContext context, IRubyObject other) { + return f_div(context, f_to_f(context, this), other); + } + + /** nurat_expt + * + */ + @JRubyMethod(name = "**") + public IRubyObject op_expt(ThreadContext context, IRubyObject other) { + Ruby runtime = context.getRuntime(); + + if (f_zero_p(context, other)) { + return RubyRational.newRationalBang(context, getMetaClass(), RubyFixnum.one(runtime)); + } + + if (other instanceof RubyRational) { + RubyRational otherRational = (RubyRational)other; + if (f_one_p(context, otherRational.den)) other = otherRational.num; + } + + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + final IRubyObject tnum, tden; + IRubyObject res = f_cmp(context, other, RubyFixnum.zero(runtime)); + if (res == RubyFixnum.one(runtime)) { + tnum = f_expt(context, num, other); + tden = f_expt(context, den, other); + } else if (res == RubyFixnum.minus_one(runtime)){ + tnum = f_expt(context, den, f_negate(context, other)); + tden = f_expt(context, num, f_negate(context, other)); + } else { + tnum = tden = RubyFixnum.one(runtime); + } + return RubyRational.newRational(context, getMetaClass(), tnum, tden); + case ClassIndex.FLOAT: + case ClassIndex.RATIONAL: + return f_expt(context, f_to_f(context, this), other); + } + return coerceBin(context, "**", other); + } + + + /** nurat_cmp + * + */ + @JRubyMethod(name = "<=>") + public IRubyObject op_cmp(ThreadContext context, IRubyObject other) { + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + if (den instanceof RubyFixnum && ((RubyFixnum)den).getLongValue() == 1) return f_cmp(context, num, other); + return f_cmp(context, this, RubyRational.newRationalBang(context, getMetaClass(), other)); + + case ClassIndex.FLOAT: + return f_cmp(context, f_to_f(context, this), other); + + case ClassIndex.RATIONAL: + RubyRational otherRational = (RubyRational)other; + final IRubyObject num1, num2; + if (num instanceof RubyFixnum && den instanceof RubyFixnum && + otherRational.num instanceof RubyFixnum && otherRational.den instanceof RubyFixnum) { + num1 = f_imul(context, ((RubyFixnum)num).getLongValue(), ((RubyFixnum)otherRational.den).getLongValue()); + num2 = f_imul(context, ((RubyFixnum)otherRational.num).getLongValue(), ((RubyFixnum)den).getLongValue()); + } else { + num1 = f_mul(context, num, otherRational.den); + num2 = f_mul(context, otherRational.num, den); + } + return f_cmp(context, f_sub(context, num1, num2), RubyFixnum.zero(context.getRuntime())); + } + return coerceBin(context, "<=>", other); + } + + /** nurat_equal_p + * + */ + @JRubyMethod(name = "==") + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + Ruby runtime = context.getRuntime(); + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + if (f_zero_p(context, num) && f_zero_p(context, den)) return runtime.getTrue(); + if (!(den instanceof RubyFixnum) || ((RubyFixnum)den).getLongValue() != 1) return runtime.getFalse(); + if (f_equal_p(context, num, other)) return runtime.getTrue(); + return runtime.getFalse(); + + case ClassIndex.FLOAT: + return f_equal_p(context, f_to_f(context, this), other) ? runtime.getTrue() : runtime.getFalse(); + + case ClassIndex.RATIONAL: + RubyRational otherRational = (RubyRational)other; + if (f_zero_p(context, num) && f_zero_p(context, otherRational.num)) return runtime.getTrue(); + if (f_equal_p(context, num, otherRational.num) && f_equal_p(context, den, otherRational.den)) return runtime.getTrue(); + return runtime.getFalse(); + } + return f_equal_p(context, other, this) ? runtime.getTrue() : runtime.getFalse(); + } + + /** nurat_coerce + * + */ + @JRubyMethod(name = "coerce") + public IRubyObject op_coerce(ThreadContext context, IRubyObject other) { + Ruby runtime = context.getRuntime(); + switch (other.getMetaClass().index) { + case ClassIndex.FIXNUM: + case ClassIndex.BIGNUM: + return runtime.newArray(RubyRational.newRationalBang(context, getMetaClass(), other), this); + case ClassIndex.FLOAT: + return runtime.newArray(other, f_to_f(context, this)); + } + throw runtime.newTypeError(other.getMetaClass() + " can't be coerced into " + getMetaClass()); + } + + /** nurat_idiv + * + */ + @JRubyMethod(name = "div") + public IRubyObject op_idiv(ThreadContext context, IRubyObject other) { + return f_floor(context, f_div(context, this, other)); + } + + /** nurat_mod + * + */ + @JRubyMethod(name = {"modulo", "%"}) + public IRubyObject op_mod(ThreadContext context, IRubyObject other) { + IRubyObject val = f_floor(context, f_div(context, this, other)); + return f_sub(context, this, f_mul(context, other, val)); + } + + /** nurat_divmod + * + */ + @JRubyMethod(name = "divmod") + public IRubyObject op_divmod(ThreadContext context, IRubyObject other) { + IRubyObject val = f_floor(context, f_div(context, this, other)); + return context.getRuntime().newArray(val, f_sub(context, this, f_mul(context, other, val))); + } + + /** nurat_rem + * + */ + @JRubyMethod(name = "remainder") + public IRubyObject op_rem(ThreadContext context, IRubyObject other) { + IRubyObject val = f_truncate(context, f_div(context, this, other)); + return f_sub(context, this, f_mul(context, other, val)); + } + + /** nurat_abs + * + */ + @JRubyMethod(name = "abs") + public IRubyObject op_abs(ThreadContext context) { + if (!f_negative_p(context, this)) return this; + return f_negate(context, this); + } + + /** nurat_floor + * + */ + @JRubyMethod(name = "floor") + public IRubyObject op_floor(ThreadContext context) { + return f_idiv(context, num, den); + } + + /** nurat_ceil + * + */ + @JRubyMethod(name = "ceil") + public IRubyObject op_ceil(ThreadContext context) { + return f_negate(context, f_idiv(context, f_negate(context, num), den)); + } + + /** nurat_truncate + * + */ + @JRubyMethod(name = {"truncate", "to_i"}) + public IRubyObject op_truncate(ThreadContext context) { + if (f_negative_p(context, num)) { + return f_negate(context, f_idiv(context, f_negate(context, num), den)); + } + return f_idiv(context, num, den); + } + + /** nurat_round + * + */ + @JRubyMethod(name = "round") + public IRubyObject op_round(ThreadContext context) { + IRubyObject two = RubyFixnum.two(context.getRuntime()); + if (f_negative_p(context, num)) { + IRubyObject tnum = f_negate(context, num); + tnum = f_add(context, f_mul(context, tnum, two), den); + IRubyObject tden = f_mul(context, den, two); + return f_negate(context, f_idiv(context, tnum, tden)); + } else { + IRubyObject tnum = f_add(context, f_mul(context, num, two), den); + IRubyObject tden = f_mul(context, den, two); + return f_idiv(context, tnum, tden); + } + } + + /** nurat_to_f + * + */ + private static long ML = (long)(Math.log(Double.MAX_VALUE) / Math.log(2.0) - 1); + @JRubyMethod(name = "to_f") + public IRubyObject to_f(ThreadContext context) { + Ruby runtime = context.getRuntime(); + if (f_zero_p(context, num)) return runtime.newFloat(0); + + IRubyObject num = this.num; + IRubyObject den = this.den; + + boolean minus = false; + if (f_negative_p(context, num)) { + num = f_negate(context, num); + minus = true; + } + + long nl = i_ilog2(context, num); + long dl = i_ilog2(context, den); + + long ne = 0; + if (nl > ML) { + ne = nl - ML; + num = f_rshift(context, num, RubyFixnum.newFixnum(runtime, ne)); + } + + long de = 0; + if (dl > ML) { + de = dl - ML; + den = f_rshift(context, den, RubyFixnum.newFixnum(runtime, de)); + } + + long e = ne - de; + + if (e > 1023 || e < -1022) { + runtime.getWarnings().warn(IRubyWarnings.ID.FLOAT_OUT_OF_RANGE, "out of Float range", getMetaClass()); + return runtime.newFloat(e > 0 ? Double.MAX_VALUE : 0); + } + + double f = RubyNumeric.num2dbl(num) / RubyNumeric.num2dbl(den); + + if (minus) { + f = -f; + f = ldexp(f, e); + } + + if (Double.isInfinite(f) || Double.isNaN(f)) { + runtime.getWarnings().warn(IRubyWarnings.ID.FLOAT_OUT_OF_RANGE, "out of Float range", getMetaClass()); + } + + return runtime.newFloat(f); + } + + /** nurat_to_r + * + */ + @JRubyMethod(name = "to_r") + public IRubyObject to_r(ThreadContext context) { + return this; + } + + /** nurat_to_r + * + */ + @JRubyMethod(name = "hash") + public IRubyObject hash(ThreadContext context) { + return f_xor(context, num, den); + } + + /** nurat_to_s + * + */ + @JRubyMethod(name = "to_s") + public IRubyObject to_s(ThreadContext context) { + return RuntimeHelpers.invoke(context, context.getRuntime().getKernel(), "format", context.getRuntime().newString("%d/%d"), num, den); + } + + /** nurat_inspect + * + */ + @JRubyMethod(name = "inspect") + public IRubyObject inspect(ThreadContext context) { + return RuntimeHelpers.invoke(context, context.getRuntime().getKernel(), "format", context.getRuntime().newString("(%d/%d)"), num, den); + } + + /** nurat_marshal_dump + * + */ + @JRubyMethod(name = "marshal_dump") + public IRubyObject marshal_dump(ThreadContext context) { + return context.getRuntime().newArray(num, den); + } + + /** nurat_marshal_load + * + */ + @JRubyMethod(name = "marshal_load") + public IRubyObject marshal_load(ThreadContext context, IRubyObject arg) { + RubyArray a = arg.convertToArray(); + num = a.size() > 0 ? a.eltInternal(0) : context.getRuntime().getNil(); + den = a.size() > 1 ? a.eltInternal(1) : context.getRuntime().getNil(); + + if (f_zero_p(context, den)) throw context.getRuntime().newZeroDivisionError(); + return this; + } + + /** rb_gcd + * + */ + @JRubyMethod(name = "gcd") + public IRubyObject gcd(ThreadContext context, IRubyObject other) { + intCheck(other); + return f_gcd(context, this, other); + } + + /** rb_lcm + * + */ + @JRubyMethod(name = "lcm") + public IRubyObject lcm(ThreadContext context, IRubyObject other) { + intCheck(other); + return Numeric.f_lcm(context, this, other); + } + + /** rb_gcdlcm + * + */ + @JRubyMethod(name = "gcdlcm") + public IRubyObject gcdlcm(ThreadContext context, IRubyObject other) { + intCheck(other); + return context.getRuntime().newArray(f_gcd(context, this, other), Numeric.f_lcm(context, this, other)); + } + + + static RubyArray str_to_r_internal(ThreadContext context, IRubyObject recv) { + RubyString s = recv.callMethod(context, "strip").convertToString(); + ByteList bytes = s.getByteList(); + + Ruby runtime = context.getRuntime(); + if (bytes.realSize == 0) return runtime.newArray(runtime.getNil(), recv); + + IRubyObject m = RubyRegexp.newRegexp(runtime, Numeric.RationalPatterns.rat_pat).callMethod(context, "match", s); + + if (!m.isNil()) { + IRubyObject si = m.callMethod(context, "[]", RubyFixnum.one(runtime)); + IRubyObject nu = m.callMethod(context, "[]", RubyFixnum.two(runtime)); + IRubyObject de = m.callMethod(context, "[]", RubyFixnum.three(runtime)); + IRubyObject re = m.callMethod(context, "post_match"); + + RubyArray a = nu.callMethod(context, "split", RubyRegexp.newRegexp(runtime, Numeric.RationalPatterns.an_e_pat)).convertToArray(); + IRubyObject ifp = a.eltInternal(0); + IRubyObject exp = a.size() != 2 ? runtime.getNil() : a.eltInternal(1); + + a = ifp.callMethod(context, "split", RubyRegexp.newRegexp(runtime, Numeric.RationalPatterns.a_dot_pat)).convertToArray(); + IRubyObject ip = a.eltInternal(0); + IRubyObject fp = a.size() != 2 ? runtime.getNil() : a.eltInternal(1); + + IRubyObject v = RubyRational.newRationalCanonicalize(context, f_to_i(context, ip)); + + if (!fp.isNil()) { + bytes = fp.convertToString().getByteList(); + int count = 0; + byte[]buf = bytes.bytes; + int i = bytes.begin; + int end = i + bytes.realSize; + while (i < end) if (ASCIIEncoding.INSTANCE.isDigit(buf[i++])) count++; + IRubyObject l = f_expt(context, RubyFixnum.newFixnum(runtime, 10), RubyFixnum.newFixnum(runtime, count)); + v = f_mul(context, v, l); + v = f_add(context, v, f_to_i(context, fp)); + v = f_div(context, v, l); + } + if (!exp.isNil()) { + v = f_mul(context, v, f_expt(context, RubyFixnum.newFixnum(runtime, 10), f_to_i(context, exp))); + } + if (!si.isNil()) { + bytes = si.convertToString().getByteList(); + if (bytes.length() > 0 && bytes.get(0) == '-') v = f_negate(context, v); + } + if (!de.isNil()) { + v = f_div(context, v, f_to_i(context, de)); + } + return runtime.newArray(v, re); + } + return runtime.newArray(runtime.getNil(), recv); + } + + private static IRubyObject str_to_r_strict(ThreadContext context, IRubyObject recv) { + RubyArray a = str_to_r_internal(context, recv); + if (a.eltInternal(0).isNil() || a.eltInternal(1).convertToString().getByteList().length() > 0) { + IRubyObject s = recv.callMethod(context, "inspect"); + throw context.getRuntime().newArgumentError("invalid value for Rational: " + s.convertToString()); + } + return a.eltInternal(0); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004-2005 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 David Corbin <dcorbin@users.sourceforge.net> + * Copyright (C) 2006 Nick Sieger <nicksieger@gmail.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.lang.ref.SoftReference; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Iterator; +import java.util.Map; + +import org.joni.Matcher; +import org.joni.NameEntry; +import org.joni.Option; +import org.joni.Regex; +import org.joni.Region; +import org.joni.Syntax; +import org.joni.WarnCallback; +import org.joni.encoding.Encoding; +import org.joni.exception.JOniException; + +import static org.jruby.anno.FrameField.*; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.parser.ReOptions; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.Frame; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.ByteList; +import org.jruby.util.KCode; +import org.jruby.util.TypeConverter; + +/** + * + */ +@JRubyClass(name="Regexp") +public class RubyRegexp extends RubyObject implements ReOptions, WarnCallback { + private KCode kcode; + private Regex pattern; + private ByteList str; + + private static final int REGEXP_LITERAL_F = 1 << 11; + private static final int REGEXP_KCODE_DEFAULT = 1 << 12; + + public void setLiteral() { + flags |= REGEXP_LITERAL_F; + } + + public void clearLiteral() { + flags &= ~REGEXP_LITERAL_F; + } + + public boolean isLiteral() { + return (flags & REGEXP_LITERAL_F) != 0; + } + + public void setKCodeDefault() { + flags |= REGEXP_KCODE_DEFAULT; + } + + public void clearKCodeDefault() { + flags &= ~REGEXP_KCODE_DEFAULT; + } + + public boolean isKCodeDefault() { + return (flags & REGEXP_KCODE_DEFAULT) != 0; + } + + public KCode getKCode() { + return kcode; + } + + private static Map<ByteList, Regex> getPatternCache() { + Map<ByteList, Regex> cache = patternCache.get(); + if (cache == null) { + cache = new ConcurrentHashMap<ByteList, Regex>(5); + patternCache = new SoftReference<Map<ByteList, Regex>>(cache); + } + return cache; + } + + static volatile SoftReference<Map<ByteList, Regex>> patternCache = new SoftReference<Map<ByteList, Regex>>(null); + + public static RubyClass createRegexpClass(Ruby runtime) { + RubyClass regexpClass = runtime.defineClass("Regexp", runtime.getObject(), REGEXP_ALLOCATOR); + runtime.setRegexp(regexpClass); + regexpClass.index = ClassIndex.REGEXP; + regexpClass.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyRegexp; + } + }; + + regexpClass.defineConstant("IGNORECASE", runtime.newFixnum(RE_OPTION_IGNORECASE)); + regexpClass.defineConstant("EXTENDED", runtime.newFixnum(RE_OPTION_EXTENDED)); + regexpClass.defineConstant("MULTILINE", runtime.newFixnum(RE_OPTION_MULTILINE)); + + regexpClass.defineAnnotatedMethods(RubyRegexp.class); + + return regexpClass; + } + + private static ObjectAllocator REGEXP_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + RubyRegexp instance = new RubyRegexp(runtime, klass); + return instance; + } + }; + + /** used by allocator + * + */ + private RubyRegexp(Ruby runtime, RubyClass klass) { + super(runtime, klass); + } + + /** default constructor + * + */ + private RubyRegexp(Ruby runtime) { + super(runtime, runtime.getRegexp()); + } + + // used only by the compiler/interpreter (will set the literal flag) + public static RubyRegexp newRegexp(Ruby runtime, String pattern, int options) { + return newRegexp(runtime, ByteList.create(pattern), options); + } + + // used only by the compiler/interpreter (will set the literal flag) + public static RubyRegexp newRegexp(Ruby runtime, ByteList pattern, int options) { + RubyRegexp regexp = newRegexp(runtime, pattern, options, false); + regexp.setLiteral(); + return regexp; + } + + public static RubyRegexp newRegexp(Ruby runtime, ByteList pattern, int options, boolean quote) { + RubyRegexp regexp = new RubyRegexp(runtime); + regexp.initialize(pattern, options, quote); + return regexp; + } + + // internal usage + static RubyRegexp newRegexp(Ruby runtime, Regex regex) { + RubyRegexp regexp = new RubyRegexp(runtime); + regexp.pattern = regex; + regexp.str = ByteList.EMPTY_BYTELIST; + return regexp; + } + + public void warn(String message) { + getRuntime().getWarnings().warn(ID.MISCELLANEOUS, message); + } + + @JRubyMethod(name = "kcode") + public IRubyObject kcode(ThreadContext context) { + return (!isKCodeDefault() && kcode != null) ? + context.getRuntime().newString(kcode.name()) : context.getRuntime().getNil(); + } + + @Override + public int getNativeTypeIndex() { + return ClassIndex.REGEXP; + } + + public Regex getPattern() { + return pattern; + } + + private void check() { + if (pattern == null || str == null) throw getRuntime().newTypeError("uninitialized Regexp"); + } + + @JRubyMethod(name = "hash") + @Override + public RubyFixnum hash() { + check(); + int hashval = (int)pattern.getOptions(); + int len = this.str.realSize; + int p = this.str.begin; + while (len-->0) { + hashval = hashval * 33 + str.bytes[p++]; + } + hashval = hashval + (hashval>>5); + return getRuntime().newFixnum(hashval); + } + + @JRubyMethod(name = {"==", "eql?"}, required = 1) + @Override + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + if(this == other) return context.getRuntime().getTrue(); + if(!(other instanceof RubyRegexp)) return context.getRuntime().getFalse(); + RubyRegexp otherRegex = (RubyRegexp)other; + + check(); + otherRegex.check(); + + return context.getRuntime().newBoolean(str.equal(otherRegex.str) && + kcode == otherRegex.kcode && pattern.getOptions() == otherRegex.pattern.getOptions()); + } + + @JRubyMethod(name = "~", reads = {LASTLINE, BACKREF}, writes = BACKREF) + public IRubyObject op_match2(ThreadContext context) { + Ruby runtime = context.getRuntime(); + IRubyObject line = context.getCurrentFrame().getLastLine(); + if(!(line instanceof RubyString)) { + context.getCurrentFrame().setBackRef(runtime.getNil()); + return runtime.getNil(); + } + int start = search(context, (RubyString)line, 0, false); + if(start < 0) { + return runtime.getNil(); + } else { + return runtime.newFixnum(start); + } + } + + /** rb_reg_eqq + * + */ + @JRubyMethod(name = "===", required = 1, writes = BACKREF) + public IRubyObject eqq(ThreadContext context, IRubyObject str) { + Ruby runtime = context.getRuntime(); + if(!(str instanceof RubyString)) str = str.checkStringType(); + + if (str.isNil()) { + context.getCurrentFrame().setBackRef(runtime.getNil()); + return runtime.getFalse(); + } + int start = search(context, (RubyString)str, 0, false); + return (start < 0) ? runtime.getFalse() : runtime.getTrue(); + } + + private static final int REGEX_QUOTED = 1; + private void initialize(ByteList bytes, int options, boolean quote) { + if (!isTaint() && getRuntime().getSafeLevel() >= 4) throw getRuntime().newSecurityError("Insecure: can't modify regexp"); + checkFrozen(); + if (isLiteral()) throw getRuntime().newSecurityError("can't modify literal regexp"); + + setKCode(options); + + Map<ByteList, Regex> cache = getPatternCache(); + Regex pat = cache.get(bytes); + + if (pat != null && + pat.getEncoding() == kcode.getEncoding() && + pat.getOptions() == (options & 0xf) && + ((pat.getUserOptions() & REGEX_QUOTED) != 0) == quote) { // cache hit + pattern = pat; + } else { + if (quote) bytes = quote(bytes, getRuntime().getKCode()); + makeRegexp(bytes, bytes.begin, bytes.realSize, options & 0xf, kcode.getEncoding()); + if (quote) pattern.setUserOptions(REGEX_QUOTED); + cache.put(bytes, pattern); + } + + str = bytes; + } + + private void makeRegexp(ByteList bytes, int start, int len, int flags, Encoding enc) { + try { + pattern = new Regex(bytes.bytes, start, start + len, flags, enc, Syntax.DEFAULT, this); + } catch(Exception e) { + rb_reg_raise(bytes.bytes, start, len, e.getMessage(), flags); + } + } + + private final void rb_reg_raise(byte[] s, int start, int len, String err,int flags) { + throw getRuntime().newRegexpError(err + ": " + rb_reg_desc(s,start, len,flags)); + } + + private final StringBuilder rb_reg_desc(byte[] s, int start, int len, int flags) { + StringBuilder sb = new StringBuilder("/"); + rb_reg_expr_str(sb, s, start, len); + sb.append("/"); + + if((flags & ReOptions.RE_OPTION_MULTILINE) != 0) sb.append("m"); + if((flags & ReOptions.RE_OPTION_IGNORECASE) != 0) sb.append("i"); + if((flags & ReOptions.RE_OPTION_EXTENDED) != 0) sb.append("x"); + + if (kcode != null && !isKCodeDefault()) { + sb.append(kcode.name().charAt(0)); + } + return sb; + } + + private final void rb_reg_expr_str(StringBuilder sb, byte[] s, int start, int len) { + int p,pend; + boolean need_escape = false; + p = start; + pend = start+len; + Encoding enc = kcode.getEncoding(); + while(p<pend) { + if(s[p] == '/' || (!(' ' == s[p] || (!Character.isWhitespace(s[p]) && + !Character.isISOControl(s[p]))) && + enc.length(s[p])==1)) { + need_escape = true; + break; + } + p += enc.length(s[p]); + } + if(!need_escape) { + sb.append(new ByteList(s,start,len,false).toString()); + } else { + p = 0; + while(p < pend) { + if(s[p] == '\\') { + int n = enc.length(s[p+1]) + 1; + sb.append(new ByteList(s,p,n,false).toString()); + p += n; + continue; + } else if(s[p] == '/') { + sb.append("\\/"); + } else if(enc.length(s[p])!=1) { + sb.append(new ByteList(s,p,enc.length(s[p]),false).toString()); + p += enc.length(s[p]); + continue; + } else if((' ' == s[p] || (!Character.isWhitespace(s[p]) && + !Character.isISOControl(s[p])))) { + sb.append((char)(s[p]&0xFF)); + } else if(!Character.isWhitespace((char)(s[p]&0xFF))) { + sb.append('\\'); + sb.append(Integer.toString((int)(s[p]&0377),8)); + } else { + sb.append((char)(s[p]&0xFF)); + } + p++; + } + } + } + + /** rb_reg_init_copy + */ + @JRubyMethod(name = "initialize_copy", required = 1) + @Override + public IRubyObject initialize_copy(IRubyObject re) { + if(this == re) return this; + + checkFrozen(); + + if (getMetaClass().getRealClass() != re.getMetaClass().getRealClass()) { + throw getRuntime().newTypeError("wrong argument type"); + } + + RubyRegexp regexp = (RubyRegexp)re; + regexp.check(); + + initialize(regexp.str, regexp.getOptions(), false); + + return this; + } + + /** rb_set_kcode + */ + private int getKcode() { + if(kcode == KCode.NONE) { + return 16; + } else if(kcode == KCode.EUC) { + return 32; + } else if(kcode == KCode.SJIS) { + return 48; + } else if(kcode == KCode.UTF8) { + return 64; + } + return 0; + } + + /** + */ + private void setKCode(int options) { + clearKCodeDefault(); + switch(options & ~0xf) { + case 0: + default: + setKCodeDefault(); + kcode = getRuntime().getKCode(); + break; + case 16: + kcode = KCode.NONE; + break; + case 32: + kcode = KCode.EUC; + break; + case 48: + kcode = KCode.SJIS; + break; + case 64: + kcode = KCode.UTF8; + break; + } + } + + /** rb_reg_options + */ + private int getOptions() { + check(); + int options = (int)(pattern.getOptions() & (RE_OPTION_IGNORECASE|RE_OPTION_MULTILINE|RE_OPTION_EXTENDED)); + if(!isKCodeDefault()) { + options |= getKcode(); + } + return options; + } + + /** rb_reg_initialize_m + */ + @JRubyMethod(name = "initialize", optional = 3, visibility = Visibility.PRIVATE) + public IRubyObject initialize_m(IRubyObject[] args) { + ByteList bytes; + int regexFlags = 0; + + if(args[0] instanceof RubyRegexp) { + if(args.length > 1) { + getRuntime().getWarnings().warn(ID.REGEXP_IGNORED_FLAGS, "flags" + (args.length == 3 ? " and encoding" : "") + " ignored"); + } + RubyRegexp regexp = (RubyRegexp)args[0]; + regexp.check(); + + regexFlags = (int)regexp.pattern.getOptions() & 0xF; + if (!regexp.isKCodeDefault() && regexp.kcode != null && regexp.kcode != KCode.NIL) { + if (regexp.kcode == KCode.NONE) { + regexFlags |= 16; + } else if (regexp.kcode == KCode.EUC) { + regexFlags |= 32; + } else if (regexp.kcode == KCode.SJIS) { + regexFlags |= 48; + } else if (regexp.kcode == KCode.UTF8) { + regexFlags |= 64; + } + } + bytes = regexp.str; + } else { + if (args.length >= 2) { + if (args[1] instanceof RubyFixnum) { + regexFlags = RubyNumeric.fix2int(args[1]); + } else if (args[1].isTrue()) { + regexFlags = RE_OPTION_IGNORECASE; + } + } + if (args.length == 3 && !args[2].isNil()) { + ByteList kcodeBytes = args[2].convertToString().getByteList(); + char first = kcodeBytes.length() > 0 ? kcodeBytes.charAt(0) : 0; + regexFlags &= ~0x70; + switch (first) { + case 'n': case 'N': + regexFlags |= 16; + break; + case 'e': case 'E': + regexFlags |= 32; + break; + case 's': case 'S': + regexFlags |= 48; + break; + case 'u': case 'U': + regexFlags |= 64; + break; + default: + break; + } + } + bytes = args[0].convertToString().getByteList(); + } + initialize(bytes, regexFlags, false); + + return this; + } + + @JRubyMethod(name = {"new", "compile"}, required = 1, optional = 2, meta = true) + public static RubyRegexp newInstance(IRubyObject recv, IRubyObject[] args) { + RubyClass klass = (RubyClass)recv; + + RubyRegexp re = (RubyRegexp) klass.allocate(); + re.callInit(args, Block.NULL_BLOCK); + + return re; + } + + @JRubyMethod(name = "options") + public IRubyObject options() { + return getRuntime().newFixnum(getOptions()); + } + + /** rb_reg_search + */ + public int search(ThreadContext context, RubyString str, int pos, boolean reverse) { + Ruby runtime = context.getRuntime(); + Frame frame = context.getCurrentRubyFrame(); + + ByteList value = str.getByteList(); + if (pos > value.realSize || pos < 0) { + frame.setBackRef(runtime.getNil()); + return -1; + } + + return performSearch(reverse, pos, value, frame, runtime, context, str); + } + + private int performSearch(boolean reverse, int pos, ByteList value, Frame frame, Ruby runtime, ThreadContext context, RubyString str) { + check(); + + int realSize = value.realSize; + int begin = value.begin; + int range = reverse ? -pos : realSize - pos; + + Matcher matcher = pattern.matcher(value.bytes, begin, begin + realSize); + + int result = matcher.search(begin + pos, begin + pos + range, Option.NONE); + + if (result < 0) { + frame.setBackRef(runtime.getNil()); + return result; + } + + updateBackRef(context, str, frame, matcher); + + return result; + } + + final RubyMatchData updateBackRef(ThreadContext context, RubyString str, Frame frame, Matcher matcher) { + Ruby runtime = context.getRuntime(); + IRubyObject backref = frame.getBackRef(); + final RubyMatchData match; + if (backref == null || backref.isNil() || ((RubyMatchData)backref).used()) { + match = new RubyMatchData(runtime); + } else { + match = (RubyMatchData)backref; + match.setTaint(runtime.getSafeLevel() >= 3); + } + + match.regs = matcher.getRegion(); // lazy, null when no groups defined + match.begin = matcher.getBegin(); + match.end = matcher.getEnd(); + + match.str = (RubyString)str.strDup(runtime).freeze(context); + match.pattern = pattern; + + frame.setBackRef(match); + + match.infectBy(this); + match.infectBy(str); + return match; + } + + /** rb_reg_match + * + */ + @JRubyMethod(name = "=~", required = 1, reads = BACKREF, writes = BACKREF) + @Override + public IRubyObject op_match(ThreadContext context, IRubyObject str) { + int start; + if(str.isNil()) { + context.getCurrentFrame().setBackRef(context.getRuntime().getNil()); + return str; + } + + start = search(context, str.convertToString(), 0, false); + + if (start < 0) return context.getRuntime().getNil(); + + return RubyFixnum.newFixnum(context.getRuntime(), start); + } + + /** rb_reg_match_m + * + */ + @JRubyMethod(name = "match", required = 1, reads = BACKREF) + public IRubyObject match_m(ThreadContext context, IRubyObject str) { + if (op_match(context, str).isNil()) return context.getRuntime().getNil(); + + IRubyObject result = context.getCurrentFrame().getBackRef(); + if (result instanceof RubyMatchData) { + ((RubyMatchData)result).use(); + } + return result; + } + + + public RubyString regsub(RubyString str, RubyString src, Matcher matcher) { + Region regs = matcher.getRegion(); + int mbeg = matcher.getBegin(); + int mend = matcher.getEnd(); + + int p,s,e; + p = s = 0; + int no = -1; + ByteList bs = str.getByteList(); + ByteList srcbs = src.getByteList(); + e = bs.length(); + RubyString val = null; + Encoding enc = kcode.getEncoding(); + + int beg, end; + while(s < e) { + int ss = s; + char c = bs.charAt(s++); + if(enc.length((byte)c) != 1) { + s += enc.length((byte)c) - 1; + continue; + } + if (c != '\\' || s == e) continue; + if (val == null) val = RubyString.newString(getRuntime(), new ByteList(ss - p)); + + val.cat(bs.bytes, bs.begin + p, ss - p); + c = bs.charAt(s++); + p = s; + + switch(c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + no = c - '0'; + break; + case '&': + no = 0; + break; + case '`': + beg = regs == null ? mbeg : regs.beg[0]; + val.cat(srcbs.bytes, srcbs.begin, beg); + continue; + + case '\'': + end = regs == null ? mend : regs.end[0]; + val.cat(srcbs.bytes, srcbs.begin + end, src.getByteList().realSize - end); + continue; + + case '+': + if (regs == null) { + if (mbeg == -1) { + no = 0; + continue; + } + } else { + no = regs.numRegs-1; + while(regs.beg[no] == -1 && no > 0) no--; + if (no == 0) continue; + } + break; + case '\\': + val.cat(bs.bytes, s - 1, 1); + continue; + default: + val.cat(bs.bytes, s - 2, 2); + continue; + } + + if (regs != null) { + if (no >= 0) { + if (no >= regs.numRegs || regs.beg[no] == -1) continue; + val.cat(srcbs.bytes, srcbs.begin + regs.beg[no], regs.end[no] - regs.beg[no]); + } + } else { + if (no != 0 || mbeg == -1) continue; + val.cat(srcbs.bytes, srcbs.begin + mbeg, mend - mbeg); + } + } + + if(p < e) { + if(val == null) { + val = RubyString.newString(getRuntime(), bs.makeShared(p, e-p)); + } else { + val.cat(bs.bytes, bs.begin + p, e - p); + } + } + if (val == null) return str; + + return val; + } + + final int adjustStartPos(RubyString str, int pos, boolean reverse) { + check(); + ByteList value = str.getByteList(); + return pattern.adjustStartPosition(value.bytes, value.begin, value.realSize, pos, reverse); + } + + @JRubyMethod(name = "casefold?") + public IRubyObject casefold_p(ThreadContext context) { + check(); + + return context.getRuntime().newBoolean((pattern.getOptions() & RE_OPTION_IGNORECASE) != 0); + } + + /** rb_reg_source + * + */ + @JRubyMethod(name = "source") + public IRubyObject source() { + Ruby runtime = getRuntime(); + check(); + RubyString str = RubyString.newStringShared(runtime, this.str); + if(isTaint()) { + str.taint(runtime.getCurrentContext()); + } + return str; + } + + final int length() { + return str.realSize; + } + + /** rb_reg_inspect + * + */ + @JRubyMethod(name = "inspect") + @Override + public IRubyObject inspect() { + check(); + return getRuntime().newString(ByteList.create(rb_reg_desc(str.bytes, str.begin, str.realSize, pattern.getOptions()).toString())); + } + + private final static int EMBEDDABLE = RE_OPTION_MULTILINE|RE_OPTION_IGNORECASE|RE_OPTION_EXTENDED; + + @JRubyMethod(name = "to_s") + @Override + public IRubyObject to_s() { + RubyString ss = getRuntime().newString("(?"); + check(); + + int options = pattern.getOptions(); + int ptr = str.begin; + int len = str.realSize; + byte[] bytes = str.bytes; + again: do { + if (len >= 4 && bytes[ptr] == '(' && bytes[ptr + 1] == '?') { + boolean err = true; + ptr += 2; + if ((len -= 2) > 0) { + do { + if (bytes[ptr] == 'm') { + options |= RE_OPTION_MULTILINE; + } else if (bytes[ptr] == 'i') { + options |= RE_OPTION_IGNORECASE; + } else if (bytes[ptr] == 'x') { + options |= RE_OPTION_EXTENDED; + } else { + break; + } + ptr++; + } while(--len > 0); + } + if (len > 1 && bytes[ptr] == '-') { + ++ptr; + --len; + do { + if (bytes[ptr] == 'm') { + options &= ~RE_OPTION_MULTILINE; + } else if (bytes[ptr] == 'i') { + options &= ~RE_OPTION_IGNORECASE; + } else if (bytes[ptr] == 'x') { + options &= ~RE_OPTION_EXTENDED; + } else { + break; + } + ptr++; + } while(--len > 0); + } + + if (bytes[ptr] == ')') { + --len; + ++ptr; + continue again; + } + + if (bytes[ptr] == ':' && bytes[ptr + len - 1] == ')') { + try { + new Regex(bytes, ++ptr, ptr + (len-=2) ,Option.DEFAULT, kcode.getEncoding(), Syntax.DEFAULT); + err = false; + } catch (JOniException e) { + err = true; + } + } + + if (err) { + options = (int)pattern.getOptions(); + ptr = str.begin; + len = str.realSize; + } + } + if ((options & RE_OPTION_MULTILINE) !=0 ) ss.cat((byte)'m'); + if ((options & RE_OPTION_IGNORECASE) !=0 ) ss.cat((byte)'i'); + if ((options & RE_OPTION_EXTENDED) !=0 ) ss.cat((byte)'x'); + + if ((options & EMBEDDABLE) != EMBEDDABLE) { + ss.cat((byte)'-'); + if ((options & RE_OPTION_MULTILINE) == 0) ss.cat((byte)'m'); + if ((options & RE_OPTION_IGNORECASE) == 0) ss.cat((byte)'i'); + if ((options & RE_OPTION_EXTENDED) == 0) ss.cat((byte)'x'); + } + ss.cat((byte)':'); + rb_reg_expr_str(ss, ptr, len); + ss.cat((byte)')'); + ss.infectBy(this); + return ss; + } while(true); + } + + private final void rb_reg_expr_str(RubyString ss, int s, int len) { + int p = s; + int pend = p + len; + boolean need_escape = false; + Encoding enc = kcode.getEncoding(); + while (p < pend) { + if (str.bytes[p] == '/' || (!enc.isPrint(str.bytes[p] & 0xff) && enc.length(str.bytes[p]) == 1)) { + need_escape = true; + break; + } + p += enc.length(str.bytes[p]); + } + if (!need_escape) { + ss.cat(str.bytes, s, len); + } else { + p = s; + while (p<pend) { + if (str.bytes[p] == '\\') { + int n = enc.length(str.bytes[p+1]) + 1; + ss.cat(str.bytes, p, n); + p += n; + continue; + } else if (str.bytes[p] == '/') { + ss.cat((byte)'\\'); + ss.cat(str.bytes, p, 1); + } else if (enc.length(str.bytes[p]) != 1) { + ss.cat(str.bytes, p, enc.length(str.bytes[p])); + p += enc.length(str.bytes[p]); + continue; + } else if (enc.isPrint(str.bytes[p] & 0xff)) { + ss.cat(str.bytes,p,1); + } else if (!enc.isSpace(str.bytes[p] & 0xff)) { + ss.cat(ByteList.create(Integer.toString(str.bytes[p] & 0377, 8))); + } else { + ss.cat(str.bytes, p, 1); + } + p++; + } + } + } + + /** rb_reg_s_quote + * + */ + @JRubyMethod(name = {"quote", "escape"}, required = 1, optional = 1, meta = true) + public static RubyString quote(IRubyObject recv, IRubyObject[] args) { + IRubyObject kcode = args.length == 2 ? args[1] : null; + IRubyObject str = args[0]; + KCode code = recv.getRuntime().getKCode(); + + if (kcode != null && !kcode.isNil()) { + code = KCode.create(recv.getRuntime(), kcode.toString()); + } + + RubyString src = str.convertToString(); + RubyString dst = RubyString.newString(recv.getRuntime(), quote(src.getByteList(), code)); + dst.infectBy(src); + return dst; + } + + /** rb_reg_quote + * + */ + public static ByteList quote(ByteList str, KCode kcode) { + ByteList bs = str; + int tix = 0; + int s = bs.begin; + char c; + int send = s+bs.length(); + Encoding enc = kcode.getEncoding(); + meta_found: do { + for(; s<send; s++) { + c = (char)(bs.bytes[s]&0xFF); + if(enc.length((byte)c) != 1) { + int n = enc.length((byte)c); + while(n-- > 0 && s < send) { + s++; + } + s--; + continue; + } + switch (c) { + case '[': case ']': case '{': case '}': + case '(': case ')': case '|': case '-': + case '*': case '.': case '\\': + case '?': case '+': case '^': case '$': + case ' ': case '#': + case '\t': case '\f': case '\n': case '\r': + break meta_found; + } + } + return bs; + } while(false); + ByteList b1 = new ByteList(send*2); + System.arraycopy(bs.bytes,bs.begin,b1.bytes,b1.begin,s-bs.begin); + tix += (s-bs.begin); + + for(; s<send; s++) { + c = (char)(bs.bytes[s]&0xFF); + if(enc.length((byte)c) != 1) { + int n = enc.length((byte)c); + while(n-- > 0 && s < send) { + b1.bytes[tix++] = bs.bytes[s++]; + } + s--; + continue; + } + + switch(c) { + case '[': case ']': case '{': case '}': + case '(': case ')': case '|': case '-': + case '*': case '.': case '\\': + case '?': case '+': case '^': case '$': + case '#': + b1.bytes[tix++] = '\\'; + break; + case ' ': + b1.bytes[tix++] = '\\'; + b1.bytes[tix++] = ' '; + continue; + case '\t': + b1.bytes[tix++] = '\\'; + b1.bytes[tix++] = 't'; + continue; + case '\n': + b1.bytes[tix++] = '\\'; + b1.bytes[tix++] = 'n'; + continue; + case '\r': + b1.bytes[tix++] = '\\'; + b1.bytes[tix++] = 'r'; + continue; + case '\f': + b1.bytes[tix++] = '\\'; + b1.bytes[tix++] = 'f'; + continue; + } + b1.bytes[tix++] = (byte)c; + } + b1.realSize = tix; + return b1; + } + + + /** rb_reg_nth_match + * + */ + public static IRubyObject nth_match(int nth, IRubyObject match) { + if (match.isNil()) return match; + RubyMatchData m = (RubyMatchData)match; + + int start, end; + + if (m.regs == null) { + if (nth >= 1) return match.getRuntime().getNil(); + if (nth < 0 && ++nth <= 0) return match.getRuntime().getNil(); + start = m.begin; + end = m.end; + } else { + if (nth >= m.regs.numRegs) return match.getRuntime().getNil(); + if (nth < 0 && (nth+=m.regs.numRegs) <= 0) return match.getRuntime().getNil(); + start = m.regs.beg[nth]; + end = m.regs.end[nth]; + } + + if (start == -1) return match.getRuntime().getNil(); + + RubyString str = m.str.makeShared(match.getRuntime(), start, end - start); + str.infectBy(match); + return str; + } + + /** rb_reg_last_match + * + */ + public static IRubyObject last_match(IRubyObject match) { + return nth_match(0, match); + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public static IRubyObject last_match_s(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + switch (args.length) { + case 0: + return last_match_s(context, recv); + case 1: + return last_match_s(context, recv, args[0]); + default: + Arity.raiseArgumentError(recv.getRuntime(), args.length, 0, 1); + return null; // not reached + } + } + + /** rb_reg_s_last_match / match_getter + * + */ + @JRubyMethod(name = "last_match", meta = true, reads = BACKREF) + public static IRubyObject last_match_s(ThreadContext context, IRubyObject recv) { + IRubyObject match = context.getCurrentFrame().getBackRef(); + if (match instanceof RubyMatchData) ((RubyMatchData)match).use(); + return match; + } + + /** rb_reg_s_last_match + * + */ + @JRubyMethod(name = "last_match", meta = true, reads = BACKREF) + public static IRubyObject last_match_s(ThreadContext context, IRubyObject recv, IRubyObject nth) { + IRubyObject match = context.getCurrentFrame().getBackRef(); + if (match.isNil()) return match; + return nth_match(((RubyMatchData)match).backrefNumber(nth), match); + } + + /** rb_reg_match_pre + * + */ + public static IRubyObject match_pre(IRubyObject match) { + if (match.isNil()) return match; + RubyMatchData m = (RubyMatchData)match; + + int beg = m.regs == null ? m.begin : m.regs.beg[0]; + + if(beg == -1) match.getRuntime().getNil(); + + RubyString str = m.str.makeShared(match.getRuntime(), 0, beg); + str.infectBy(match); + return str; + } + + /** rb_reg_match_post + * + */ + public static IRubyObject match_post(IRubyObject match) { + if (match.isNil()) return match; + RubyMatchData m = (RubyMatchData)match; + + int end; + if (m.regs == null) { + if (m.begin == -1) return match.getRuntime().getNil(); + end = m.end; + } else { + if (m.regs.beg[0] == -1) return match.getRuntime().getNil(); + end = m.regs.end[0]; + } + + RubyString str = m.str.makeShared(match.getRuntime(), end, m.str.getByteList().realSize - end); + str.infectBy(match); + return str; + } + + /** rb_reg_match_last + * + */ + public static IRubyObject match_last(IRubyObject match) { + if (match.isNil()) return match; + RubyMatchData m = (RubyMatchData)match; + + if (m.regs == null || m.regs.beg[0] == -1) return match.getRuntime().getNil(); + + int i; + for (i=m.regs.numRegs-1; m.regs.beg[i]==-1 && i>0; i--); + if (i == 0) return match.getRuntime().getNil(); + + return nth_match(i,match); + } + + /** rb_reg_s_union + * + */ + @JRubyMethod(name = "union", rest = true, meta = true) + public static IRubyObject union(ThreadContext context, IRubyObject recv, IRubyObject[] args) { + if (args.length == 0) { + return newRegexp(recv.getRuntime(), ByteList.create("(?!)"), 0, false); + } else if (args.length == 1) { + IRubyObject v = TypeConverter.convertToTypeWithCheck(args[0], recv.getRuntime().getRegexp(), 0, "to_regexp"); + if(!v.isNil()) { + return v; + } else { + // newInstance here + return newRegexp(recv.getRuntime(), quote(recv,args).getByteList(), 0, false); + } + } else { + KCode kcode = null; + IRubyObject kcode_re = recv.getRuntime().getNil(); + RubyString source = recv.getRuntime().newString(); + IRubyObject[] _args = new IRubyObject[3]; + + for (int i = 0; i < args.length; i++) { + if (0 < i) { + source.cat((byte)'|'); + } + IRubyObject v = TypeConverter.convertToTypeWithCheck(args[i], recv.getRuntime().getRegexp(), 0, "to_regexp"); + if (!v.isNil()) { + if (!((RubyRegexp)v).isKCodeDefault()) { + if (kcode == null) { + kcode_re = v; + kcode = ((RubyRegexp)v).kcode; + } else if (((RubyRegexp)v).kcode != kcode) { + IRubyObject str1 = kcode_re.inspect(); + IRubyObject str2 = v.inspect(); + throw recv.getRuntime().newArgumentError("mixed kcode " + str1 + " and " + str2); + } + } + v = ((RubyRegexp)v).to_s(); + } else { + v = quote(recv, new IRubyObject[]{args[i]}); + } + source.append(v); + } + + _args[0] = source; + _args[1] = recv.getRuntime().getNil(); + if (kcode == null) { + _args[2] = recv.getRuntime().getNil(); + } else if (kcode == KCode.NONE) { + _args[2] = recv.getRuntime().newString("n"); + } else if (kcode == KCode.EUC) { + _args[2] = recv.getRuntime().newString("e"); + } else if (kcode == KCode.SJIS) { + _args[2] = recv.getRuntime().newString("s"); + } else if (kcode == KCode.UTF8) { + _args[2] = recv.getRuntime().newString("u"); + } + return recv.callMethod(context, "new", _args); + } + } + + /** rb_reg_names + * + */ + @JRubyMethod(name = "names", compat = CompatVersion.RUBY1_9) + public IRubyObject names() { + if (pattern.numberOfNames() == 0) return getRuntime().newEmptyArray(); + + RubyArray ary = getRuntime().newArray(pattern.numberOfNames()); + for (Iterator<NameEntry> i = pattern.namedBackrefIterator(); i.hasNext();) { + NameEntry e = i.next(); + ary.append(RubyString.newStringShared(getRuntime(), e.name, e.nameP, e.nameEnd - e.nameP)); + } + return ary; + } + + /** rb_reg_named_captures + * + */ + @JRubyMethod(name = "named_captures", compat = CompatVersion.RUBY1_9) + public IRubyObject named_captures(ThreadContext context) { + RubyHash hash = RubyHash.newHash(getRuntime()); + if (pattern.numberOfNames() == 0) return hash; + + for (Iterator<NameEntry> i = pattern.namedBackrefIterator(); i.hasNext();) { + NameEntry e = i.next(); + int[]backrefs = e.getBackRefs(); + RubyArray ary = getRuntime().newArray(backrefs.length); + + for (int backref : backrefs) ary.append(RubyFixnum.newFixnum(getRuntime(), backref)); + hash.fastASet(RubyString.newStringShared(getRuntime(), e.name, e.nameP, e.nameEnd - e.nameP).freeze(context), ary); + } + return hash; + } + + public static RubyRegexp unmarshalFrom(UnmarshalStream input) throws java.io.IOException { + RubyRegexp result = newRegexp(input.getRuntime(), input.unmarshalString(), input.unmarshalInt(), false); + input.registerLinkTarget(result); + return result; + } + + public static void marshalTo(RubyRegexp regexp, MarshalStream output) throws java.io.IOException { + output.registerLinkTarget(regexp); + output.writeString(new String(regexp.str.bytes,regexp.str.begin,regexp.str.realSize)); + output.writeInt(regexp.pattern.getOptions() & EMBEDDABLE); + } +} + +package org.jruby; + +import org.jruby.runtime.builtin.IRubyObject; + +/** + * + * @author nicksieger + */ +public interface RubyRuntimeAdapter { + IRubyObject eval(Ruby runtime, String script); +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyModule; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Block; +import org.jruby.runtime.CallType; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import org.jruby.util.SignalFacade; +import org.jruby.util.NoFunctionalitySignalFacade; + +@JRubyModule(name="Signal") +public class RubySignal { + private final static SignalFacade SIGNALS = getSignalFacade(); + + private final static SignalFacade getSignalFacade() { + try { + Class realFacadeClass = Class.forName("org.jruby.util.SunSignalFacade"); + return (SignalFacade)realFacadeClass.newInstance(); + } catch(Throwable e) { + return new NoFunctionalitySignalFacade(); + } + } + + // NOTE: The indicies here match exactly the signal values; do not reorder + public static final String[] NAMES = { + "EXIT", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "EMT", + "FPE", "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "URG", + "STOP", "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", + "XFSZ", "VTALRM", "PROF", "WINCH", "INFO", "USR1", "USR2"}; + + public static void createSignal(Ruby runtime) { + RubyModule mSignal = runtime.defineModule("Signal"); + + mSignal.defineAnnotatedMethods(RubySignal.class); + } + + @JRubyMethod(name = "trap", required = 1, optional = 1, frame = true, meta = true) + public static IRubyObject trap(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = recv.getRuntime(); + runtime.getLoadService().require("jsignal"); + return RuntimeHelpers.invoke(context, runtime.getKernel(), "__jtrap", args, block); + } + + @JRubyMethod(name = "list", meta = true) + public static IRubyObject list(ThreadContext context, IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + RubyHash names = RubyHash.newHash(runtime); + for (int i = 0; i < NAMES.length; i++) { + names.op_aset(context, runtime.newString(NAMES[i]), runtime.newFixnum(i)); + } + // IOT is also 6 + names.op_aset(context, runtime.newString("IOT"), runtime.newFixnum(6)); + // CLD is also 20 + names.op_aset(context, runtime.newString("CLD"), runtime.newFixnum(20)); + return names; + } + + @JRubyMethod(name = "__jtrap_kernel", required = 3,meta = true) + public static IRubyObject __jtrap_kernel(final IRubyObject recv, IRubyObject arg1, IRubyObject arg2, IRubyObject arg3) { + return SIGNALS.trap(recv, arg1, arg2, arg3); + } +}// RubySignal +/* + **** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2004 David Corbin <dcorbin@users.sourceforge.net> + * Copyright (C) 2005 Tim Azzopardi <tim@tigerfive.com> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2006 Ola Bini <ola@ologix.com> + * Copyright (C) 2007 Nick Sieger <nicksieger@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import static org.jruby.anno.FrameField.BACKREF; +import static org.jruby.anno.FrameField.LASTLINE; + +import java.io.UnsupportedEncodingException; +import java.util.Locale; + +import org.joni.Matcher; +import org.joni.Option; +import org.joni.Regex; +import org.joni.Region; +import org.joni.encoding.Encoding; +import org.joni.encoding.specific.ASCIIEncoding; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.exceptions.RaiseException; +import org.jruby.java.MiniJava; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.Frame; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.ByteList; +import org.jruby.util.Numeric; +import org.jruby.util.Pack; +import org.jruby.util.Sprintf; +import org.jruby.util.string.JavaCrypt; + +/** + * Implementation of Ruby String class + * + * Concurrency: no synchronization is required among readers, but + * all users must synchronize externally with writers. + * + */ +@JRubyClass(name="String", include={"Enumerable", "Comparable"}) +public class RubyString extends RubyObject { + private static final ASCIIEncoding ASCII = ASCIIEncoding.INSTANCE; + + // string doesn't share any resources + private static final int SHARE_LEVEL_NONE = 0; + // string has it's own ByteList, but it's pointing to a shared buffer (byte[]) + private static final int SHARE_LEVEL_BUFFER = 1; + // string doesn't have it's own ByteList (values) + private static final int SHARE_LEVEL_BYTELIST = 2; + + private volatile int shareLevel = SHARE_LEVEL_NONE; + + private ByteList value; + + private static ObjectAllocator STRING_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return RubyString.newEmptyString(runtime, klass); + } + }; + + public static RubyClass createStringClass(Ruby runtime) { + RubyClass stringClass = runtime.defineClass("String", runtime.getObject(), STRING_ALLOCATOR); + runtime.setString(stringClass); + stringClass.index = ClassIndex.STRING; + stringClass.kindOf = new RubyModule.KindOf() { + @Override + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubyString; + } + }; + + stringClass.includeModule(runtime.getComparable()); + stringClass.includeModule(runtime.getEnumerable()); + stringClass.defineAnnotatedMethods(RubyString.class); + + return stringClass; + } + + /** short circuit for String key comparison + * + */ + @Override + public final boolean eql(IRubyObject other) { + if (other.getMetaClass() == getRuntime().getString()) return value.equal(((RubyString)other).value); + return super.eql(other); + } + + private RubyString(Ruby runtime, RubyClass rubyClass, CharSequence value) { + super(runtime, rubyClass); + assert value != null; + this.value = new ByteList(ByteList.plain(value), false); + } + + private RubyString(Ruby runtime, RubyClass rubyClass, byte[] value) { + super(runtime, rubyClass); + assert value != null; + this.value = new ByteList(value); + } + + private RubyString(Ruby runtime, RubyClass rubyClass, ByteList value) { + super(runtime, rubyClass); + assert value != null; + this.value = value; + } + + private RubyString(Ruby runtime, RubyClass rubyClass, ByteList value, boolean objectSpace) { + super(runtime, rubyClass, objectSpace); + assert value != null; + this.value = value; + } + + + /** Create a new String which uses the same Ruby runtime and the same + * class like this String. + * + * This method should be used to satisfy RCR #38. + * @deprecated + */ + public RubyString newString(CharSequence s) { + return new RubyString(getRuntime(), getType(), s); + } + + /** Create a new String which uses the same Ruby runtime and the same + * class like this String. + * + * This method should be used to satisfy RCR #38. + * @deprecated + */ + public RubyString newString(ByteList s) { + return new RubyString(getRuntime(), getMetaClass(), s); + } + + // Methods of the String class (rb_str_*): + + /** rb_str_new2 + * + */ + public static RubyString newString(Ruby runtime, CharSequence str) { + return new RubyString(runtime, runtime.getString(), str); + } + + public static RubyString newEmptyString(Ruby runtime) { + return newEmptyString(runtime, runtime.getString()); + } + + public static RubyString newEmptyString(Ruby runtime, RubyClass metaClass) { + RubyString empty = new RubyString(runtime, metaClass, ByteList.EMPTY_BYTELIST); + empty.shareLevel = SHARE_LEVEL_BYTELIST; + return empty; + } + + public static RubyString newUnicodeString(Ruby runtime, String str) { + try { + return new RubyString(runtime, runtime.getString(), new ByteList(str.getBytes("UTF8"), false)); + } catch (UnsupportedEncodingException uee) { + return new RubyString(runtime, runtime.getString(), str); + } + } + + @Deprecated + public static RubyString newString(Ruby runtime, RubyClass clazz, CharSequence str) { + return new RubyString(runtime, clazz, str); + } + + public static RubyString newString(Ruby runtime, byte[] bytes) { + return new RubyString(runtime, runtime.getString(), bytes); + } + + public static RubyString newString(Ruby runtime, byte[] bytes, int start, int length) { + byte[] copy = new byte[length]; + System.arraycopy(bytes, start, copy, 0, length); + return new RubyString(runtime, runtime.getString(), new ByteList(copy, false)); + } + + public static RubyString newString(Ruby runtime, ByteList bytes) { + return new RubyString(runtime, runtime.getString(), bytes); + } + + public static RubyString newStringLight(Ruby runtime, ByteList bytes) { + return new RubyString(runtime, runtime.getString(), bytes, false); + } + + public static RubyString newStringShared(Ruby runtime, RubyString orig) { + orig.shareLevel = SHARE_LEVEL_BYTELIST; + RubyString str = new RubyString(runtime, runtime.getString(), orig.value); + str.shareLevel = SHARE_LEVEL_BYTELIST; + return str; + } + + public static RubyString newStringShared(Ruby runtime, ByteList bytes) { + return newStringShared(runtime, runtime.getString(), bytes); + } + + public static RubyString newStringShared(Ruby runtime, RubyClass clazz, ByteList bytes) { + RubyString str = new RubyString(runtime, clazz, bytes); + str.shareLevel = SHARE_LEVEL_BYTELIST; + return str; + } + + public static RubyString newStringShared(Ruby runtime, byte[] bytes, int start, int length) { + RubyString str = new RubyString(runtime, runtime.getString(), new ByteList(bytes, start, length, false)); + str.shareLevel = SHARE_LEVEL_BUFFER; + return str; + } + + @Override + public int getNativeTypeIndex() { + return ClassIndex.STRING; + } + + @Override + public Class getJavaClass() { + return String.class; + } + + @Override + public RubyString convertToString() { + return this; + } + + @Override + public String toString() { + return value.toString(); + } + + /** rb_str_dup + * + */ + @Deprecated + public final RubyString strDup() { + return strDup(getRuntime(), getMetaClass()); + } + + public final RubyString strDup(Ruby runtime) { + return strDup(runtime, getMetaClass()); + } + + @Deprecated + final RubyString strDup(RubyClass clazz) { + return strDup(getRuntime(), getMetaClass()); + } + + final RubyString strDup(Ruby runtime, RubyClass clazz) { + shareLevel = SHARE_LEVEL_BYTELIST; + RubyString dup = new RubyString(runtime, clazz, value); + dup.shareLevel = SHARE_LEVEL_BYTELIST; + + dup.infectBy(this); + return dup; + } + + public final RubyString makeShared(Ruby runtime, int index, int len) { + if (len == 0) { + RubyString s = newEmptyString(runtime, getMetaClass()); + s.infectBy(this); + return s; + } + + if (shareLevel == SHARE_LEVEL_NONE) shareLevel = SHARE_LEVEL_BUFFER; + RubyString shared = new RubyString(runtime, getMetaClass(), value.makeShared(index, len)); + shared.shareLevel = SHARE_LEVEL_BUFFER; + + shared.infectBy(this); + return shared; + } + + final void modifyCheck() { + if ((flags & FROZEN_F) != 0) throw getRuntime().newFrozenError("string"); + + if (!isTaint() && getRuntime().getSafeLevel() >= 4) { + throw getRuntime().newSecurityError("Insecure: can't modify string"); + } + } + + private final void modifyCheck(byte[] b, int len) { + if (value.bytes != b || value.realSize != len) throw getRuntime().newRuntimeError("string modified"); + } + + private final void frozenCheck() { + if (isFrozen()) throw getRuntime().newRuntimeError("string frozen"); + } + + /** rb_str_modify + * + */ + public final void modify() { + modifyCheck(); + + if (shareLevel != SHARE_LEVEL_NONE) { + if (shareLevel == SHARE_LEVEL_BYTELIST) { + value = value.dup(); + } else { + value.unshare(); + } + shareLevel = SHARE_LEVEL_NONE; + } + + value.invalidate(); + } + + /** rb_str_modify (with length bytes ensured) + * + */ + public final void modify(int length) { + modifyCheck(); + + if (shareLevel != SHARE_LEVEL_NONE) { + if (shareLevel == SHARE_LEVEL_BYTELIST) { + value = value.dup(length); + } else { + value.unshare(length); + } + shareLevel = SHARE_LEVEL_NONE; + } else { + value.ensure(length); + } + + value.invalidate(); + } + + private final void view(ByteList bytes) { + modifyCheck(); + + value = bytes; + shareLevel = SHARE_LEVEL_NONE; + } + + private final void view(byte[]bytes) { + modifyCheck(); + + value.replace(bytes); + shareLevel = SHARE_LEVEL_NONE; + + value.invalidate(); + } + + private final void view(int index, int len) { + modifyCheck(); + + if (shareLevel != SHARE_LEVEL_NONE) { + if (shareLevel == SHARE_LEVEL_BYTELIST) { + // if len == 0 then shared empty + value = value.makeShared(index, len); + shareLevel = SHARE_LEVEL_BUFFER; + } else { + value.view(index, len); + } + } else { + value.view(index, len); + // FIXME this below is temporary, but its much safer for COW (it prevents not shared Strings with begin != 0) + // this allows now e.g.: ByteList#set not to be begin aware + shareLevel = SHARE_LEVEL_BUFFER; + } + + value.invalidate(); + } + + public static String bytesToString(byte[] bytes, int beg, int len) { + return new String(ByteList.plain(bytes, beg, len)); + } + + public static String byteListToString(ByteList bytes) { + return bytesToString(bytes.unsafeBytes(), bytes.begin(), bytes.length()); + } + + public static String bytesToString(byte[] bytes) { + return bytesToString(bytes, 0, bytes.length); + } + + public static byte[] stringToBytes(String string) { + return ByteList.plain(string); + } + + public static boolean isDigit(int c) { + return c >= '0' && c <= '9'; + } + + public static boolean isUpper(int c) { + return c >= 'A' && c <= 'Z'; + } + + public static boolean isLower(int c) { + return c >= 'a' && c <= 'z'; + } + + public static boolean isLetter(int c) { + return isUpper(c) || isLower(c); + } + + public static boolean isAlnum(int c) { + return isUpper(c) || isLower(c) || isDigit(c); + } + + public static boolean isPrint(int c) { + return c >= 0x20 && c <= 0x7E; + } + + @Override + public RubyString asString() { + return this; + } + + @Override + public IRubyObject checkStringType() { + return this; + } + + @JRubyMethod(name = {"to_s", "to_str"}) + @Override + public IRubyObject to_s() { + Ruby runtime = getRuntime(); + if (getMetaClass().getRealClass() != runtime.getString()) { + return strDup(runtime, runtime.getString()); + } + return this; + } + + /* rb_str_cmp_m */ + @JRubyMethod(name = "<=>", required = 1) + public IRubyObject op_cmp(ThreadContext context, IRubyObject other) { + if (other instanceof RubyString) { + return context.getRuntime().newFixnum(op_cmp((RubyString)other)); + } + + // deal with case when "other" is not a string + if (other.respondsTo("to_str") && other.respondsTo("<=>")) { + IRubyObject result = other.callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", this); + + if (result instanceof RubyNumeric) { + return ((RubyNumeric) result).op_uminus(context); + } + } + + return context.getRuntime().getNil(); + } + + /** + * + */ + @JRubyMethod(name = "==", required = 1) + @Override + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + Ruby runtime = context.getRuntime(); + + if (this == other) return runtime.getTrue(); + + if (!(other instanceof RubyString)) { + if (!other.respondsTo("to_str")) return runtime.getFalse(); + + return other.callMethod(context, MethodIndex.EQUALEQUAL, "==", this).isTrue() ? runtime.getTrue() : runtime.getFalse(); + } + return value.equal(((RubyString)other).value) ? runtime.getTrue() : runtime.getFalse(); + } + + @JRubyMethod(name = "+", required = 1) + public IRubyObject op_plus(ThreadContext context, IRubyObject other) { + RubyString str = other.convertToString(); + + ByteList result = new ByteList(value.realSize + str.value.realSize); + result.realSize = value.realSize + str.value.realSize; + System.arraycopy(value.bytes, value.begin, result.bytes, 0, value.realSize); + System.arraycopy(str.value.bytes, str.value.begin, result.bytes, value.realSize, str.value.realSize); + + RubyString resultStr = newString(context.getRuntime(), result); + if (isTaint() || str.isTaint()) resultStr.setTaint(true); + return resultStr; + } + + @JRubyMethod(name = "*", required = 1) + public IRubyObject op_mul(ThreadContext context, IRubyObject other) { + RubyInteger otherInteger = (RubyInteger) other.convertToInteger(); + long len = otherInteger.getLongValue(); + + if (len < 0) throw context.getRuntime().newArgumentError("negative argument"); + + // we limit to int because ByteBuffer can only allocate int sizes + if (len > 0 && Integer.MAX_VALUE / len < value.length()) { + throw context.getRuntime().newArgumentError("argument too big"); + } + ByteList newBytes = new ByteList(value.length() * (int)len); + + for (int i = 0; i < len; i++) { + newBytes.append(value); + } + + RubyString newString = new RubyString(context.getRuntime(), getMetaClass(), newBytes); + newString.setTaint(isTaint()); + return newString; + } + + @JRubyMethod(name = "%", required = 1) + public IRubyObject op_format(ThreadContext context, IRubyObject arg) { + final RubyString s; + + IRubyObject tmp = arg.checkArrayType(); + if (tmp.isNil()) { + tmp = arg; + } + + // FIXME: Should we make this work with platform's locale, + // or continue hardcoding US? + s = Sprintf.sprintf(context.getRuntime(), Locale.US, value, tmp); + + s.infectBy(this); + return s; + } + + @JRubyMethod(name = "hash") + @Override + public RubyFixnum hash() { + return getRuntime().newFixnum(value.hashCode()); + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + + if (other instanceof RubyString) { + RubyString string = (RubyString) other; + + if (string.value.equal(value)) return true; + } + + return false; + } + + /** rb_obj_as_string + * + */ + public static RubyString objAsString(ThreadContext context, IRubyObject obj) { + if (obj instanceof RubyString) return (RubyString) obj; + + IRubyObject str = obj.callMethod(context, MethodIndex.TO_S, "to_s"); + + if (!(str instanceof RubyString)) return (RubyString) obj.anyToString(); + + if (obj.isTaint()) str.setTaint(true); + + return (RubyString) str; + } + + /** rb_str_cmp + * + */ + public int op_cmp(RubyString other) { + return value.cmp(other.value); + } + + /** rb_to_id + * + */ + @Override + public String asJavaString() { + // TODO: This used to intern; but it didn't appear to change anything + // turning that off, and it's unclear if it was needed. Plus, we intern + // + return toString(); + } + + public IRubyObject doClone(){ + return newString(getRuntime(), value.dup()); + } + + public RubyString cat(byte[] str) { + modify(value.realSize + str.length); + System.arraycopy(str, 0, value.bytes, value.begin + value.realSize, str.length); + value.realSize += str.length; + return this; + } + + public RubyString cat(byte[] str, int beg, int len) { + modify(value.realSize + len); + System.arraycopy(str, beg, value.bytes, value.begin + value.realSize, len); + value.realSize += len; + return this; + } + + public RubyString cat(ByteList str) { + modify(value.realSize + str.realSize); + System.arraycopy(str.bytes, str.begin, value.bytes, value.begin + value.realSize, str.realSize); + value.realSize += str.realSize; + return this; + } + + public RubyString cat(byte ch) { + modify(value.realSize + 1); + value.bytes[value.begin + value.realSize] = ch; + value.realSize++; + return this; + } + + /** rb_str_replace_m + * + */ + @JRubyMethod(name = {"replace", "initialize_copy"}, required = 1) + public RubyString replace(IRubyObject other) { + if (this == other) return this; + + modifyCheck(); + + RubyString otherStr = stringValue(other); + + otherStr.shareLevel = shareLevel = SHARE_LEVEL_BYTELIST; + + value = otherStr.value; + + infectBy(other); + return this; + } + + @JRubyMethod(name = "reverse") + public RubyString reverse(ThreadContext context) { + if (value.length() <= 1) return strDup(context.getRuntime()); + + ByteList buf = new ByteList(value.length()+2); + buf.realSize = value.length(); + int src = value.length() - 1; + int dst = 0; + + while (src >= 0) buf.set(dst++, value.get(src--)); + + RubyString rev = new RubyString(context.getRuntime(), getMetaClass(), buf); + rev.infectBy(this); + return rev; + } + + @JRubyMethod(name = "reverse!") + public RubyString reverse_bang() { + if (value.length() > 1) { + modify(); + for (int i = 0; i < (value.length() / 2); i++) { + byte b = (byte) value.get(i); + + value.set(i, value.get(value.length() - i - 1)); + value.set(value.length() - i - 1, b); + } + } + + return this; + } + + /** rb_str_s_new + * + */ + public static RubyString newInstance(IRubyObject recv, IRubyObject[] args, Block block) { + RubyString newString = newStringShared(recv.getRuntime(), ByteList.EMPTY_BYTELIST); + newString.setMetaClass((RubyClass) recv); + newString.callInit(args, block); + return newString; + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with zero or one arguments + */ + public IRubyObject initialize(IRubyObject[] args, Block unusedBlock) { + switch (args.length) { + case 0: + return this; + case 1: + return initialize(args[0]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 0, 1); + return null; // not reached + } + } + + @JRubyMethod(frame = true, visibility = Visibility.PRIVATE) + @Override + public IRubyObject initialize() { + return this; + } + + @JRubyMethod(frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject arg0) { + replace(arg0); + + return this; + } + + @JRubyMethod + public IRubyObject casecmp(IRubyObject other) { + int compare = value.caseInsensitiveCmp(stringValue(other).value); + return RubyFixnum.newFixnum(getRuntime(), compare); + } + + /** rb_str_match + * + */ + @JRubyMethod(name = "=~") + @Override + public IRubyObject op_match(ThreadContext context, IRubyObject other) { + if (other instanceof RubyRegexp) return ((RubyRegexp) other).op_match(context, this); + if (other instanceof RubyString) { + throw context.getRuntime().newTypeError("type mismatch: String given"); + } + return other.callMethod(context, "=~", this); + } + + /** rb_str_match2 + * + */ + @JRubyMethod(name = "~", reads = {LASTLINE, BACKREF}, writes = BACKREF) + public IRubyObject op_match2(ThreadContext context) { + return RubyRegexp.newRegexp(context.getRuntime(), value, 0, false).op_match2(context); + } + + /** + * String#match(pattern) + * + * rb_str_match_m + * + * @param pattern Regexp or String + */ + @JRubyMethod + public IRubyObject match(ThreadContext context, IRubyObject pattern) { + return getPattern(pattern, false).callMethod(context, "match", this); + } + + /** rb_str_capitalize + * + */ + @JRubyMethod + public IRubyObject capitalize(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.capitalize_bang(context); + return str; + } + + /** rb_str_capitalize_bang + * + */ + @JRubyMethod(name = "capitalize!") + public IRubyObject capitalize_bang(ThreadContext context) { + if (value.realSize == 0) { + modifyCheck(); + return context.getRuntime().getNil(); + } + + modify(); + + int s = value.begin; + int send = s + value.realSize; + byte[]buf = value.bytes; + + + + boolean modify = false; + + int c = buf[s] & 0xff; + if (ASCII.isLower(c)) { + buf[s] = (byte)ASCIIEncoding.asciiToUpper(c); + modify = true; + } + + while (++s < send) { + c = (char)(buf[s] & 0xff); + if (ASCII.isUpper(c)) { + buf[s] = (byte)ASCIIEncoding.asciiToLower(c); + modify = true; + } + } + + if (modify) return this; + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = ">=") + public IRubyObject op_ge(ThreadContext context, IRubyObject other) { + if (other instanceof RubyString) { + return context.getRuntime().newBoolean(op_cmp((RubyString) other) >= 0); + } + + return RubyComparable.op_ge(context, this, other); + } + + @JRubyMethod(name = ">") + public IRubyObject op_gt(ThreadContext context, IRubyObject other) { + if (other instanceof RubyString) { + return context.getRuntime().newBoolean(op_cmp((RubyString) other) > 0); + } + + return RubyComparable.op_gt(context, this, other); + } + + @JRubyMethod(name = "<=") + public IRubyObject op_le(ThreadContext context, IRubyObject other) { + if (other instanceof RubyString) { + return context.getRuntime().newBoolean(op_cmp((RubyString) other) <= 0); + } + + return RubyComparable.op_le(context, this, other); + } + + @JRubyMethod(name = "<") + public IRubyObject op_lt(ThreadContext context, IRubyObject other) { + if (other instanceof RubyString) { + return context.getRuntime().newBoolean(op_cmp((RubyString) other) < 0); + } + + return RubyComparable.op_lt(context, this, other); + } + + @JRubyMethod(name = "eql?") + public IRubyObject str_eql_p(ThreadContext context, IRubyObject other) { + if (!(other instanceof RubyString)) return context.getRuntime().getFalse(); + RubyString otherString = (RubyString)other; + return value.equal(otherString.value) ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + /** rb_str_upcase + * + */ + @JRubyMethod + public RubyString upcase(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.upcase_bang(context); + return str; + } + + /** rb_str_upcase_bang + * + */ + @JRubyMethod(name = "upcase!") + public IRubyObject upcase_bang(ThreadContext context) { + if (value.realSize == 0) { + modifyCheck(); + return context.getRuntime().getNil(); + } + + modify(); + + int s = value.begin; + int send = s + value.realSize; + byte []buf = value.bytes; + + boolean modify = false; + while (s < send) { + int c = buf[s] & 0xff; + if (ASCII.isLower(c)) { + buf[s] = (byte)ASCIIEncoding.asciiToUpper(c); + modify = true; + } + s++; + } + + if (modify) return this; + return context.getRuntime().getNil(); + } + + /** rb_str_downcase + * + */ + @JRubyMethod + public RubyString downcase(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.downcase_bang(context); + return str; + } + + /** rb_str_downcase_bang + * + */ + @JRubyMethod(name = "downcase!") + public IRubyObject downcase_bang(ThreadContext context) { + if (value.realSize == 0) { + modifyCheck(); + return context.getRuntime().getNil(); + } + + modify(); + + int s = value.begin; + int send = s + value.realSize; + byte []buf = value.bytes; + + boolean modify = false; + while (s < send) { + int c = buf[s] & 0xff; + if (ASCII.isUpper(c)) { + buf[s] = (byte)ASCIIEncoding.asciiToLower(c); + modify = true; + } + s++; + } + + if (modify) return this; + return context.getRuntime().getNil(); + } + + /** rb_str_swapcase + * + */ + @JRubyMethod + public RubyString swapcase(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.swapcase_bang(context); + return str; + } + + /** rb_str_swapcase_bang + * + */ + @JRubyMethod(name = "swapcase!") + public IRubyObject swapcase_bang(ThreadContext context) { + if (value.realSize == 0) { + modifyCheck(); + return context.getRuntime().getNil(); + } + + modify(); + + int s = value.begin; + int send = s + value.realSize; + byte[]buf = value.bytes; + + boolean modify = false; + while (s < send) { + int c = buf[s] & 0xff; + if (ASCII.isUpper(c)) { + buf[s] = (byte)ASCIIEncoding.asciiToLower(c); + modify = true; + } else if (ASCII.isLower(c)) { + buf[s] = (byte)ASCIIEncoding.asciiToUpper(c); + modify = true; + } + s++; + } + + if (modify) return this; + return context.getRuntime().getNil(); + } + + /** rb_str_dump + * + */ + @JRubyMethod + public IRubyObject dump() { + RubyString s = new RubyString(getRuntime(), getMetaClass(), inspectIntoByteList(true)); + s.infectBy(this); + return s; + } + + @JRubyMethod + public IRubyObject insert(ThreadContext context, IRubyObject indexArg, IRubyObject stringArg) { + // MRI behavior: first check for ability to convert to String... + RubyString s = (RubyString)stringArg.convertToString(); + ByteList insert = s.value; + + // ... and then the index + int index = (int) indexArg.convertToInteger().getLongValue(); + if (index < 0) index += value.length() + 1; + + if (index < 0 || index > value.length()) { + throw context.getRuntime().newIndexError("index " + index + " out of range"); + } + + modify(); + + value.unsafeReplace(index, 0, insert); + this.infectBy(s); + return this; + } + + /** rb_str_inspect + * + */ + @JRubyMethod + @Override + public IRubyObject inspect() { + RubyString s = getRuntime().newString(inspectIntoByteList(false)); + s.infectBy(this); + return s; + } + + private ByteList inspectIntoByteList(boolean ignoreKCode) { + Ruby runtime = getRuntime(); + Encoding enc = runtime.getKCode().getEncoding(); + final int length = value.length(); + ByteList sb = new ByteList(length + 2 + length / 100); + + sb.append('\"'); + + for (int i = 0; i < length; i++) { + int c = value.get(i) & 0xFF; + + if (!ignoreKCode) { + int seqLength = enc.length((byte)c); + + if (seqLength > 1 && (i + seqLength -1 < length)) { + // don't escape multi-byte characters, leave them as bytes + sb.append(value, i, seqLength); + i += seqLength - 1; + continue; + } + } + + if (isAlnum(c)) { + sb.append((char)c); + } else if (c == '\"' || c == '\\') { + sb.append('\\').append((char)c); + } else if (c == '#' && isEVStr(i, length)) { + sb.append('\\').append((char)c); + } else if (isPrint(c)) { + sb.append((char)c); + } else if (c == '\n') { + sb.append('\\').append('n'); + } else if (c == '\r') { + sb.append('\\').append('r'); + } else if (c == '\t') { + sb.append('\\').append('t'); + } else if (c == '\f') { + sb.append('\\').append('f'); + } else if (c == '\u000B') { + sb.append('\\').append('v'); + } else if (c == '\u0007') { + sb.append('\\').append('a'); + } else if (c == '\u0008') { + sb.append('\\').append('b'); + } else if (c == '\u001B') { + sb.append('\\').append('e'); + } else { + sb.append(ByteList.plain(Sprintf.sprintf(runtime,"\\%03o",c))); + } + } + + sb.append('\"'); + return sb; + } + + private boolean isEVStr(int i, int length) { + if (i+1 >= length) return false; + int c = value.get(i+1) & 0xFF; + + return c == '$' || c == '@' || c == '{'; + } + + /** rb_str_length + * + */ + @JRubyMethod(name = {"length", "size"}) + public RubyFixnum length() { + return getRuntime().newFixnum(value.length()); + } + + /** rb_str_empty + * + */ + @JRubyMethod(name = "empty?") + public RubyBoolean empty_p(ThreadContext context) { + return isEmpty() ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + public boolean isEmpty() { + return value.length() == 0; + } + + /** rb_str_append + * + */ + public RubyString append(IRubyObject other) { + infectBy(other); + return cat(stringValue(other).value); + } + + /** rb_str_concat + * + */ + @JRubyMethod(name = {"concat", "<<"}) + public RubyString concat(IRubyObject other) { + if (other instanceof RubyFixnum) { + long value = ((RubyFixnum) other).getLongValue(); + if (value >= 0 && value < 256) return cat((byte) value); + } + return append(other); + } + + /** rb_str_crypt + * + */ + @JRubyMethod(name = "crypt") + public RubyString crypt(ThreadContext context, IRubyObject other) { + ByteList salt = stringValue(other).getByteList(); + if (salt.realSize < 2) { + throw context.getRuntime().newArgumentError("salt too short(need >=2 bytes)"); + } + + salt = salt.makeShared(0, 2); + RubyString s = RubyString.newStringShared(context.getRuntime(), JavaCrypt.crypt(salt, this.getByteList())); + s.infectBy(this); + s.infectBy(other); + return s; + } + + /* RubyString aka rb_string_value */ + public static RubyString stringValue(IRubyObject object) { + return (RubyString) (object instanceof RubyString ? object : + object.convertToString()); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two args. + */ + public IRubyObject sub(ThreadContext context, IRubyObject[] args, Block block) { + RubyString str = strDup(context.getRuntime()); + str.sub_bang(context, args, block); + return str; + } + + /** rb_str_sub + * + */ + @JRubyMethod(name = "sub", frame = true) + public IRubyObject sub(ThreadContext context, IRubyObject arg0, Block block) { + RubyString str = strDup(context.getRuntime()); + str.sub_bang(context, arg0, block); + return str; + } + + /** rb_str_sub + * + */ + @JRubyMethod(name = "sub", frame = true) + public IRubyObject sub(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + RubyString str = strDup(context.getRuntime()); + str.sub_bang(context, arg0, arg1, block); + return str; + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two arguments. + */ + public IRubyObject sub_bang(ThreadContext context, IRubyObject[] args, Block block) { + switch (args.length) { + case 1: + return sub_bang(context, args[0], block); + case 2: + return sub_bang(context, args[0], args[1], block); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_sub_bang + * + */ + @JRubyMethod(name = "sub!", frame = true, reads = BACKREF, writes = BACKREF) + public IRubyObject sub_bang(ThreadContext context, IRubyObject arg0, Block block) { + if (block.isGiven()) { + RubyRegexp rubyRegex = getPattern(arg0, true); + Regex regex = rubyRegex.getPattern(); + return subBangCommon(regex, context, true, rubyRegex, block, null, false); + } else { + throw context.getRuntime().newArgumentError("wrong number of arguments (1 for 2)"); + } + } + + /** rb_str_sub_bang + * + */ + @JRubyMethod(name = "sub!", frame = true, reads = BACKREF, writes = BACKREF) + public IRubyObject sub_bang(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + RubyString repl = arg1.convertToString(); + RubyRegexp rubyRegex = getPattern(arg0, true); + Regex regex = rubyRegex.getPattern(); + return subBangCommon(regex, context, false, rubyRegex, block, repl, repl.isTaint()); + } + + private IRubyObject subBangCommon(Regex regex, ThreadContext context, final boolean iter, RubyRegexp rubyRegex, Block block, RubyString repl, boolean tainted) { + + int range = value.begin + value.realSize; + Matcher matcher = regex.matcher(value.bytes, value.begin, range); + + Frame frame = context.getPreviousFrame(); + if (matcher.search(value.begin, range, Option.NONE) >= 0) { + if (iter) { + byte[] bytes = value.bytes; + int size = value.realSize; + RubyMatchData match = rubyRegex.updateBackRef(context, this, frame, matcher); + match.use(); + if (regex.numberOfCaptures() == 0) { + repl = objAsString(context, block.yield(context, substr(matcher.getBegin(), matcher.getEnd() - matcher.getBegin()))); + } else { + Region region = matcher.getRegion(); + repl = objAsString(context, block.yield(context, substr(region.beg[0], region.end[0] - region.beg[0]))); + } + modifyCheck(bytes, size); + frozenCheck(); + frame.setBackRef(match); + } else { + repl = rubyRegex.regsub(repl, this, matcher); + rubyRegex.updateBackRef(context, this, frame, matcher); + } + + final int beg; + final int plen; + if (regex.numberOfCaptures() == 0) { + beg = matcher.getBegin(); + plen = matcher.getEnd() - beg; + } else { + Region region = matcher.getRegion(); + beg = region.beg[0]; + plen = region.end[0] - beg; + } + + ByteList replValue = repl.value; + if (replValue.realSize > plen) { + modify(value.realSize + replValue.realSize - plen); + } else { + modify(); + } + if (repl.isTaint()) { + tainted = true; + } + if (replValue.realSize != plen) { + int src = value.begin + beg + plen; + int dst = value.begin + beg + replValue.realSize; + int length = value.realSize - beg - plen; + System.arraycopy(value.bytes, src, value.bytes, dst, length); + } + System.arraycopy(replValue.bytes, replValue.begin, value.bytes, value.begin + beg, replValue.realSize); + value.realSize += replValue.realSize - plen; + if (tainted) { + setTaint(true); + } + return this; + } else { + frame.setBackRef(context.getRuntime().getNil()); + return context.getRuntime().getNil(); + } + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two arguments. + */ + public IRubyObject gsub(ThreadContext context, IRubyObject[] args, Block block) { + switch (args.length) { + case 1: + return gsub(context, args[0], block); + case 2: + return gsub(context, args[0], args[1], block); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_gsub + * + */ + @JRubyMethod(name = "gsub", frame = true, reads = BACKREF, writes = BACKREF) + public IRubyObject gsub(ThreadContext context, IRubyObject arg0, Block block) { + return gsub(context, arg0, block, false); + } + + /** rb_str_gsub + * + */ + @JRubyMethod(name = "gsub", frame = true, reads = BACKREF, writes = BACKREF) + public IRubyObject gsub(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + return gsub(context, arg0, arg1, block, false); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two arguments. + */ + public IRubyObject gsub_bang(ThreadContext context, IRubyObject[] args, Block block) { + switch (args.length) { + case 1: + return gsub_bang(context, args[0], block); + case 2: + return gsub_bang(context, args[0], args[1], block); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_gsub_bang + * + */ + @JRubyMethod(name = "gsub!", frame = true, reads = BACKREF, writes = BACKREF) + public IRubyObject gsub_bang(ThreadContext context, IRubyObject arg0, Block block) { + return gsub(context, arg0, block, true); + } + + /** rb_str_gsub_bang + * + */ + @JRubyMethod(name = "gsub!", frame = true, reads = BACKREF, writes = BACKREF) + public IRubyObject gsub_bang(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) { + return gsub(context, arg0, arg1, block, true); + } + + private final IRubyObject gsub(ThreadContext context, IRubyObject arg0, Block block, final boolean bang) { + if (block.isGiven()) { + RubyRegexp rubyRegex = getPattern(arg0, true); + Regex regex = rubyRegex.getPattern(); + return gsubCommon(regex, context, bang, true, rubyRegex, block, null, false); + } else { + throw context.getRuntime().newArgumentError("wrong number of arguments (1 for 2)"); + } + } + + private final IRubyObject gsub(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block, final boolean bang) { + IRubyObject repl = arg1.convertToString(); + RubyRegexp rubyRegex = getPattern(arg0, true); + Regex regex = rubyRegex.getPattern(); + return gsubCommon(regex, context, bang, false, rubyRegex, block, repl, repl.isTaint()); + } + + private IRubyObject gsubCommon(Regex regex, ThreadContext context, final boolean bang, final boolean iter, RubyRegexp rubyRegex, Block block, IRubyObject repl, boolean tainted) { + + int begin = value.begin; + int range = begin + value.realSize; + Matcher matcher = regex.matcher(value.bytes, begin, range); + + int beg = matcher.search(begin, range, Option.NONE); + + Frame frame = context.getPreviousFrame(); + + if (beg < 0) { + frame.setBackRef(context.getRuntime().getNil()); + return bang ? context.getRuntime().getNil() : strDup(context.getRuntime()); /* bang: true, no match, no substitution */ + } + + int blen = value.realSize + 30; /* len + margin */ + ByteList dest = new ByteList(blen); + dest.realSize = blen; + int buf = 0; + int bp = 0; + int cp = value.begin; + + int offset = 0; + RubyString val; + + RubyMatchData match = null; + while (beg >= 0) { + final int begz; + final int endz; + if (iter) { + byte[] bytes = value.bytes; + int size = value.realSize; + match = rubyRegex.updateBackRef(context, this, frame, matcher); + match.use(); + if (regex.numberOfCaptures() == 0) { + begz = matcher.getBegin(); + endz = matcher.getEnd(); + val = objAsString(context, block.yield(context, substr(context.getRuntime(), begz, endz - begz))); + } else { + Region region = matcher.getRegion(); + begz = region.beg[0]; + endz = region.end[0]; + val = objAsString(context, block.yield(context, substr(context.getRuntime(), begz, endz - begz))); + } + modifyCheck(bytes, size); + if (bang) { + frozenCheck(); + } + } else { + val = rubyRegex.regsub((RubyString) repl, this, matcher); + if (regex.numberOfCaptures() == 0) { + begz = matcher.getBegin(); + endz = matcher.getEnd(); + } else { + Region region = matcher.getRegion(); + begz = region.beg[0]; + endz = region.end[0]; + } + } + + if (val.isTaint()) { + tainted = true; + } + ByteList vbuf = val.value; + int len = (bp - buf) + (beg - offset) + vbuf.realSize + 3; + if (blen < len) { + while (blen < len) { + blen <<= 1; + } + len = bp - buf; + dest.realloc(blen); + dest.realSize = blen; + bp = buf + len; + } + len = beg - offset; /* copy pre-match substr */ + System.arraycopy(value.bytes, cp, dest.bytes, bp, len); + bp += len; + System.arraycopy(vbuf.bytes, vbuf.begin, dest.bytes, bp, vbuf.realSize); + bp += vbuf.realSize; + offset = endz; + + if (begz == endz) { + if (value.realSize <= endz) { + break; + } + len = regex.getEncoding().length(value.bytes[begin + endz]); + System.arraycopy(value.bytes, begin + endz, dest.bytes, bp, len); + bp += len; + offset = endz + len; + } + cp = begin + offset; + if (offset > value.realSize) { + break; + } + beg = matcher.search(cp, range, Option.NONE); + } + + if (value.realSize > offset) { + int len = bp - buf; + if (blen - len < value.realSize - offset) { + blen = len + value.realSize - offset; + dest.realloc(blen); + bp = buf + len; + } + System.arraycopy(value.bytes, cp, dest.bytes, bp, value.realSize - offset); + bp += value.realSize - offset; + } + + if (match != null) { + frame.setBackRef(match); + } else { + rubyRegex.updateBackRef(context, this, frame, matcher); + } + + dest.realSize = bp - buf; + if (bang) { + view(dest); + if (tainted) { + setTaint(true); + } + return this; + } else { + RubyString destStr = new RubyString(context.getRuntime(), getMetaClass(), dest); + destStr.infectBy(this); + if (tainted) { + destStr.setTaint(true); + } + return destStr; + } + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two args. + */ + public IRubyObject index(ThreadContext context, IRubyObject[] args) { + switch (args.length) { + case 1: + return index(context, args[0]); + case 2: + return index(context, args[0], args[1]); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_index_m + * + */ + @JRubyMethod(reads = BACKREF, writes = BACKREF) + public IRubyObject index(ThreadContext context, IRubyObject arg0) { + return indexCommon(0, arg0, context); + } + + /** rb_str_index_m + * + */ + @JRubyMethod(reads = BACKREF, writes = BACKREF) + public IRubyObject index(ThreadContext context, IRubyObject arg0, IRubyObject arg1) { + int pos = RubyNumeric.num2int(arg1); + + if (pos < 0) { + pos += value.realSize; + if (pos < 0) { + if (arg0 instanceof RubyRegexp) { + context.getPreviousFrame().setBackRef(context.getRuntime().getNil()); + } + return context.getRuntime().getNil(); + } + } + + return indexCommon(pos, arg0, context); + } + + private IRubyObject indexCommon(int pos, IRubyObject sub, ThreadContext context) throws RaiseException { + if (sub instanceof RubyRegexp) { + RubyRegexp regSub = (RubyRegexp) sub; + + pos = regSub.adjustStartPos(this, pos, false); + pos = regSub.search(context, this, pos, false); + } else if (sub instanceof RubyFixnum) { + int c_int = RubyNumeric.fix2int(sub); + if (c_int < 0x00 || c_int > 0xFF) { + // out of byte range + // there will be no match for sure + return context.getRuntime().getNil(); + } + byte c = (byte) c_int; + byte[] bytes = value.bytes; + int end = value.begin + value.realSize; + + pos += value.begin; + for (; pos < end; pos++) { + if (bytes[pos] == c) { + return RubyFixnum.newFixnum(context.getRuntime(), pos - value.begin); + } + } + return context.getRuntime().getNil(); + } else if (sub instanceof RubyString) { + pos = strIndex((RubyString) sub, pos); + } else { + IRubyObject tmp = sub.checkStringType(); + + if (tmp.isNil()) { + throw context.getRuntime().newTypeError("type mismatch: " + sub.getMetaClass().getName() + " given"); + } + pos = strIndex((RubyString) tmp, pos); + } + + return pos == -1 ? context.getRuntime().getNil() : RubyFixnum.newFixnum(context.getRuntime(), pos); + } + + private int strIndex(RubyString sub, int offset) { + if (offset < 0) { + offset += value.realSize; + if (offset < 0) return -1; + } + + if (value.realSize - offset < sub.value.realSize) return -1; + if (sub.value.realSize == 0) return offset; + return value.indexOf(sub.value, offset); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two arguments. + */ + public IRubyObject rindex(ThreadContext context, IRubyObject[] args) { + switch (args.length) { + case 1: + return rindex(context, args[0]); + case 2: + return rindex(context, args[0], args[1]); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_rindex_m + * + */ + @JRubyMethod(reads = BACKREF, writes = BACKREF) + public IRubyObject rindex(ThreadContext context, IRubyObject arg0) { + return rindexCommon(arg0, value.realSize, context); + } + + /** rb_str_rindex_m + * + */ + @JRubyMethod(reads = BACKREF, writes = BACKREF) + public IRubyObject rindex(ThreadContext context, IRubyObject arg0, IRubyObject arg1) { + int pos = RubyNumeric.num2int(arg1); + + if (pos < 0) { + pos += value.realSize; + if (pos < 0) { + if (arg0 instanceof RubyRegexp) { + context.getPreviousFrame().setBackRef(context.getRuntime().getNil()); + } + return context.getRuntime().getNil(); + } + } + if (pos > value.realSize) pos = value.realSize; + + return rindexCommon(arg0, pos, context); + } + + private IRubyObject rindexCommon(final IRubyObject sub, int pos, ThreadContext context) throws RaiseException { + + if (sub instanceof RubyRegexp) { + RubyRegexp regSub = (RubyRegexp) sub; + if (regSub.length() > 0) { + pos = regSub.adjustStartPos(this, pos, true); + pos = regSub.search(context, this, pos, true); + } + if (pos >= 0) { + return RubyFixnum.newFixnum(context.getRuntime(), pos); + } + } else if (sub instanceof RubyString) { + pos = strRindex((RubyString) sub, pos); + if (pos >= 0) return RubyFixnum.newFixnum(context.getRuntime(), pos); + } else if (sub instanceof RubyFixnum) { + int c_int = RubyNumeric.fix2int(sub); + if (c_int < 0x00 || c_int > 0xFF) { + // out of byte range + // there will be no match for sure + return context.getRuntime().getNil(); + } + byte c = (byte) c_int; + + byte[] bytes = value.bytes; + int pbeg = value.begin; + int p = pbeg + pos; + + if (pos == value.realSize) { + if (pos == 0) { + return context.getRuntime().getNil(); + } + --p; + } + while (pbeg <= p) { + if (bytes[p] == c) { + return RubyFixnum.newFixnum(context.getRuntime(), p - value.begin); + } + p--; + } + return context.getRuntime().getNil(); + } else { + IRubyObject tmp = sub.checkStringType(); + if (tmp.isNil()) throw context.getRuntime().newTypeError("type mismatch: " + sub.getMetaClass().getName() + " given"); + pos = strRindex((RubyString) tmp, pos); + if (pos >= 0) return RubyFixnum.newFixnum(context.getRuntime(), pos); + } + + return context.getRuntime().getNil(); + } + + private int strRindex(RubyString sub, int pos) { + int subLength = sub.value.realSize; + + /* substring longer than string */ + if (value.realSize < subLength) return -1; + if (value.realSize - pos < subLength) pos = value.realSize - subLength; + + return value.lastIndexOf(sub.value, pos); + } + + /* rb_str_substr */ + public IRubyObject substr(int beg, int len) { + return substr(getRuntime(), beg, len); + } + + public IRubyObject substr(Ruby runtime, int beg, int len) { + int length = value.length(); + if (len < 0 || beg > length) return getRuntime().getNil(); + + if (beg < 0) { + beg += length; + if (beg < 0) return getRuntime().getNil(); + } + + int end = Math.min(length, beg + len); + return makeShared(getRuntime(), beg, end - beg); + } + + + + /* rb_str_replace */ + public IRubyObject replace(int beg, int len, RubyString replaceWith) { + if (beg + len >= value.length()) len = value.length() - beg; + + modify(); + value.unsafeReplace(beg,len,replaceWith.value); + + return infectBy(replaceWith); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the versions with one or two args + */ + public IRubyObject op_aref(ThreadContext context, IRubyObject[] args) { + switch (args.length) { + case 1: + return op_aref(context, args[0]); + case 2: + return op_aref(context, args[0], args[1]); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_aref, rb_str_aref_m + * + */ + @JRubyMethod(name = {"[]", "slice"}, reads = BACKREF, writes = BACKREF) + public IRubyObject op_aref(ThreadContext context, IRubyObject arg1, IRubyObject arg2) { + if (arg1 instanceof RubyRegexp) { + if(((RubyRegexp)arg1).search(context, this, 0, false) >= 0) { + return RubyRegexp.nth_match(RubyNumeric.fix2int(arg2), context.getCurrentFrame().getBackRef()); + } + return context.getRuntime().getNil(); + } + return substr(context.getRuntime(), RubyNumeric.fix2int(arg1), RubyNumeric.fix2int(arg2)); + } + + /** rb_str_aref, rb_str_aref_m + * + */ + @JRubyMethod(name = {"[]", "slice"}, reads = BACKREF, writes = BACKREF) + public IRubyObject op_aref(ThreadContext context, IRubyObject arg) { + if (arg instanceof RubyRegexp) { + if(((RubyRegexp)arg).search(context, this, 0, false) >= 0) { + return RubyRegexp.nth_match(0, context.getCurrentFrame().getBackRef()); + } + return context.getRuntime().getNil(); + } else if (arg instanceof RubyString) { + return value.indexOf(stringValue(arg).value) != -1 ? + arg : context.getRuntime().getNil(); + } else if (arg instanceof RubyRange) { + long[] begLen = ((RubyRange) arg).begLen(value.length(), 0); + return begLen == null ? context.getRuntime().getNil() : + substr(context.getRuntime(), (int) begLen[0], (int) begLen[1]); + } + int idx = (int) arg.convertToInteger().getLongValue(); + + if (idx < 0) idx += value.length(); + if (idx < 0 || idx >= value.length()) return context.getRuntime().getNil(); + + return context.getRuntime().newFixnum(value.get(idx) & 0xFF); + } + + /** + * rb_str_subpat_set + * + */ + private void subpatSet(ThreadContext context, RubyRegexp regexp, int nth, IRubyObject repl) { + RubyMatchData match; + int start, end, len; + if (regexp.search(context, this, 0, false) < 0) throw context.getRuntime().newIndexError("regexp not matched"); + + match = (RubyMatchData)context.getCurrentFrame().getBackRef(); + + if (match.regs == null) { + if (nth >= 1) throw context.getRuntime().newIndexError("index " + nth + " out of regexp"); + if (nth < 0) { + if(-nth >= 1) throw context.getRuntime().newIndexError("index " + nth + " out of regexp"); + nth += 1; + } + start = match.begin; + if(start == -1) throw context.getRuntime().newIndexError("regexp group " + nth + " not matched"); + end = match.end; + } else { + if(nth >= match.regs.numRegs) throw context.getRuntime().newIndexError("index " + nth + " out of regexp"); + if(nth < 0) { + if(-nth >= match.regs.numRegs) throw context.getRuntime().newIndexError("index " + nth + " out of regexp"); + nth += match.regs.numRegs; + } + start = match.regs.beg[nth]; + if(start == -1) throw context.getRuntime().newIndexError("regexp group " + nth + " not matched"); + end = match.regs.end[nth]; + } + + len = end - start; + replace(start, len, stringValue(repl)); + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with two or three args. + */ + public IRubyObject op_aset(ThreadContext context, IRubyObject[] args) { + switch (args.length) { + case 2: + return op_aset(context, args[0], args[1]); + case 3: + return op_aset(context, args[0], args[1], args[2]); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 2, 3); + return null; // not reached + } + } + + /** rb_str_aset, rb_str_aset_m + * + */ + @JRubyMethod(name = "[]=", reads = BACKREF) + public IRubyObject op_aset(ThreadContext context, IRubyObject arg0, IRubyObject arg1) { + if (arg0 instanceof RubyFixnum || arg0.respondsTo("to_int")) { // FIXME: RubyNumeric or RubyInteger instead? + int idx = RubyNumeric.fix2int(arg0); + + if (idx < 0) idx += value.length(); + + if (idx < 0 || idx >= value.length()) { + throw context.getRuntime().newIndexError("string index out of bounds"); + } + if (arg1 instanceof RubyFixnum) { + modify(); + value.set(idx, (byte) RubyNumeric.fix2int(arg1)); + } else { + replace(idx, 1, stringValue(arg1)); + } + return arg1; + } + if (arg0 instanceof RubyRegexp) { + RubyString repl = stringValue(arg1); + subpatSet(context, (RubyRegexp) arg0, 0, repl); + return repl; + } + if (arg0 instanceof RubyString) { + RubyString orig = (RubyString)arg0; + int beg = value.indexOf(orig.value); + if (beg < 0) throw context.getRuntime().newIndexError("string not matched"); + replace(beg, orig.value.length(), stringValue(arg1)); + return arg1; + } + if (arg0 instanceof RubyRange) { + long[] begLen = ((RubyRange) arg0).begLen(value.realSize, 2); + replace((int) begLen[0], (int) begLen[1], stringValue(arg1)); + return arg1; + } + throw context.getRuntime().newTypeError("wrong argument type"); + } + + /** rb_str_aset, rb_str_aset_m + * + */ + @JRubyMethod(name = "[]=", reads = BACKREF) + public IRubyObject op_aset(ThreadContext context, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2) { + if (arg0 instanceof RubyRegexp) { + RubyString repl = stringValue(arg2); + int nth = RubyNumeric.fix2int(arg1); + subpatSet(context, (RubyRegexp) arg0, nth, repl); + return repl; + } + RubyString repl = stringValue(arg2); + int beg = RubyNumeric.fix2int(arg0); + int len = RubyNumeric.fix2int(arg1); + if (len < 0) throw context.getRuntime().newIndexError("negative length"); + int strLen = value.length(); + if (beg < 0) beg += strLen; + + if (beg < 0 || (beg > 0 && beg > strLen)) { + throw context.getRuntime().newIndexError("string index out of bounds"); + } + if (beg + len > strLen) len = strLen - beg; + + replace(beg, len, repl); + return repl; + } + + /** + * Variable arity version for compatibility. Not bound as a Ruby method. + * @deprecated Use the versions with one or two args. + */ + public IRubyObject slice_bang(ThreadContext context, IRubyObject[] args) { + switch (args.length) { + case 1: + return slice_bang(context, args[0]); + case 2: + return slice_bang(context, args[0], args[1]); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_slice_bang + * + */ + @JRubyMethod(name = "slice!", reads = BACKREF, writes = BACKREF) + public IRubyObject slice_bang(ThreadContext context, IRubyObject arg0) { + IRubyObject result = op_aref(context, arg0); + if (result.isNil()) return result; + + op_aset(context, arg0, RubyString.newEmptyString(context.getRuntime())); + return result; + } + + /** rb_str_slice_bang + * + */ + @JRubyMethod(name = "slice!", reads = BACKREF, writes = BACKREF) + public IRubyObject slice_bang(ThreadContext context, IRubyObject arg0, IRubyObject arg1) { + IRubyObject result = op_aref(context, arg0, arg1); + if (result.isNil()) return result; + + op_aset(context, arg0, arg1, RubyString.newEmptyString(context.getRuntime())); + return result; + } + + @JRubyMethod(name = {"succ", "next"}) + public IRubyObject succ(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.succ_bang(); + return str; + } + + @JRubyMethod(name = {"succ!", "next!"}) + public IRubyObject succ_bang() { + if (value.length() == 0) { + modifyCheck(); + return this; + } + + modify(); + + boolean alnumSeen = false; + int pos = -1; + int c = 0; + int n = 0; + for (int i = value.length() - 1; i >= 0; i--) { + c = value.get(i) & 0xFF; + if (isAlnum(c)) { + alnumSeen = true; + if ((isDigit(c) && c < '9') || (isLower(c) && c < 'z') || (isUpper(c) && c < 'Z')) { + value.set(i, (byte)(c + 1)); + pos = -1; + break; + } + pos = i; + n = isDigit(c) ? '1' : (isLower(c) ? 'a' : 'A'); + value.set(i, (byte)(isDigit(c) ? '0' : (isLower(c) ? 'a' : 'A'))); + } + } + if (!alnumSeen) { + for (int i = value.length() - 1; i >= 0; i--) { + c = value.get(i) & 0xFF; + if (c < 0xff) { + value.set(i, (byte)(c + 1)); + pos = -1; + break; + } + pos = i; + n = '\u0001'; + value.set(i, 0); + } + } + if (pos > -1) { + // This represents left most digit in a set of incremented + // values? Therefore leftmost numeric must be '1' and not '0' + // 999 -> 1000, not 999 -> 0000. whereas chars should be + // zzz -> aaaa and non-alnum byte values should be "\377" -> "\001\000" + value.insert(pos, (byte) n); + } + return this; + } + + /** rb_str_upto_m + * + */ + @JRubyMethod(name = "upto", required = 1, frame = true) + public IRubyObject upto(ThreadContext context, IRubyObject str, Block block) { + return upto(context, str, false, block); + } + + /* rb_str_upto */ + public IRubyObject upto(ThreadContext context, IRubyObject str, boolean excl, Block block) { + RubyString end = str.convertToString(); + + int n = value.cmp(end.value); + if (n > 0 || (excl && n == 0)) return this; + + IRubyObject afterEnd = end.callMethod(context, "succ"); + RubyString current = this; + + while (!current.op_equal(context, afterEnd).isTrue()) { + block.yield(context, current); + if (!excl && current.op_equal(context, end).isTrue()) break; + current = current.callMethod(context, "succ").convertToString(); + if (excl && current.op_equal(context, end).isTrue()) break; + if (current.value.realSize > end.value.realSize || current.value.realSize == 0) break; + } + + return this; + } + + /** rb_str_include + * + */ + @JRubyMethod(name = "include?", required = 1) + public RubyBoolean include_p(ThreadContext context, IRubyObject obj) { + if (obj instanceof RubyFixnum) { + int c = RubyNumeric.fix2int(obj); + for (int i = 0; i < value.length(); i++) { + if (value.get(i) == (byte)c) { + return context.getRuntime().getTrue(); + } + } + return context.getRuntime().getFalse(); + } + ByteList str = stringValue(obj).value; + return context.getRuntime().newBoolean(value.indexOf(str) != -1); + } + + /** + * Variable-arity version for compatibility. Not bound as a Ruby method. + * @deprecated Use the versions with zero or one args. + */ + public IRubyObject to_i(IRubyObject[] args) { + switch (args.length) { + case 0: + return to_i(); + case 1: + return to_i(args[0]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 0, 1); + return null; // not reached + } + } + + /** rb_str_to_i + * + */ + @JRubyMethod(name = "to_i") + public IRubyObject to_i() { + return RubyNumeric.str2inum(getRuntime(), this, 10); + } + + /** rb_str_to_i + * + */ + @JRubyMethod(name = "to_i") + public IRubyObject to_i(IRubyObject arg0) { + long base = arg0.convertToInteger().getLongValue(); + return RubyNumeric.str2inum(getRuntime(), this, (int) base); + } + + /** rb_str_oct + * + */ + @JRubyMethod(name = "oct") + public IRubyObject oct(ThreadContext context) { + if (isEmpty()) return context.getRuntime().newFixnum(0); + + int base = 8; + + int ix = value.begin; + + while(ix < value.begin+value.realSize && ASCII.isSpace(value.bytes[ix] & 0xff)) { + ix++; + } + + int pos = (value.bytes[ix] == '-' || value.bytes[ix] == '+') ? ix+1 : ix; + if((pos+1) < value.begin+value.realSize && value.bytes[pos] == '0') { + if(value.bytes[pos+1] == 'x' || value.bytes[pos+1] == 'X') { + base = 16; + } else if(value.bytes[pos+1] == 'b' || value.bytes[pos+1] == 'B') { + base = 2; + } else if(value.bytes[pos+1] == 'd' || value.bytes[pos+1] == 'D') { + base = 10; + } + } + return RubyNumeric.str2inum(context.getRuntime(), this, base); + } + + /** rb_str_hex + * + */ + @JRubyMethod(name = "hex") + public IRubyObject hex(ThreadContext context) { + return RubyNumeric.str2inum(context.getRuntime(), this, 16); + } + + /** rb_str_to_f + * + */ + @JRubyMethod(name = "to_f") + public IRubyObject to_f() { + return RubyNumeric.str2fnum(getRuntime(), this); + } + + /** + * Variable arity version for compatibility. Not bound to a Ruby method. + * @deprecated Use the versions with zero, one, or two args. + */ + public RubyArray split(ThreadContext context, IRubyObject[] args) { + switch (args.length) { + case 0: + return split(context); + case 1: + return split(context, args[0]); + case 2: + return split(context, args[0], args[1]); + default: + Arity.raiseArgumentError(context.getRuntime(), args.length, 0, 2); + return null; // not reached + } + } + + /** rb_str_split_m + * + */ + @JRubyMethod(writes = BACKREF) + public RubyArray split(ThreadContext context) { + return split(context, context.getRuntime().getNil()); + } + + /** rb_str_split_m + * + */ + @JRubyMethod(writes = BACKREF) + public RubyArray split(ThreadContext context, IRubyObject arg0) { + return splitCommon(arg0, false, 0, 0, context); + } + + /** rb_str_split_m + * + */ + @JRubyMethod(writes = BACKREF) + public RubyArray split(ThreadContext context, IRubyObject arg0, IRubyObject arg1) { + final int lim = RubyNumeric.fix2int(arg1); + if (lim <= 0) { + return splitCommon(arg0, false, lim, 1, context); + } else { + if (lim == 1) return value.realSize == 0 ? context.getRuntime().newArray() : context.getRuntime().newArray(this); + return splitCommon(arg0, true, lim, 1, context); + } + } + + private RubyArray splitCommon(IRubyObject spat, final boolean limit, final int lim, final int i, ThreadContext context) { + final RubyArray result; + if (spat.isNil() && (spat = context.getRuntime().getGlobalVariables().get("$;")).isNil()) { + result = awkSplit(limit, lim, i); + } else { + if (spat instanceof RubyString && ((RubyString) spat).value.realSize == 1) { + RubyString strSpat = (RubyString) spat; + if (strSpat.value.bytes[strSpat.value.begin] == (byte) ' ') { + result = awkSplit(limit, lim, i); + } else { + result = split(context, spat, limit, lim, i); + } + } else { + result = split(context, spat, limit, lim, i); + } + } + + if (!limit && lim == 0) { + while (result.size() > 0 && ((RubyString) result.eltInternal(result.size() - 1)).value.realSize == 0) { + result.pop(); + } + } + + return result; + } + + private RubyArray split(ThreadContext context, IRubyObject pat, boolean limit, int lim, int i) { + Ruby runtime = context.getRuntime(); + + final Regex regex = getPattern(pat, true).getPattern(); + int beg, end, start; + + int begin = value.begin; + start = begin; + beg = 0; + + int range = value.begin + value.realSize; + final Matcher matcher = regex.matcher(value.bytes, value.begin, range); + + boolean lastNull = false; + RubyArray result = runtime.newArray(); + if (regex.numberOfCaptures() == 0) { // shorter path, no captures defined, no region will be returned + while ((end = matcher.search(start, range, Option.NONE)) >= 0) { + if (start == end + begin && matcher.getBegin() == matcher.getEnd()) { + if (value.realSize == 0) { + result.append(newEmptyString(runtime, getMetaClass())); + break; + } else if (lastNull) { + result.append(substr(runtime, beg, regex.getEncoding().length(value.bytes[begin + beg]))); + beg = start - begin; + } else { + if (start == range) { + start++; + } else { + start += regex.getEncoding().length(value.bytes[start]); + } + lastNull = true; + continue; + } + } else { + result.append(substr(beg, end - beg)); + beg = matcher.getEnd(); + start = begin + matcher.getEnd(); + } + lastNull = false; + if (limit && lim <= ++i) break; + } + } else { + while ((end = matcher.search(start, range, Option.NONE)) >= 0) { + final Region region = matcher.getRegion(); + if (start == end + begin && region.beg[0] == region.end[0]) { + if (value.realSize == 0) { + result.append(newEmptyString(runtime, getMetaClass())); + break; + } else if (lastNull) { + result.append(substr(beg, regex.getEncoding().length(value.bytes[begin + beg]))); + beg = start - begin; + } else { + if (start == range) { + start++; + } else { + start += regex.getEncoding().length(value.bytes[start]); + } + lastNull = true; + continue; + } + } else { + result.append(substr(beg, end - beg)); + beg = start = region.end[0]; + start += begin; + } + lastNull = false; + + for (int idx=1; idx<region.numRegs; idx++) { + if (region.beg[idx] == -1) continue; + if (region.beg[idx] == region.end[idx]) { + result.append(newEmptyString(runtime, getMetaClass())); + } else { + result.append(substr(region.beg[idx], region.end[idx] - region.beg[idx])); + } + } + if (limit && lim <= ++i) break; + } + } + + // only this case affects backrefs + context.getCurrentFrame().setBackRef(runtime.getNil()); + + if (value.realSize > 0 && (limit || value.realSize > beg || lim < 0)) { + if (value.realSize == beg) { + result.append(newEmptyString(runtime, getMetaClass())); + } else { + result.append(substr(beg, value.realSize - beg)); + } + } + + return result; + } + + private RubyArray awkSplit(boolean limit, int lim, int i) { + Ruby runtime = getRuntime(); + RubyArray result = runtime.newArray(); + + byte[]bytes = value.bytes; + int p = value.begin; + int endp = p + value.realSize; + + boolean skip = true; + + int end, beg = 0; + for (end = beg = 0; p < endp; p++) { + if (skip) { + if (ASCII.isSpace(bytes[p] & 0xff)) { + beg++; + } else { + end = beg + 1; + skip = false; + if (limit && lim <= i) break; + } + } else { + if (ASCII.isSpace(bytes[p] & 0xff)) { + result.append(makeShared(runtime, beg, end - beg)); + skip = true; + beg = end + 1; + if (limit) i++; + } else { + end++; + } + } + } + + if (value.realSize > 0 && (limit || value.realSize > beg || lim < 0)) { + if (value.realSize == beg) { + result.append(newEmptyString(runtime, getMetaClass())); + } else { + result.append(makeShared(runtime, beg, value.realSize - beg)); + } + } + return result; + } + + /** get_pat + * + */ + private final RubyRegexp getPattern(IRubyObject obj, boolean quote) { + if (obj instanceof RubyRegexp) { + return (RubyRegexp)obj; + } else if (!(obj instanceof RubyString)) { + IRubyObject val = obj.checkStringType(); + if (val.isNil()) throw getRuntime().newTypeError("wrong argument type " + obj.getMetaClass() + " (expected Regexp)"); + obj = val; + } + + return RubyRegexp.newRegexp(getRuntime(), ((RubyString)obj).value, 0, quote); + } + + /** rb_str_scan + * + */ + @JRubyMethod(name = "scan", required = 1, frame = true, reads = BACKREF, writes = BACKREF) + public IRubyObject scan(ThreadContext context, IRubyObject arg, Block block) { + Ruby runtime = context.getRuntime(); + Frame frame = context.getPreviousFrame(); + + final RubyRegexp rubyRegex = getPattern(arg, true); + final Regex regex = rubyRegex.getPattern(); + + int range = value.begin + value.realSize; + final Matcher matcher = regex.matcher(value.bytes, value.begin, range); + matcher.value = 0; // implicit start argument to scanOnce(NG) + + IRubyObject result; + if (!block.isGiven()) { + RubyArray ary = runtime.newArray(); + + if (regex.numberOfCaptures() == 0) { + while ((result = scanOnceNG(rubyRegex, matcher, range)) != null) ary.append(result); + } else { + while ((result = scanOnce(rubyRegex, matcher, range)) != null) ary.append(result); + } + + if (ary.size() > 0) { + rubyRegex.updateBackRef(context, this, frame, matcher); + } else { + frame.setBackRef(runtime.getNil()); + } + return ary; + } else { + byte[]bytes = value.bytes; + int size = value.realSize; + RubyMatchData match = null; + + if (regex.numberOfCaptures() == 0) { + while ((result = scanOnceNG(rubyRegex, matcher, range)) != null) { + match = rubyRegex.updateBackRef(context, this, frame, matcher); + match.use(); + block.yield(context, result); + modifyCheck(bytes, size); + } + } else { + while ((result = scanOnce(rubyRegex, matcher, range)) != null) { + match = rubyRegex.updateBackRef(context, this, frame, matcher); + match.use(); + block.yield(context, result); + modifyCheck(bytes, size); + } + } + frame.setBackRef(match == null ? runtime.getNil() : match); + return this; + } + } + + /** + * rb_enc_check + */ + @SuppressWarnings("unused") + private Encoding encodingCheck(RubyRegexp pattern) { + // For 1.9 compatibility, should check encoding compat between string and pattern + return pattern.getKCode().getEncoding(); + } + + // no group version + private IRubyObject scanOnceNG(RubyRegexp regex, Matcher matcher, int range) { + if (matcher.search(matcher.value + value.begin, range, Option.NONE) >= 0) { + int end = matcher.getEnd(); + if (matcher.getBegin() == end) { + if (value.realSize > end) { + matcher.value = end + regex.getPattern().getEncoding().length(value.bytes[value.begin + end]); + } else { + matcher.value = end + 1; + } + } else { + matcher.value = end; + } + return substr(matcher.getBegin(), end - matcher.getBegin()).infectBy(regex); + } + return null; + } + + // group version + private IRubyObject scanOnce(RubyRegexp regex, Matcher matcher, int range) { + if (matcher.search(matcher.value + value.begin, range, Option.NONE) >= 0) { + Region region = matcher.getRegion(); + int end = region.end[0]; + if (region.beg[0] == end) { + if (value.realSize > end) { + matcher.value = end + regex.getPattern().getEncoding().length(value.bytes[value.begin + end]); + } else { + matcher.value = end + 1; + } + } else { + matcher.value = end; + } + + RubyArray result = getRuntime().newArray(region.numRegs); + for (int i=1; i<region.numRegs; i++) { + int beg = region.beg[i]; + if (beg == -1) { + result.append(getRuntime().getNil()); + } else { + result.append(substr(beg, region.end[i] - beg).infectBy(regex)); + } + } + return result; + } + return null; + } + + private static final ByteList SPACE_BYTELIST = new ByteList(ByteList.plain(" ")); + + private final IRubyObject justify(IRubyObject arg0, char jflag) { + Ruby runtime = getRuntime(); + + int width = RubyFixnum.num2int(arg0); + + int f, flen = 0; + byte[]fbuf; + + IRubyObject pad; + + f = SPACE_BYTELIST.begin; + flen = SPACE_BYTELIST.realSize; + fbuf = SPACE_BYTELIST.bytes; + pad = runtime.getNil(); + + return justifyCommon(width, jflag, flen, fbuf, f, runtime, pad); + } + + private final IRubyObject justify(IRubyObject arg0, IRubyObject arg1, char jflag) { + Ruby runtime = getRuntime(); + + int width = RubyFixnum.num2int(arg0); + + int f, flen = 0; + byte[]fbuf; + + IRubyObject pad; + + pad = arg1.convertToString(); + ByteList fList = ((RubyString)pad).value; + f = fList.begin; + flen = fList.realSize; + + if (flen == 0) throw runtime.newArgumentError("zero width padding"); + + fbuf = fList.bytes; + + return justifyCommon(width, jflag, flen, fbuf, f, runtime, pad); + } + + private IRubyObject justifyCommon(int width, char jflag, int flen, byte[] fbuf, int f, Ruby runtime, IRubyObject pad) { + if (width < 0 || value.realSize >= width) return strDup(runtime); + + ByteList res = new ByteList(width); + res.realSize = width; + + int p = res.begin; + int pend; + byte[] pbuf = res.bytes; + + if (jflag != 'l') { + int n = width - value.realSize; + pend = p + ((jflag == 'r') ? n : n / 2); + if (flen <= 1) { + while (p < pend) { + pbuf[p++] = fbuf[f]; + } + } else { + int q = f; + while (p + flen <= pend) { + System.arraycopy(fbuf, f, pbuf, p, flen); + p += flen; + } + while (p < pend) { + pbuf[p++] = fbuf[q++]; + } + } + } + + System.arraycopy(value.bytes, value.begin, pbuf, p, value.realSize); + + if (jflag != 'r') { + p += value.realSize; + pend = res.begin + width; + if (flen <= 1) { + while (p < pend) { + pbuf[p++] = fbuf[f]; + } + } else { + while (p + flen <= pend) { + System.arraycopy(fbuf, f, pbuf, p, flen); + p += flen; + } + while (p < pend) { + pbuf[p++] = fbuf[f++]; + } + } + } + + RubyString resStr = new RubyString(runtime, getMetaClass(), res); + resStr.infectBy(this); + if (flen > 0) { + resStr.infectBy(pad); + } + return resStr; + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated use the one or two argument versions. + */ + public IRubyObject ljust(IRubyObject [] args) { + switch (args.length) { + case 1: + return ljust(args[0]); + case 2: + return ljust(args[0], args[1]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_ljust + * + */ + @JRubyMethod + public IRubyObject ljust(IRubyObject arg0) { + return justify(arg0, 'l'); + } + + /** rb_str_ljust + * + */ + @JRubyMethod + public IRubyObject ljust(IRubyObject arg0, IRubyObject arg1) { + return justify(arg0, arg1, 'l'); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated use the one or two argument versions. + */ + public IRubyObject rjust(IRubyObject [] args) { + switch (args.length) { + case 1: + return rjust(args[0]); + case 2: + return rjust(args[0], args[1]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_rjust + * + */ + @JRubyMethod + public IRubyObject rjust(IRubyObject arg0) { + return justify(arg0, 'r'); + } + + /** rb_str_rjust + * + */ + @JRubyMethod + public IRubyObject rjust(IRubyObject arg0, IRubyObject arg1) { + return justify(arg0, arg1, 'r'); + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated use the one or two argument versions. + */ + public IRubyObject center(IRubyObject [] args) { + switch (args.length) { + case 1: + return center(args[0]); + case 2: + return center(args[0], args[1]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 1, 2); + return null; // not reached + } + } + + /** rb_str_center + * + */ + @JRubyMethod + public IRubyObject center(IRubyObject arg0) { + return justify(arg0, 'c'); + } + + /** rb_str_center + * + */ + @JRubyMethod + public IRubyObject center(IRubyObject arg0, IRubyObject arg1) { + return justify(arg0, arg1, 'c'); + } + + @JRubyMethod(name = "chop") + public IRubyObject chop(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.chop_bang(); + return str; + } + + /** rb_str_chop_bang + * + */ + @JRubyMethod(name = "chop!") + public IRubyObject chop_bang() { + int end = value.realSize - 1; + if (end < 0) return getRuntime().getNil(); + + if ((value.bytes[value.begin + end]) == '\n') { + if (end > 0 && (value.bytes[value.begin + end - 1]) == '\r') end--; + } + + view(0, end); + return this; + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby + * + * @param args + * @return + * @deprecated Use the zero or one argument versions. + */ + public RubyString chomp(IRubyObject[] args) { + switch (args.length) { + case 0: + return chomp(); + case 1: + return chomp(args[0]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 0, 1); + return null; // not reached + } + } + + /** rb_str_chop + * + */ + @JRubyMethod + public RubyString chomp() { + RubyString str = strDup(getRuntime()); + str.chomp_bang(); + return str; + } + + /** rb_str_chop + * + */ + @JRubyMethod + public RubyString chomp(IRubyObject arg0) { + RubyString str = strDup(getRuntime()); + str.chomp_bang(arg0); + return str; + } + + /** + * Variable-arity version for compatibility. Not bound to Ruby. + * @deprecated Use the zero or one argument versions. + */ + public IRubyObject chomp_bang(IRubyObject[] args) { + switch (args.length) { + case 0: + return chomp_bang(); + case 1: + return chomp_bang(args[0]); + default: + Arity.raiseArgumentError(getRuntime(), args.length, 0, 1); + return null; // not reached + } + } + + /** + * rb_str_chomp_bang + * + * In the common case, removes CR and LF characters in various ways depending on the value of + * the optional args[0]. + * If args.length==0 removes one instance of CR, CRLF or LF from the end of the string. + * If args.length>0 and args[0] is "\n" then same behaviour as args.length==0 . + * If args.length>0 and args[0] is "" then removes trailing multiple LF or CRLF (but no CRs at + * all(!)). + * @param args See method description. + */ + @JRubyMethod(name = "chomp!") + public IRubyObject chomp_bang() { + IRubyObject rsObj; + + int len = value.length(); + if (len == 0) return getRuntime().getNil(); + byte[]buff = value.bytes; + + rsObj = getRuntime().getGlobalVariables().get("$/"); + + if (rsObj == getRuntime().getGlobalVariables().getDefaultSeparator()) { + int realSize = value.realSize; + int begin = value.begin; + if (buff[begin + len - 1] == (byte)'\n') { + realSize--; + if (realSize > 0 && buff[begin + realSize - 1] == (byte)'\r') realSize--; + view(0, realSize); + } else if (buff[begin + len - 1] == (byte)'\r') { + realSize--; + view(0, realSize); + } else { + modifyCheck(); + return getRuntime().getNil(); + } + return this; + } + + return chompBangCommon(rsObj); + } + + /** + * rb_str_chomp_bang + * + * In the common case, removes CR and LF characters in various ways depending on the value of + * the optional args[0]. + * If args.length==0 removes one instance of CR, CRLF or LF from the end of the string. + * If args.length>0 and args[0] is "\n" then same behaviour as args.length==0 . + * If args.length>0 and args[0] is "" then removes trailing multiple LF or CRLF (but no CRs at + * all(!)). + * @param args See method description. + */ + @JRubyMethod(name = "chomp!") + public IRubyObject chomp_bang(IRubyObject arg0) { + return chompBangCommon(arg0); + } + + private IRubyObject chompBangCommon(IRubyObject rsObj) { + + if (rsObj.isNil()) { + return getRuntime().getNil(); + } + RubyString rs = rsObj.convertToString(); + int len = value.realSize; + int begin = value.begin; + if (len == 0) { + return getRuntime().getNil(); + } + byte[] buff = value.bytes; + int rslen = rs.value.realSize; + + if (rslen == 0) { + while (len > 0 && buff[begin + len - 1] == (byte) '\n') { + len--; + if (len > 0 && buff[begin + len - 1] == (byte) '\r') { + len--; + } + } + if (len < value.realSize) { + view(0, len); + return this; + } + return getRuntime().getNil(); + } + + if (rslen > len) { + return getRuntime().getNil(); + } + byte newline = rs.value.bytes[rslen - 1]; + + if (rslen == 1 && newline == (byte) '\n') { + buff = value.bytes; + int realSize = value.realSize; + if (buff[begin + len - 1] == (byte) '\n') { + realSize--; + if (realSize > 0 && buff[begin + realSize - 1] == (byte) '\r') { + realSize--; + } + view(0, realSize); + } else if (buff[begin + len - 1] == (byte) '\r') { + realSize--; + view(0, realSize); + } else { + modifyCheck(); + return getRuntime().getNil(); + } + return this; + } + + if (buff[begin + len - 1] == newline && rslen <= 1 || value.endsWith(rs.value)) { + view(0, value.realSize - rslen); + return this; + } + + return getRuntime().getNil(); + } + + /** rb_str_lstrip + * + */ + @JRubyMethod + public IRubyObject lstrip(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.lstrip_bang(); + return str; + } + + /** rb_str_lstrip_bang + */ + @JRubyMethod(name = "lstrip!") + public IRubyObject lstrip_bang() { + if (value.realSize == 0) return getRuntime().getNil(); + + int i=0; + while (i < value.realSize && ASCII.isSpace(value.bytes[value.begin + i] & 0xff)) i++; + + if (i > 0) { + view(i, value.realSize - i); + return this; + } + + return getRuntime().getNil(); + } + + /** rb_str_rstrip + * + */ + @JRubyMethod + public IRubyObject rstrip(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.rstrip_bang(); + return str; + } + + /** rb_str_rstrip_bang + */ + @JRubyMethod(name = "rstrip!") + public IRubyObject rstrip_bang() { + if (value.realSize == 0) return getRuntime().getNil(); + int i=value.realSize - 1; + + while (i >= 0 && value.bytes[value.begin+i] == 0) i--; + while (i >= 0 && ASCII.isSpace(value.bytes[value.begin + i] & 0xff)) i--; + + if (i < value.realSize - 1) { + view(0, i + 1); + return this; + } + + return getRuntime().getNil(); + } + + /** rb_str_strip + * + */ + @JRubyMethod + public IRubyObject strip(ThreadContext context) { + RubyString str = strDup(context.getRuntime()); + str.strip_bang(); + return str; + } + + /** rb_str_strip_bang + */ + @JRubyMethod(name = "strip!") + public IRubyObject strip_bang() { + IRubyObject l = lstrip_bang(); + IRubyObject r = rstrip_bang(); + + if(l.isNil() && r.isNil()) { + return l; + } + return this; + } + + /** rb_str_count + * + */ + @JRubyMethod(name = "count", required = 1, rest = true) + public IRubyObject count(IRubyObject[] args) { + if (args.length < 1) throw getRuntime().newArgumentError("wrong number of arguments"); + if (value.realSize == 0) return getRuntime().newFixnum(0); + + boolean[]table = new boolean[TRANS_SIZE]; + boolean init = true; + for (int i=0; i<args.length; i++) { + RubyString s = args[i].convertToString(); + s.setup_table(table, init); + init = false; + } + + int s = value.begin; + int send = s + value.realSize; + byte[]buf = value.bytes; + int i = 0; + + while (s < send) if (table[buf[s++] & 0xff]) i++; + + return getRuntime().newFixnum(i); + } + + /** rb_str_delete + * + */ + @JRubyMethod(name = "delete", required = 1, rest = true) + public IRubyObject delete(ThreadContext context, IRubyObject[] args) { + RubyString str = strDup(context.getRuntime()); + str.delete_bang(args); + return str; + } + + /** rb_str_delete_bang + * + */ + @JRubyMethod(name = "delete!", required = 1, rest = true) + public IRubyObject delete_bang(IRubyObject[] args) { + if (args.length < 1) throw getRuntime().newArgumentError("wrong number of arguments"); + + boolean[]squeeze = new boolean[TRANS_SIZE]; + + boolean init = true; + for (int i=0; i<args.length; i++) { + RubyString s = args[i].convertToString(); + s.setup_table(squeeze, init); + init = false; + } + + modify(); + + if (value.realSize == 0) return getRuntime().getNil(); + int s = value.begin; + int t = s; + int send = s + value.realSize; + byte[]buf = value.bytes; + boolean modify = false; + + while (s < send) { + if (squeeze[buf[s] & 0xff]) { + modify = true; + } else { + buf[t++] = buf[s]; + } + s++; + } + value.realSize = t - value.begin; + + if (modify) return this; + return getRuntime().getNil(); + } + + /** rb_str_squeeze + * + */ + @JRubyMethod(name = "squeeze", rest = true) + public IRubyObject squeeze(ThreadContext context, IRubyObject[] args) { + RubyString str = strDup(context.getRuntime()); + str.squeeze_bang(args); + return str; + } + + /** rb_str_squeeze_bang + * + */ + @JRubyMethod(name = "squeeze!", rest = true) + public IRubyObject squeeze_bang(IRubyObject[] args) { + if (value.realSize == 0) { + modifyCheck(); + return getRuntime().getNil(); + } + + final boolean squeeze[] = new boolean[TRANS_SIZE]; + + if (args.length == 0) { + for (int i=0; i<TRANS_SIZE; i++) squeeze[i] = true; + } else { + boolean init = true; + for (int i=0; i<args.length; i++) { + RubyString s = args[i].convertToString(); + s.setup_table(squeeze, init); + init = false; + } + } + + modify(); + + int s = value.begin; + int t = s; + int send = s + value.realSize; + byte[]buf = value.bytes; + int save = -1; + + while (s < send) { + int c = buf[s++] & 0xff; + if (c != save || !squeeze[c]) buf[t++] = (byte)(save = c); + } + + if (t - value.begin != value.realSize) { // modified + value.realSize = t - value.begin; + return this; + } + + return getRuntime().getNil(); + } + + /** rb_str_tr + * + */ + @JRubyMethod + public IRubyObject tr(ThreadContext context, IRubyObject src, IRubyObject repl) { + RubyString str = strDup(context.getRuntime()); + str.tr_trans(src, repl, false); + return str; + } + + /** rb_str_tr_bang + * + */ + @JRubyMethod(name = "tr!") + public IRubyObject tr_bang(IRubyObject src, IRubyObject repl) { + return tr_trans(src, repl, false); + } + + private static final class TR { + int gen, now, max; + int p, pend; + byte[]buf; + } + + private static final int TRANS_SIZE = 256; + + /** tr_setup_table + * + */ + private final void setup_table(boolean[]table, boolean init) { + final boolean[]buf = new boolean[TRANS_SIZE]; + final TR tr = new TR(); + int c; + + boolean cflag = false; + + tr.p = value.begin; + tr.pend = value.begin + value.realSize; + tr.buf = value.bytes; + tr.gen = tr.now = tr.max = 0; + + if (value.realSize > 1 && value.bytes[value.begin] == '^') { + cflag = true; + tr.p++; + } + + if (init) for (int i=0; i<TRANS_SIZE; i++) table[i] = true; + + for (int i=0; i<TRANS_SIZE; i++) buf[i] = cflag; + while ((c = trnext(tr)) >= 0) buf[c & 0xff] = !cflag; + for (int i=0; i<TRANS_SIZE; i++) table[i] = table[i] && buf[i]; + } + + /** tr_trans + * + */ + private final IRubyObject tr_trans(IRubyObject src, IRubyObject repl, boolean sflag) { + if (value.realSize == 0) return getRuntime().getNil(); + + ByteList replList = repl.convertToString().value; + + if (replList.realSize == 0) return delete_bang(new IRubyObject[]{src}); + + ByteList srcList = src.convertToString().value; + + final TR trsrc = new TR(); + final TR trrepl = new TR(); + + boolean cflag = false; + boolean modify = false; + + trsrc.p = srcList.begin; + trsrc.pend = srcList.begin + srcList.realSize; + trsrc.buf = srcList.bytes; + if (srcList.realSize >= 2 && srcList.bytes[srcList.begin] == '^') { + cflag = true; + trsrc.p++; + } + + trrepl.p = replList.begin; + trrepl.pend = replList.begin + replList.realSize; + trrepl.buf = replList.bytes; + + trsrc.gen = trrepl.gen = 0; + trsrc.now = trrepl.now = 0; + trsrc.max = trrepl.max = 0; + + int c; + final int[]trans = new int[TRANS_SIZE]; + if (cflag) { + for (int i=0; i<TRANS_SIZE; i++) trans[i] = 1; + while ((c = trnext(trsrc)) >= 0) trans[c & 0xff] = -1; + while ((c = trnext(trrepl)) >= 0); + for (int i=0; i<TRANS_SIZE; i++) { + if (trans[i] >= 0) trans[i] = trrepl.now; + } + } else { + for (int i=0; i<TRANS_SIZE; i++) trans[i] = -1; + while ((c = trnext(trsrc)) >= 0) { + int r = trnext(trrepl); + if (r == -1) r = trrepl.now; + trans[c & 0xff] = r; + } + } + + modify(); + + int s = value.begin; + int send = s + value.realSize; + byte sbuf[] = value.bytes; + + if (sflag) { + int t = s; + int c0, last = -1; + while (s < send) { + c0 = sbuf[s++]; + if ((c = trans[c0 & 0xff]) >= 0) { + if (last == c) continue; + last = c; + sbuf[t++] = (byte)(c & 0xff); + modify = true; + } else { + last = -1; + sbuf[t++] = (byte)c0; + } + } + + if (value.realSize > (t - value.begin)) { + value.realSize = t - value.begin; + modify = true; + } + } else { + while (s < send) { + if ((c = trans[sbuf[s] & 0xff]) >= 0) { + sbuf[s] = (byte)(c & 0xff); + modify = true; + } + s++; + } + } + + if (modify) return this; + return getRuntime().getNil(); + } + + /** trnext + * + */ + private final int trnext(TR t) { + byte [] buf = t.buf; + + for (;;) { + if (t.gen == 0) { + if (t.p == t.pend) return -1; + if (t.p < t.pend -1 && buf[t.p] == '\\') t.p++; + t.now = buf[t.p++]; + if (t.p < t.pend - 1 && buf[t.p] == '-') { + t.p++; + if (t.p < t.pend) { + if (t.now > ((int)buf[t.p] & 0xFF)) { + t.p++; + continue; + } + t.gen = 1; + t.max = (int)buf[t.p++] & 0xFF; + } + } + return t.now & 0xff; + } else if (++t.now < t.max) { + return t.now & 0xff; + } else { + t.gen = 0; + return t.max & 0xff; + } + } + } + + /** rb_str_tr_s + * + */ + @JRubyMethod + public IRubyObject tr_s(ThreadContext context, IRubyObject src, IRubyObject repl) { + RubyString str = strDup(context.getRuntime()); + str.tr_trans(src, repl, true); + return str; + } + + /** rb_str_tr_s_bang + * + */ + @JRubyMethod(name = "tr_s!") + public IRubyObject tr_s_bang(IRubyObject src, IRubyObject repl) { + return tr_trans(src, repl, true); + } + + /** rb_str_each_line + * + */ + @JRubyMethod(name = {"each_line", "each"}, required = 0, optional = 1, frame = true) + public IRubyObject each_line(ThreadContext context, IRubyObject[] args, Block block) { + byte newline; + int p = value.begin; + int pend = p + value.realSize; + int s; + int ptr = p; + int len = value.realSize; + int rslen; + IRubyObject line; + + + IRubyObject _rsep; + if (args.length == 0) { + _rsep = getRuntime().getGlobalVariables().get("$/"); + } else { + _rsep = args[0]; + } + + if(_rsep.isNil()) { + block.yield(context, this); + return this; + } + + RubyString rsep = stringValue(_rsep); + ByteList rsepValue = rsep.value; + byte[] strBytes = value.bytes; + + rslen = rsepValue.realSize; + + if(rslen == 0) { + newline = '\n'; + } else { + newline = rsepValue.bytes[rsepValue.begin + rslen-1]; + } + + s = p; + p+=rslen; + + for(; p < pend; p++) { + if(rslen == 0 && strBytes[p] == '\n') { + if(strBytes[++p] != '\n') { + continue; + } + while(p < pend && strBytes[p] == '\n') { + p++; + } + } + if(ptr<p && strBytes[p-1] == newline && + (rslen <= 1 || + ByteList.memcmp(rsepValue.bytes, rsepValue.begin, rslen, strBytes, p-rslen, rslen) == 0)) { + line = RubyString.newStringShared(getRuntime(), getMetaClass(), this.value.makeShared(s-ptr, p-s)); + line.infectBy(this); + block.yield(context, line); + modifyCheck(strBytes,len); + s = p; + } + } + + if(s != pend) { + if(p > pend) { + p = pend; + } + line = RubyString.newStringShared(getRuntime(), getMetaClass(), this.value.makeShared(s-ptr, p-s)); + line.infectBy(this); + block.yield(context, line); + } + + return this; + } + + /** + * rb_str_each_byte + */ + @JRubyMethod(name = "each_byte", frame = true) + public RubyString each_byte(ThreadContext context, Block block) { + Ruby runtime = getRuntime(); + // Check the length every iteration, since + // the block can modify this string. + for (int i = 0; i < value.length(); i++) { + block.yield(context, runtime.newFixnum(value.get(i) & 0xFF)); + } + return this; + } + + /** rb_str_intern + * + */ + public RubySymbol intern() { + String s = toString(); + if (s.length() == 0) { + throw getRuntime().newArgumentError("interning empty string"); + } + if (s.indexOf('\0') >= 0) { + throw getRuntime().newArgumentError("symbol string may not contain '\\0'"); + } + return getRuntime().newSymbol(s); + } + + @JRubyMethod(name = {"to_sym", "intern"}) + public RubySymbol to_sym() { + return intern(); + } + + @JRubyMethod(name = "sum", optional = 1) + public RubyInteger sum(IRubyObject[] args) { + if (args.length > 1) { + throw getRuntime().newArgumentError("wrong number of arguments (" + args.length + " for 1)"); + } + + long bitSize = 16; + if (args.length == 1) { + long bitSizeArg = ((RubyInteger) args[0].convertToInteger()).getLongValue(); + if (bitSizeArg > 0) { + bitSize = bitSizeArg; + } + } + + long result = 0; + for (int i = 0; i < value.length(); i++) { + result += value.get(i) & 0xFF; + } + return getRuntime().newFixnum(bitSize == 0 ? result : result % (long) Math.pow(2, bitSize)); + } + + /** string_to_c + * + */ + @JRubyMethod(name = "to_c", reads = BACKREF, writes = BACKREF, compat = CompatVersion.RUBY1_9) + public IRubyObject to_c(ThreadContext context) { + Ruby runtime = context.getRuntime(); + Frame frame = context.getCurrentFrame(); + IRubyObject backref = frame.getBackRef(); + if (backref != null && backref instanceof RubyMatchData) ((RubyMatchData)backref).use(); + + IRubyObject s = RuntimeHelpers.invoke( + context, this, "gsub", + RubyRegexp.newRegexp(runtime, Numeric.ComplexPatterns.underscores_pat), + runtime.newString(new ByteList(new byte[]{'_'}))); + + RubyArray a = RubyComplex.str_to_c_internal(context, s); + + frame.setBackRef(backref); + + if (!a.eltInternal(0).isNil()) { + return a.eltInternal(0); + } else { + return RubyComplex.newComplexCanonicalize(context, RubyFixnum.zero(runtime)); + } + } + + /** string_to_r + * + */ + @JRubyMethod(name = "to_r", reads = BACKREF, writes = BACKREF, compat = CompatVersion.RUBY1_9) + public IRubyObject to_r(ThreadContext context) { + Ruby runtime = context.getRuntime(); + Frame frame = context.getCurrentFrame(); + IRubyObject backref = frame.getBackRef(); + if (backref != null && backref instanceof RubyMatchData) ((RubyMatchData)backref).use(); + + IRubyObject s = RuntimeHelpers.invoke( + context, this, "gsub", + RubyRegexp.newRegexp(runtime, Numeric.ComplexPatterns.underscores_pat), + runtime.newString(new ByteList(new byte[]{'_'}))); + + RubyArray a = RubyRational.str_to_r_internal(context, s); + + frame.setBackRef(backref); + + if (!a.eltInternal(0).isNil()) { + return a.eltInternal(0); + } else { + return RubyRational.newRationalCanonicalize(context, RubyFixnum.zero(runtime)); + } + } + + public static RubyString unmarshalFrom(UnmarshalStream input) throws java.io.IOException { + RubyString result = newString(input.getRuntime(), input.unmarshalString()); + input.registerLinkTarget(result); + return result; + } + + /** + * @see org.jruby.util.Pack#unpack + */ + @JRubyMethod + public RubyArray unpack(IRubyObject obj) { + return Pack.unpack(getRuntime(), this.value, stringValue(obj).value); + } + + public void empty() { + value = ByteList.EMPTY_BYTELIST; + shareLevel = SHARE_LEVEL_BYTELIST; + } + + /** + * Mutator for internal string representation. + * + * @param value The new java.lang.String this RubyString should encapsulate + * @deprecated + */ + public void setValue(CharSequence value) { + view(ByteList.plain(value)); + } + + public void setValue(ByteList value) { + view(value); + } + + public CharSequence getValue() { + return toString(); + } + + public byte[] getBytes() { + return value.bytes(); + } + + public ByteList getByteList() { + return value; + } + + /** used by ar-jdbc + * + */ + public String getUnicodeValue() { + try { + return new String(value.bytes,value.begin,value.realSize, "UTF8"); + } catch (Exception e) { + throw new RuntimeException("Something's seriously broken with encodings", e); + } + } + + @Override + public IRubyObject to_java() { + return MiniJava.javaToRuby(getRuntime(), new String(getBytes())); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006 Ola Bini <ola@ologix.com> + * Copyright (C) 2006 Ryan Bell <ryan.l.bell@gmail.com> + * Copyright (C) 2007 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2008 Vladimir Sizikov <vsizikov@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.util.ArrayList; +import java.util.List; + +import org.jruby.anno.FrameField; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.TypeConverter; +import org.jruby.util.io.InvalidValueException; +import org.jruby.util.io.ModeFlags; +import org.jruby.util.io.Stream; + +@JRubyClass(name="StringIO") +public class RubyStringIO extends RubyObject { + private static ObjectAllocator STRINGIO_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyStringIO(runtime, klass); + } + }; + + public static RubyClass createStringIOClass(final Ruby runtime) { + RubyClass stringIOClass = runtime.defineClass( + "StringIO", runtime.fastGetClass("Data"), STRINGIO_ALLOCATOR); + + stringIOClass.defineAnnotatedMethods(RubyStringIO.class); + stringIOClass.includeModule(runtime.getEnumerable()); + + return stringIOClass; + } + + @JRubyMethod(name = "open", optional = 2, frame = true, meta = true) + public static IRubyObject open(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + RubyStringIO strio = (RubyStringIO)((RubyClass)recv).newInstance(context, args, Block.NULL_BLOCK); + IRubyObject val = strio; + + if (block.isGiven()) { + try { + val = block.yield(context, strio); + } finally { + strio.doFinalize(); + } + } + return val; + } + + protected RubyStringIO(Ruby runtime, RubyClass klass) { + super(runtime, klass); + } + + private long pos = 0L; + private int lineno = 0; + private boolean eof = false; + + /** + * ATTN: the value of internal might be reset to null + * (during StringIO.open with block), so watch out for that. + */ + private RubyString internal; + + // Has read/write been closed or is it still open for business + private boolean closedRead = false; + private boolean closedWrite = false; + + // Support IO modes that this object was opened with + ModeFlags modes; + + private void initializeModes(Object modeArgument) { + try { + if (modeArgument == null) { + modes = new ModeFlags(RubyIO.getIOModesIntFromString(getRuntime(), "r+")); + } else if (modeArgument instanceof Long) { + modes = new ModeFlags(((Long)modeArgument).longValue()); + } else { + modes = new ModeFlags(RubyIO.getIOModesIntFromString(getRuntime(), (String) modeArgument)); + } + } catch (InvalidValueException e) { + throw getRuntime().newErrnoEINVALError(); + } + setupModes(); + } + + @JRubyMethod(name = "initialize", optional = 2, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, Block unusedBlock) { + Object modeArgument = null; + switch (args.length) { + case 0: + internal = RubyString.newEmptyString(getRuntime()); + modeArgument = "r+"; + break; + case 1: + internal = args[0].convertToString(); + modeArgument = internal.isFrozen() ? "r" : "r+"; + break; + case 2: + internal = args[0].convertToString(); + if (args[1] instanceof RubyFixnum) { + modeArgument = RubyFixnum.fix2long(args[1]); + } else { + modeArgument = args[1].convertToString().toString(); + } + break; + } + + initializeModes(modeArgument); + + if (modes.isWritable() && internal.isFrozen()) { + throw getRuntime().newErrnoEACCESError("Permission denied"); + } + + if (modes.isTruncate()) { + internal.modifyCheck(); + internal.empty(); + } + + return this; + } + + @JRubyMethod(visibility = Visibility.PRIVATE) + public IRubyObject initialize_copy(IRubyObject other) { + + RubyStringIO otherIO = (RubyStringIO) TypeConverter.convertToType( + other, getRuntime().fastGetClass("StringIO"), + MethodIndex.getIndex("to_strio"), "to_strio"); + + if (this == otherIO) { + return this; + } + + pos = otherIO.pos; + lineno = otherIO.lineno; + eof = otherIO.eof; + closedRead = otherIO.closedRead; + closedWrite = otherIO.closedWrite; + internal = otherIO.internal; + modes = otherIO.modes; + if (otherIO.isTaint()) { + setTaint(true); + } + + return this; + } + + @JRubyMethod(name = "<<", required = 1) + public IRubyObject append(ThreadContext context, IRubyObject arg) { + writeInternal(context, arg); + return this; + } + + @JRubyMethod(name = "binmode") + public IRubyObject binmode() { + return this; + } + + @JRubyMethod(name = "close", frame=true) + public IRubyObject close() { + checkInitialized(); + checkOpen(); + + closedRead = true; + closedWrite = true; + + return getRuntime().getNil(); + } + + private void doFinalize() { + closedRead = true; + closedWrite = true; + internal = null; + } + + @JRubyMethod(name = "closed?") + public IRubyObject closed_p() { + checkInitialized(); + return getRuntime().newBoolean(closedRead && closedWrite); + } + + @JRubyMethod(name = "close_read") + public IRubyObject close_read() { + checkReadable(); + closedRead = true; + + return getRuntime().getNil(); + } + + @JRubyMethod(name = "closed_read?") + public IRubyObject closed_read_p() { + checkInitialized(); + return getRuntime().newBoolean(closedRead); + } + + @JRubyMethod(name = "close_write") + public IRubyObject close_write() { + checkWritable(); + closedWrite = true; + + return getRuntime().getNil(); + } + + @JRubyMethod(name = "closed_write?") + public IRubyObject closed_write_p() { + checkInitialized(); + return getRuntime().newBoolean(closedWrite); + } + + @JRubyMethod(name = "each", optional = 1, frame = true, writes = FrameField.LASTLINE) + public IRubyObject each(ThreadContext context, IRubyObject[] args, Block block) { + IRubyObject line = gets(context, args); + + while (!line.isNil()) { + block.yield(context, line); + line = gets(context, args); + } + + return this; + } + + @JRubyMethod(name = "each_byte", frame = true) + public IRubyObject each_byte(ThreadContext context, Block block) { + checkReadable(); + Ruby runtime = context.getRuntime(); + ByteList bytes = internal.getByteList(); + + // Check the length every iteration, since + // the block can modify this string. + while (pos < bytes.length()) { + block.yield(context, runtime.newFixnum(bytes.get((int) pos++) & 0xFF)); + } + return runtime.getNil(); + } + + @JRubyMethod(name = "each_line", optional = 1, frame = true) + public IRubyObject each_line(ThreadContext context, IRubyObject[] args, Block block) { + return each(context, args, block); + } + + @JRubyMethod(name = {"eof", "eof?"}) + public IRubyObject eof() { + return getRuntime().newBoolean(isEOF()); + } + + private boolean isEOF() { + return (pos >= internal.getByteList().length()) || eof; + } + + @JRubyMethod(name = "fcntl") + public IRubyObject fcntl() { + throw getRuntime().newNotImplementedError("fcntl not implemented"); + } + + @JRubyMethod(name = "fileno") + public IRubyObject fileno() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "flush") + public IRubyObject flush() { + return this; + } + + @JRubyMethod(name = "fsync") + public IRubyObject fsync() { + return RubyFixnum.zero(getRuntime()); + } + + @JRubyMethod(name = "getc") + public IRubyObject getc() { + checkReadable(); + if (pos >= internal.getByteList().length()) { + return getRuntime().getNil(); + } + return getRuntime().newFixnum(internal.getByteList().get((int)pos++) & 0xFF); + } + + private IRubyObject internalGets(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + + if (pos < internal.getByteList().realSize && !eof) { + boolean isParagraph = false; + + ByteList sep; + if (args.length > 0) { + if (args[0].isNil()) { + ByteList buf = internal.getByteList().makeShared( + (int)pos, internal.getByteList().realSize - (int)pos); + pos += buf.realSize; + return RubyString.newString(runtime, buf); + } + sep = args[0].convertToString().getByteList(); + if (sep.realSize == 0) { + isParagraph = true; + sep = Stream.PARAGRAPH_SEPARATOR; + } + } else { + sep = ((RubyString)runtime.getGlobalVariables().get("$/")).getByteList(); + } + + ByteList ss = internal.getByteList(); + + if (isParagraph) { + swallowLF(ss); + if (pos == ss.realSize) { + return runtime.getNil(); + } + } + + int ix = ss.indexOf(sep, (int)pos); + + ByteList add; + if (-1 == ix) { + ix = internal.getByteList().realSize; + add = new ByteList(new byte[0], false); + } else { + add = isParagraph? NEWLINE : sep; + } + + ByteList line = internal.getByteList().makeShared((int)pos, ix - (int)pos); + line.unshare(); + line.append(add); + line.invalidate(); + pos = ix + add.realSize; + lineno++; + + return RubyString.newString(runtime,line); + } + return runtime.getNil(); + } + + private void swallowLF(ByteList list) { + while (pos < list.realSize) { + if (list.get((int)pos) == '\n') { + pos++; + } else { + break; + } + } + } + + @JRubyMethod(name = "gets", optional = 1, writes = FrameField.LASTLINE) + public IRubyObject gets(ThreadContext context, IRubyObject[] args) { + checkReadable(); + + IRubyObject result = internalGets(context, args); + context.getCurrentFrame().setLastLine(result); + + return result; + } + + @JRubyMethod(name = {"tty?", "isatty"}) + public IRubyObject isatty() { + return getRuntime().getFalse(); + } + + @JRubyMethod(name = {"length", "size"}) + public IRubyObject length() { + checkFinalized(); + return getRuntime().newFixnum(internal.getByteList().length()); + } + + @JRubyMethod(name = "lineno") + public IRubyObject lineno() { + return getRuntime().newFixnum(lineno); + } + + @JRubyMethod(name = "lineno=", required = 1) + public IRubyObject set_lineno(IRubyObject arg) { + lineno = RubyNumeric.fix2int(arg); + + return getRuntime().getNil(); + } + + @JRubyMethod(name = "path") + public IRubyObject path() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "pid") + public IRubyObject pid() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = {"pos", "tell"}) + public IRubyObject pos() { + return getRuntime().newFixnum(pos); + } + + @JRubyMethod(name = "pos=", required = 1) + public IRubyObject set_pos(IRubyObject arg) { + pos = RubyNumeric.fix2int(arg); + if (pos < 0) { + throw getRuntime().newErrnoEINVALError("Invalid argument"); + } + + return getRuntime().getNil(); + } + + @JRubyMethod(name = "print", rest = true) + public IRubyObject print(ThreadContext context, IRubyObject[] args) { + Ruby runtime = context.getRuntime(); + if (args.length != 0) { + for (int i=0,j=args.length;i<j;i++) { + append(context, args[i]); + } + } else { + IRubyObject arg = runtime.getGlobalVariables().get("$_"); + append(context, arg.isNil() ? runtime.newString("nil") : arg); + } + IRubyObject sep = runtime.getGlobalVariables().get("$\\"); + if (!sep.isNil()) { + append(context, sep); + } + return getRuntime().getNil(); + } + + @JRubyMethod(name = "printf", required = 1, rest = true) + public IRubyObject printf(ThreadContext context, IRubyObject[] args) { + append(context, RubyKernel.sprintf(context, this, args)); + return getRuntime().getNil(); + } + + @JRubyMethod(name = "putc", required = 1) + public IRubyObject putc(IRubyObject obj) { + checkWritable(); + byte c = RubyNumeric.num2chr(obj); + checkFrozen(); + + internal.modify(); + ByteList bytes = internal.getByteList(); + if (modes.isAppendable()) { + pos = bytes.length(); + bytes.append(c); + } else { + if (pos >= bytes.length()) { + bytes.length((int)pos + 1); + } + + bytes.set((int) pos, c); + pos++; + } + + return obj; + } + + public static final ByteList NEWLINE = ByteList.create("\n"); + + @JRubyMethod(name = "puts", rest = true) + public IRubyObject puts(ThreadContext context, IRubyObject[] args) { + checkWritable(); + + // FIXME: the code below is a copy of RubyIO.puts, + // and we should avoid copy-paste. + + if (args.length == 0) { + callMethod(context, "write", RubyString.newStringShared(getRuntime(), NEWLINE)); + return getRuntime().getNil(); + } + + for (int i = 0; i < args.length; i++) { + String line; + + if (args[i].isNil()) { + line = "nil"; + } else { + IRubyObject tmp = args[i].checkArrayType(); + if (!tmp.isNil()) { + RubyArray arr = (RubyArray) tmp; + if (getRuntime().isInspecting(arr)) { + line = "[...]"; + } else { + inspectPuts(context, arr); + continue; + } + } else { + line = args[i].toString(); + } + } + + callMethod(context, "write", getRuntime().newString(line)); + + if (!line.endsWith("\n")) { + callMethod(context, "write", RubyString.newStringShared(getRuntime(), NEWLINE)); + } + } + return getRuntime().getNil(); + } + + private IRubyObject inspectPuts(ThreadContext context, RubyArray array) { + try { + getRuntime().registerInspecting(array); + return puts(context, array.toJavaArray()); + } finally { + getRuntime().unregisterInspecting(array); + } + } + + @SuppressWarnings("fallthrough") + @JRubyMethod(name = "read", optional = 2) + public IRubyObject read(IRubyObject[] args) { + checkReadable(); + + ByteList buf = null; + int length = 0; + int oldLength = 0; + RubyString originalString = null; + + switch (args.length) { + case 2: + originalString = args[1].convertToString(); + // must let original string know we're modifying, so shared buffers aren't damaged + originalString.modify(); + buf = originalString.getByteList(); + case 1: + if (!args[0].isNil()) { + length = RubyNumeric.fix2int(args[0]); + oldLength = length; + + if (length < 0) { + throw getRuntime().newArgumentError("negative length " + length + " given"); + } + if (length > 0 && pos >= internal.getByteList().length()) { + eof = true; + if (buf != null) buf.realSize = 0; + return getRuntime().getNil(); + } else if (eof) { + if (buf != null) buf.realSize = 0; + return getRuntime().getNil(); + } + break; + } + case 0: + oldLength = -1; + length = internal.getByteList().length(); + + if (length <= pos) { + eof = true; + if (buf == null) { + buf = new ByteList(); + } else { + buf.realSize = 0; + } + + return getRuntime().newString(buf); + } else { + length -= pos; + } + break; + default: + getRuntime().newArgumentError(args.length, 0); + } + + if (buf == null) { + int internalLength = internal.getByteList().length(); + + if (internalLength > 0) { + if (internalLength >= pos + length) { + buf = new ByteList(internal.getByteList(), (int) pos, length); + } else { + int rest = (int) (internal.getByteList().length() - pos); + + if (length > rest) length = rest; + buf = new ByteList(internal.getByteList(), (int) pos, length); + } + } + } else { + int rest = (int) (internal.getByteList().length() - pos); + + if (length > rest) length = rest; + + // Yow...this is ugly + buf.realSize = length; + buf.replace(0, length, internal.getByteList().bytes, (int) pos, length); + } + + if (buf == null) { + if (!eof) buf = new ByteList(); + length = 0; + } else { + length = buf.length(); + pos += length; + } + + if (oldLength < 0 || oldLength > length) eof = true; + + return originalString != null ? originalString : getRuntime().newString(buf); + } + + @JRubyMethod(name = "readchar") + public IRubyObject readchar() { + IRubyObject c = getc(); + + if (c.isNil()) throw getRuntime().newEOFError(); + + return c; + } + + @JRubyMethod(name = "readline", optional = 1, writes = FrameField.LASTLINE) + public IRubyObject readline(ThreadContext context, IRubyObject[] args) { + IRubyObject line = gets(context, args); + + if (line.isNil()) throw getRuntime().newEOFError(); + + return line; + } + + @JRubyMethod(name = "readlines", optional = 1) + public IRubyObject readlines(ThreadContext context, IRubyObject[] arg) { + checkReadable(); + + List<IRubyObject> lns = new ArrayList<IRubyObject>(); + while (!(isEOF())) { + IRubyObject line = internalGets(context, arg); + if (line.isNil()) { + break; + } + lns.add(line); + } + + return getRuntime().newArray(lns); + } + + @JRubyMethod(name = "reopen", required = 0, optional = 2) + public IRubyObject reopen(IRubyObject[] args) { + if (args.length == 1 && !(args[0] instanceof RubyString)) { + return initialize_copy(args[0]); + } + + // reset the state + doRewind(); + closedRead = false; + closedWrite = false; + return initialize(args, Block.NULL_BLOCK); + } + + @JRubyMethod(name = "rewind") + public IRubyObject rewind() { + doRewind(); + return RubyFixnum.zero(getRuntime()); + } + + private void doRewind() { + this.pos = 0L; + this.eof = false; + this.lineno = 0; + } + + @JRubyMethod(name = "seek", required = 1, optional = 1, frame=true) + public IRubyObject seek(IRubyObject[] args) { + // MRI 1.8.7 behavior: + // checkOpen(); + checkFinalized(); + long amount = RubyNumeric.num2long(args[0]); + int whence = Stream.SEEK_SET; + long newPosition = pos; + + if (args.length > 1 && !args[0].isNil()) whence = RubyNumeric.fix2int(args[1]); + + if (whence == Stream.SEEK_CUR) { + newPosition += amount; + } else if (whence == Stream.SEEK_END) { + newPosition = internal.getByteList().length() + amount; + } else { + newPosition = amount; + } + + if (newPosition < 0) throw getRuntime().newErrnoEINVALError(); + + pos = newPosition; + eof = false; + + return RubyFixnum.zero(getRuntime()); + } + + @JRubyMethod(name = "string=", required = 1) + public IRubyObject set_string(IRubyObject arg) { + return reopen(new IRubyObject[] { arg.convertToString() }); + } + + @JRubyMethod(name = "sync=", required = 1) + public IRubyObject set_sync(IRubyObject args) { + return args; + } + + @JRubyMethod(name = "string") + public IRubyObject string() { + if (internal == null) { + return getRuntime().getNil(); + } else { + return internal; + } + } + + @JRubyMethod(name = "sync") + public IRubyObject sync() { + return getRuntime().getTrue(); + } + + @JRubyMethod(name = "sysread", optional = 2) + public IRubyObject sysread(IRubyObject[] args) { + IRubyObject obj = read(args); + + if (isEOF()) { + if (obj.isNil() || ((RubyString) obj).getByteList().length() == 0) { + throw getRuntime().newEOFError(); + } + } + + return obj; + } + + @JRubyMethod(name = "truncate", required = 1) + public IRubyObject truncate(IRubyObject arg) { + checkWritable(); + + int len = RubyFixnum.fix2int(arg); + if (len < 0) { + throw getRuntime().newErrnoEINVALError("negative legnth"); + } + + internal.modify(); + internal.getByteList().length(len); + return arg; + } + + @JRubyMethod(name = "ungetc", required = 1) + public IRubyObject ungetc(IRubyObject arg) { + checkReadable(); + + int c = RubyNumeric.num2int(arg); + if (pos == 0) return getRuntime().getNil(); + internal.modify(); + pos--; + + ByteList bytes = internal.getByteList(); + + if (bytes.length() <= pos) { + bytes.length((int)pos + 1); + } + + bytes.set((int) pos, c); + return getRuntime().getNil(); + } + + @JRubyMethod(name = {"write", "syswrite"}, required = 1) + public IRubyObject write(ThreadContext context, IRubyObject arg) { + return context.getRuntime().newFixnum(writeInternal(context, arg)); + } + + private int writeInternal(ThreadContext context, IRubyObject arg) { + checkWritable(); + checkFrozen(); + + RubyString val = arg.asString(); + internal.modify(); + + if (modes.isAppendable()) { + internal.getByteList().append(val.getByteList()); + pos = internal.getByteList().length(); + } else { + int left = internal.getByteList().length()-(int)pos; + internal.getByteList().replace((int)pos,Math.min(val.getByteList().length(),left),val.getByteList()); + pos += val.getByteList().length(); + } + + if (val.isTaint()) { + internal.setTaint(true); + } + + return val.getByteList().length(); + } + + /* rb: check_modifiable */ + @Override + protected void checkFrozen() { + checkInitialized(); + if (internal.isFrozen()) throw getRuntime().newIOError("not modifiable string"); + } + + /* rb: readable */ + private void checkReadable() { + checkInitialized(); + if (closedRead || !modes.isReadable()) { + throw getRuntime().newIOError("not opened for reading"); + } + } + + /* rb: writable */ + private void checkWritable() { + checkInitialized(); + if (closedWrite || !modes.isWritable()) { + throw getRuntime().newIOError("not opened for writing"); + } + + // Tainting here if we ever want it. (secure 4) + } + + private void checkInitialized() { + if (modes == null) { + throw getRuntime().newIOError("uninitialized stream"); + } + } + + private void checkFinalized() { + if (internal == null) { + throw getRuntime().newIOError("not opened"); + } + } + + private void checkOpen() { + if (closedRead && closedWrite) { + throw getRuntime().newIOError("closed stream"); + } + } + + private void setupModes() { + closedWrite = false; + closedRead = false; + + if (modes.isReadOnly()) closedWrite = true; + if (!modes.isReadable()) closedRead = true; + } +} +package org.jruby; + +import org.joni.Matcher; +import org.joni.Option; +import org.joni.Regex; +import org.joni.Region; +import org.joni.encoding.Encoding; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.exceptions.RaiseException; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; + +/** + * @author kscott + * + */ +@JRubyClass(name="StringScanner") +public class RubyStringScanner extends RubyObject { + + private RubyString str; + private int pos = 0; + private int lastPos = -1; + + private Region regs; + private int beg = -1; + private int end = -1; + // not to be confused with RubyObject's flags + private int scannerFlags; + + private static final int MATCHED_STR_SCN_F = 1 << 11; + + private static ObjectAllocator STRINGSCANNER_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyStringScanner(runtime, klass); + } + }; + + public static RubyClass createScannerClass(final Ruby runtime) { + RubyClass scannerClass = runtime.defineClass("StringScanner", runtime.getObject(), STRINGSCANNER_ALLOCATOR); + scannerClass.defineAnnotatedMethods(RubyStringScanner.class); + ThreadContext context = runtime.getCurrentContext(); + scannerClass.setConstant("Version", runtime.newString("0.7.0").freeze(context)); + scannerClass.setConstant("Id", runtime.newString("$Id: strscan.c 13506 2007-09-24 08:56:24Z nobu $").freeze(context)); + + RubyClass standardError = runtime.getStandardError(); + RubyClass error = scannerClass.defineClassUnder( + "Error", standardError, standardError.getAllocator()); + + RubyClass objClass = runtime.getObject(); + if (!objClass.isConstantDefined("ScanError")) { + objClass.defineConstant("ScanError", error); + } + + return scannerClass; + } + + private void clearMatched() { + scannerFlags &= ~MATCHED_STR_SCN_F; + } + + private void setMatched() { + scannerFlags |= MATCHED_STR_SCN_F; + } + + private boolean isMatched() { + return (scannerFlags & MATCHED_STR_SCN_F) != 0; + } + + private void check() { + if (str == null) throw getRuntime().newArgumentError("uninitialized StringScanner object"); + } + + protected RubyStringScanner(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + // second argument is allowed, but ignored (MRI) + @JRubyMethod(name = "initialize", required = 1, optional = 1, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, Block unusedBlock) { + str = args[0].convertToString(); + return this; + } + + @JRubyMethod(name = "initialize_copy", frame=true, visibility = Visibility.PRIVATE) + @Override + public IRubyObject initialize_copy(IRubyObject other) { + if (this == other) return this; + if (!(other instanceof RubyStringScanner)) { + throw getRuntime().newTypeError("wrong argument type " + + other.getMetaClass() + " (expected StringScanner)"); + } + + RubyStringScanner otherScanner = (RubyStringScanner)other; + str = otherScanner.str; + pos = otherScanner.pos; + lastPos = otherScanner.lastPos; + scannerFlags = otherScanner.scannerFlags; + + regs = otherScanner.regs != null ? otherScanner.regs.clone() : null; + beg = otherScanner.beg; + end = otherScanner.end; + + return this; + } + + @JRubyMethod(name = "reset") + public IRubyObject reset() { + check(); + pos = 0; + clearMatched(); + return this; + } + + @JRubyMethod(name = "terminate") + public IRubyObject terminate() { + check(); + pos = str.getByteList().realSize; + clearMatched(); + return this; + } + + @JRubyMethod(name = "clear") + public IRubyObject clear() { + check(); + getRuntime().getWarnings().warning(ID.DEPRECATED_METHOD, "StringScanner#clear is obsolete; use #terminate instead", "StringScanner#clear", "#terminate"); + return terminate(); + } + + @JRubyMethod(name = "string") + public RubyString string() { + return str; + } + + @JRubyMethod(name = "string=", required = 1) + public IRubyObject set_string(ThreadContext context, IRubyObject str) { + this.str = (RubyString) str.convertToString().strDup(context.getRuntime()).freeze(context); + pos = 0; + clearMatched(); + return str; + } + + @JRubyMethod(name = {"concat", "<<"}, required = 1) + public IRubyObject concat(IRubyObject obj) { + check(); + str.append(obj); // append will call convertToString() + return this; + } + + @JRubyMethod(name = {"pos", "pointer"}) + public RubyFixnum pos() { + check(); + return RubyFixnum.newFixnum(getRuntime(), pos); + } + + @JRubyMethod(name = {"pos=", "pointer="}) + public IRubyObject set_pos(IRubyObject pos) { + check(); + int i = RubyNumeric.num2int(pos); + int size = str.getByteList().realSize; + if (i < 0) i += size; + if (i < 0 || i > size) throw getRuntime().newRangeError("index out of range."); + this.pos = i; + return RubyFixnum.newFixnum(getRuntime(), i); + } + + private IRubyObject extractRange(Ruby runtime, int beg, int end) { + int size = str.getByteList().realSize; + if (beg > size) return getRuntime().getNil(); + if (end > size) end = size; + return str.makeShared(runtime, beg, end - beg); + } + + private IRubyObject extractBegLen(Ruby runtime, int beg, int len) { + assert len >= 0; + int size = str.getByteList().realSize; + if (beg > size) return getRuntime().getNil(); + if (beg + len > size) len = size - beg; + return str.makeShared(runtime, beg, len); + } + + private IRubyObject scan(IRubyObject regex, boolean succptr, boolean getstr, boolean headonly) { + if (!(regex instanceof RubyRegexp)) throw getRuntime().newTypeError("wrong argument type " + regex.getMetaClass() + " (expected Regexp)"); + check(); + + Regex pattern = ((RubyRegexp)regex).getPattern(); + + clearMatched(); + int rest = str.getByteList().realSize - pos; + if (rest < 0) return getRuntime().getNil(); + + ByteList value = str.getByteList(); + Matcher matcher = pattern.matcher(value.bytes, value.begin + pos, value.begin + value.realSize); + + final int ret; + if (headonly) { + ret = matcher.match(value.begin + pos, value.begin + value.realSize, Option.NONE); + } else { + ret = matcher.search(value.begin + pos, value.begin + value.realSize, Option.NONE); + } + + regs = matcher.getRegion(); + if (regs == null) { + beg = matcher.getBegin(); + end = matcher.getEnd(); + } else { + beg = regs.beg[0]; + end = regs.end[0]; + } + + if (ret < 0) return getRuntime().getNil(); + setMatched(); + + lastPos = pos; + if (succptr) pos += end; + return getstr ? extractBegLen(getRuntime(), lastPos, end) : RubyFixnum.newFixnum(getRuntime(), end); + } + + @JRubyMethod(name = "scan", required = 1) + public IRubyObject scan(IRubyObject regex) { + return scan(regex, true, true, true); + } + + @JRubyMethod(name = "match?", required = 1) + public IRubyObject match_p(IRubyObject regex) { + return scan(regex, false, false, true); + } + + @JRubyMethod(name = "skip", required = 1) + public IRubyObject skip(IRubyObject regex) { + return scan(regex, true, false, true); + } + + @JRubyMethod(name = "check", required = 1) + public IRubyObject check(IRubyObject regex) { + return scan(regex, false, true, true); + } + + @JRubyMethod(name = "scan_full", required = 3) + public IRubyObject scan_full(IRubyObject regex, IRubyObject s, IRubyObject f) { + return scan(regex, s.isTrue(), f.isTrue(), true); + } + + @JRubyMethod(name = "scan_until", required = 1) + public IRubyObject scan_until(IRubyObject regex) { + return scan(regex, true, true, false); + } + + @JRubyMethod(name = "exist?", required = 1) + public IRubyObject exist_p(IRubyObject regex) { + return scan(regex, false, false, false); + } + + @JRubyMethod(name = "skip_until", required = 1) + public IRubyObject skip_until(IRubyObject regex) { + return scan(regex, true, false, false); + } + + @JRubyMethod(name = "check_until", required = 1) + public IRubyObject check_until(IRubyObject regex) { + return scan(regex, false, true, false); + } + + @JRubyMethod(name = "search_full", required = 3) + public IRubyObject search_full(IRubyObject regex, IRubyObject s, IRubyObject f) { + return scan(regex, s.isTrue(), f.isTrue(), false); + } + + private void adjustRegisters() { + beg = 0; + end = pos - lastPos; + regs = null; + } + + @JRubyMethod(name = "getch") + public IRubyObject getch(ThreadContext context) { + check(); + clearMatched(); + + Ruby runtime = context.getRuntime(); + ByteList value = str.getByteList(); + + if (pos >= value.realSize) return runtime.getNil(); + + Encoding enc = runtime.getKCode().getEncoding(); + + int len; + if (enc.isSingleByte()) { + len = 1; + } else { + len = enc.length(value.bytes[value.begin + pos]); + } + + if (pos + len > value.realSize) len = value.realSize - pos; + lastPos = pos; + pos += len; + + setMatched(); + adjustRegisters(); + + return extractRange(runtime, lastPos + beg, lastPos + end); + } + + @JRubyMethod(name = "get_byte") + public IRubyObject get_byte(ThreadContext context) { + check(); + clearMatched(); + if (pos >= str.getByteList().realSize) return getRuntime().getNil(); + + lastPos = pos; + pos++; + + setMatched(); + adjustRegisters(); + + return extractRange(context.getRuntime(), lastPos + beg, lastPos + end); + } + + @JRubyMethod(name = "getbyte") + public IRubyObject getbyte(ThreadContext context) { + context.getRuntime().getWarnings().warning(ID.DEPRECATED_METHOD, + "StringScanner#getbyte is obsolete; use #get_byte instead", + "StringScanner#getbyte", "#get_byte"); + return get_byte(context); + } + + @JRubyMethod(name = "peek", required = 1) + public IRubyObject peek(ThreadContext context, IRubyObject length) { + check(); + + int len = RubyNumeric.num2int(length); + if (len < 0) { + throw context.getRuntime().newArgumentError("negative string size (or size too big)"); + } + + ByteList value = str.getByteList(); + if (pos >= value.realSize) return RubyString.newEmptyString(getRuntime()).infectBy(str); + if (pos + len > value.realSize) len = value.realSize - pos; + + return extractBegLen(context.getRuntime(), pos, len); + } + + @JRubyMethod(name = "peep", required = 1) + public IRubyObject peep(ThreadContext context, IRubyObject length) { + getRuntime().getWarnings().warning( + ID.DEPRECATED_METHOD, "StringScanner#peep is obsolete; use #peek instead", + "StringScanner#peep", "#peek"); + return peek(context, length); + } + + @JRubyMethod(name = "unscan") + public IRubyObject unscan() { + check(); + Ruby runtime = getRuntime(); + + if (!isMatched()) { + RubyClass errorClass = runtime.fastGetClass("StringScanner").fastGetClass("Error"); + throw new RaiseException(RubyException.newException( + runtime, errorClass, "unscan failed: previous match had failed")); + } + pos = lastPos; + clearMatched(); + return this; + } + + @JRubyMethod(name = "beginning_of_line?", alias = "bol?") + public IRubyObject bol_p() { + check(); + ByteList value = str.getByteList(); + if (pos > value.realSize) return getRuntime().getNil(); + if (pos == 0) return getRuntime().getTrue(); + return value.bytes[(value.begin + pos) - 1] == (byte)'\n' ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "eos?") + public RubyBoolean eos_p(ThreadContext context) { + check(); + return pos >= str.getByteList().realSize ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + @JRubyMethod(name = "empty?") + public RubyBoolean empty_p(ThreadContext context) { + getRuntime().getWarnings().warning(ID.DEPRECATED_METHOD, "StringScanner#empty? is obsolete; use #eos? instead", "StringScanner#empty?", "#eos?"); + return eos_p(context); + } + + @JRubyMethod(name = "rest?") + public RubyBoolean rest_p(ThreadContext context) { + check(); + return pos >= str.getByteList().realSize ? context.getRuntime().getFalse() : context.getRuntime().getTrue(); + } + + @JRubyMethod(name = "matched?") + public RubyBoolean matched_p(ThreadContext context) { + check(); + return isMatched() ? context.getRuntime().getTrue() : context.getRuntime().getFalse(); + } + + @JRubyMethod(name = "matched") + public IRubyObject matched(ThreadContext context) { + check(); + if (!isMatched()) return getRuntime().getNil(); + return extractRange(context.getRuntime(), lastPos + beg, lastPos + end); + } + + @JRubyMethod(name = "matched_size") + public IRubyObject matched_size() { + check(); + if (!isMatched()) return getRuntime().getNil(); + return RubyFixnum.newFixnum(getRuntime(), end - beg); + } + + @JRubyMethod(name = "matchedsize") + public IRubyObject matchedsize() { + getRuntime().getWarnings().warning(ID.DEPRECATED_METHOD, "StringScanner#matchedsize is obsolete; use #matched_size instead", + "StringScanner#matchedize", "#matched_size"); + return matched_size(); + } + + @JRubyMethod(name = "[]", required = 1) + public IRubyObject op_aref(ThreadContext context, IRubyObject idx) { + check(); + if (!isMatched()) return context.getRuntime().getNil(); + int i = RubyNumeric.num2int(idx); + + int numRegs = regs == null ? 1 : regs.numRegs; + if (i < 0) i += numRegs; + if (i < 0 || i >= numRegs) return context.getRuntime().getNil(); + + if (regs == null) { + assert i == 0; + if (beg == -1) return getRuntime().getNil(); + return extractRange(context.getRuntime(), lastPos + beg, lastPos + end); + } else { + if (regs.beg[i] == -1) return getRuntime().getNil(); + return extractRange(context.getRuntime(), lastPos + regs.beg[i], lastPos + regs.end[i]); + } + } + + @JRubyMethod(name = "pre_match") + public IRubyObject pre_match(ThreadContext context) { + check(); + if (!isMatched()) return context.getRuntime().getNil(); + return extractRange(context.getRuntime(), 0, lastPos + beg); + } + + @JRubyMethod(name = "post_match") + public IRubyObject post_match(ThreadContext context) { + check(); + if (!isMatched()) return context.getRuntime().getNil(); + return extractRange(context.getRuntime(), lastPos + end, str.getByteList().realSize); + } + + @JRubyMethod(name = "rest") + public IRubyObject rest(ThreadContext context) { + check(); + ByteList value = str.getByteList(); + if (pos >= value.realSize) return RubyString.newEmptyString(context.getRuntime()).infectBy(str); + return extractRange(context.getRuntime(), pos, value.realSize); + } + + @JRubyMethod(name = "rest_size") + public RubyFixnum rest_size() { + check(); + ByteList value = str.getByteList(); + if (pos >= value.realSize) return RubyFixnum.zero(getRuntime()); + return RubyFixnum.newFixnum(getRuntime(), value.realSize - pos); + } + + @JRubyMethod(name = "restsize") + public RubyFixnum restsize() { + getRuntime().getWarnings().warning(ID.DEPRECATED_METHOD, "StringScanner#restsize is obsolete; use #rest_size instead", "StringScanner#restsize", "#rest_size"); + return rest_size(); + } + + @JRubyMethod(name = "inspect") + @Override + public IRubyObject inspect() { + if (str == null) return inspect("(uninitialized)"); + if (pos >= str.getByteList().realSize) return inspect("fin"); + if (pos == 0) return inspect(pos + "/" + str.getByteList().realSize + " @ " + inspect2()); + return inspect(pos + "/" + str.getByteList().realSize + " " + inspect1() + " @ " + inspect2()); + } + + private IRubyObject inspect(String msg) { + IRubyObject result = getRuntime().newString("#<" + getMetaClass() + " " + msg + ">"); + if (str != null) result.infectBy(str); + return result; + } + + private static final int INSPECT_LENGTH = 5; + + private IRubyObject inspect1() { + if (pos == 0) return RubyString.newEmptyString(getRuntime()); + if (pos > INSPECT_LENGTH) { + return RubyString.newString(getRuntime(), "...".getBytes()).append(str.substr(pos - INSPECT_LENGTH, INSPECT_LENGTH)).inspect(); + } else { + return str.substr(0, pos).inspect(); + } + } + + private IRubyObject inspect2() { + if (pos >= str.getByteList().realSize) return RubyString.newEmptyString(getRuntime()); + int len = str.getByteList().realSize - pos; + if (len > INSPECT_LENGTH) { + return ((RubyString)str.substr(pos, INSPECT_LENGTH)).cat("...".getBytes()).inspect(); + } else { + return str.substr(pos, len).inspect(); + } + } + + @JRubyMethod(name = "must_C_version", meta = true) + public static IRubyObject mustCversion(IRubyObject recv) { + return recv; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2005 Charles O Nutter <headius@headius.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.util.List; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.Frame; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.ByteList; +import org.jruby.util.IdUtil; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.exceptions.RaiseException; +import org.jruby.internal.runtime.methods.CallConfiguration; +import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.runtime.ClassIndex; + +/** + * @author jpetersen + */ +@JRubyClass(name="Struct") +public class RubyStruct extends RubyObject { + private IRubyObject[] values; + + /** + * Constructor for RubyStruct. + * @param runtime + * @param rubyClass + */ + public RubyStruct(Ruby runtime, RubyClass rubyClass) { + super(runtime, rubyClass); + + int size = RubyNumeric.fix2int(getInternalVariable((RubyClass)rubyClass, "__size__")); + + values = new IRubyObject[size]; + + for (int i = 0; i < size; i++) { + values[i] = getRuntime().getNil(); + } + } + + public static RubyClass createStructClass(Ruby runtime) { + // TODO: NOT_ALLOCATABLE_ALLOCATOR may be ok here, but it's unclear how Structs + // work with marshalling. Confirm behavior and ensure we're doing this correctly. JRUBY-415 + RubyClass structClass = runtime.defineClass("Struct", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setStructClass(structClass); + structClass.index = ClassIndex.STRUCT; + structClass.includeModule(runtime.getEnumerable()); + structClass.defineAnnotatedMethods(RubyStruct.class); + + return structClass; + } + + @Override + public int getNativeTypeIndex() { + return ClassIndex.STRUCT; + } + + private static IRubyObject getInternalVariable(RubyClass type, String internedName) { + RubyClass structClass = type.getRuntime().getStructClass(); + IRubyObject variable; + + while (type != null && type != structClass) { + if ((variable = type.fastGetInternalVariable(internedName)) != null) { + return variable; + } + + type = type.getSuperClass(); + } + + return type.getRuntime().getNil(); + } + + private RubyClass classOf() { + return getMetaClass() instanceof MetaClass ? getMetaClass().getSuperClass() : getMetaClass(); + } + + private void modify() { + testFrozen("Struct is frozen"); + + if (!isTaint() && getRuntime().getSafeLevel() >= 4) { + throw getRuntime().newSecurityError("Insecure: can't modify struct"); + } + } + + @JRubyMethod + public RubyFixnum hash(ThreadContext context) { + Ruby runtime = getRuntime(); + int h = getMetaClass().getRealClass().hashCode(); + + for (int i = 0; i < values.length; i++) { + h = (h << 1) | (h < 0 ? 1 : 0); + h ^= RubyNumeric.num2long(values[i].callMethod(context, MethodIndex.HASH, "hash")); + } + + return runtime.newFixnum(h); + } + + private IRubyObject setByName(String name, IRubyObject value) { + RubyArray member = (RubyArray) getInternalVariable(classOf(), "__member__"); + + assert !member.isNil() : "uninitialized struct"; + + modify(); + + for (int i = 0,k=member.getLength(); i < k; i++) { + if (member.eltInternal(i).asJavaString().equals(name)) { + return values[i] = value; + } + } + + throw notStructMemberError(name); + } + + private IRubyObject getByName(String name) { + RubyArray member = (RubyArray) getInternalVariable(classOf(), "__member__"); + + assert !member.isNil() : "uninitialized struct"; + + for (int i = 0,k=member.getLength(); i < k; i++) { + if (member.eltInternal(i).asJavaString().equals(name)) { + return values[i]; + } + } + + throw notStructMemberError(name); + } + + // Struct methods + + /** Create new Struct class. + * + * MRI: rb_struct_s_def / make_struct + * + */ + @JRubyMethod(name = "new", required = 1, rest = true, frame = true, meta = true) + public static RubyClass newInstance(IRubyObject recv, IRubyObject[] args, Block block) { + String name = null; + boolean nilName = false; + Ruby runtime = recv.getRuntime(); + + if (args.length > 0) { + IRubyObject firstArgAsString = args[0].checkStringType(); + if (!firstArgAsString.isNil()) { + name = ((RubyString)firstArgAsString).getByteList().toString(); + } else if (args[0].isNil()) { + nilName = true; + } + } + + RubyArray member = runtime.newArray(); + + for (int i = (name == null && !nilName) ? 0 : 1; i < args.length; i++) { + member.append(runtime.newSymbol(args[i].asJavaString())); + } + + RubyClass newStruct; + RubyClass superClass = (RubyClass)recv; + + if (name == null || nilName) { + newStruct = RubyClass.newClass(runtime, superClass); + newStruct.setAllocator(STRUCT_INSTANCE_ALLOCATOR); + newStruct.makeMetaClass(superClass.getMetaClass()); + newStruct.inherit(superClass); + } else { + if (!IdUtil.isConstant(name)) { + throw runtime.newNameError("identifier " + name + " needs to be constant", name); + } + + IRubyObject type = superClass.getConstantAt(name); + if (type != null) { + ThreadContext context = runtime.getCurrentContext(); + Frame frame = context.getCurrentFrame(); + runtime.getWarnings().warn(ID.STRUCT_CONSTANT_REDEFINED, frame.getFile(), frame.getLine(), "redefining constant Struct::" + name, name); + superClass.remove_const(context, runtime.newString(name)); + } + newStruct = superClass.defineClassUnder(name, superClass, STRUCT_INSTANCE_ALLOCATOR); + } + + newStruct.index = ClassIndex.STRUCT; + + newStruct.fastSetInternalVariable("__size__", member.length()); + newStruct.fastSetInternalVariable("__member__", member); + + newStruct.getSingletonClass().defineAnnotatedMethods(StructMethods.class); + + // define access methods. + for (int i = (name == null && !nilName) ? 0 : 1; i < args.length; i++) { + final String memberName = args[i].asJavaString(); + // if we are storing a name as well, index is one too high for values + final int index = (name == null && !nilName) ? i : i - 1; + newStruct.addMethod(memberName, new DynamicMethod(newStruct, Visibility.PUBLIC, CallConfiguration.NO_FRAME_NO_SCOPE) { + @Override + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject[] args, Block block) { + Arity.checkArgumentCount(self.getRuntime(), args, 0, 0); + return ((RubyStruct)self).get(index); + } + + @Override + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name) { + return ((RubyStruct)self).get(index); + } + + @Override + public DynamicMethod dup() { + return this; + } + }); + newStruct.addMethod(memberName + "=", new DynamicMethod(newStruct, Visibility.PUBLIC, CallConfiguration.NO_FRAME_NO_SCOPE) { + @Override + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject[] args, Block block) { + Arity.checkArgumentCount(self.getRuntime(), args, 1, 1); + return ((RubyStruct)self).set(args[0], index); + } + + @Override + public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject arg) { + return ((RubyStruct)self).set(arg, index); + } + + @Override + public DynamicMethod dup() { + return this; + } + }); + } + + if (block.isGiven()) { + // Struct bodies should be public by default, so set block visibility to public. JRUBY-1185. + block.getBinding().setVisibility(Visibility.PUBLIC); + block.yield(runtime.getCurrentContext(), null, newStruct, newStruct, false); + } + + return newStruct; + } + + // For binding purposes on the newly created struct types + public static class StructMethods { + @JRubyMethod(name = {"new", "[]"}, rest = true, frame = true) + public static IRubyObject newStruct(IRubyObject recv, IRubyObject[] args, Block block) { + return RubyStruct.newStruct(recv, args, block); + } + + @JRubyMethod + public static IRubyObject members(IRubyObject recv, Block block) { + return RubyStruct.members(recv, block); + } + } + + /** Create new Structure. + * + * MRI: struct_alloc + * + */ + public static RubyStruct newStruct(IRubyObject recv, IRubyObject[] args, Block block) { + RubyStruct struct = new RubyStruct(recv.getRuntime(), (RubyClass) recv); + + struct.callInit(args, block); + + return struct; + } + + @JRubyMethod(rest = true, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, Block unusedBlock) { + modify(); + + int size = RubyNumeric.fix2int(getInternalVariable(getMetaClass(), "__size__")); + + if (args.length > size) { + throw getRuntime().newArgumentError("struct size differs (" + args.length +" for " + size + ")"); + } + + for (int i = 0; i < args.length; i++) { + values[i] = args[i]; + } + + return getRuntime().getNil(); + } + + public static RubyArray members(IRubyObject recv, Block block) { + RubyArray member = (RubyArray) getInternalVariable((RubyClass) recv, "__member__"); + + assert !member.isNil() : "uninitialized struct"; + + RubyArray result = recv.getRuntime().newArray(member.getLength()); + for (int i = 0,k=member.getLength(); i < k; i++) { + result.append(recv.getRuntime().newString(member.eltInternal(i).asJavaString())); + } + + return result; + } + + @JRubyMethod + public RubyArray members() { + return members(classOf(), Block.NULL_BLOCK); + } + + @JRubyMethod + public RubyArray select(ThreadContext context, Block block) { + RubyArray array = RubyArray.newArray(context.getRuntime()); + + for (int i = 0; i < values.length; i++) { + if (block.yield(context, values[i]).isTrue()) { + array.append(values[i]); + } + } + + return array; + } + + public IRubyObject set(IRubyObject value, int index) { + RubyArray member = (RubyArray) getInternalVariable(classOf(), "__member__"); + + assert !member.isNil() : "uninitialized struct"; + + modify(); + + return values[index] = value; + } + + private RaiseException notStructMemberError(String name) { + return getRuntime().newNameError(name + " is not struct member", name); + } + + public IRubyObject get(int index) { + RubyArray member = (RubyArray) getInternalVariable(classOf(), "__member__"); + + assert !member.isNil() : "uninitialized struct"; + + return values[index]; + } + + @Override + public void copySpecialInstanceVariables(IRubyObject clone) { + RubyStruct struct = (RubyStruct)clone; + struct.values = new IRubyObject[values.length]; + System.arraycopy(values, 0, struct.values, 0, values.length); + } + + @JRubyMethod(name = "==", required = 1) + public IRubyObject op_equal(ThreadContext context, IRubyObject other) { + if (this == other) return getRuntime().getTrue(); + if (!(other instanceof RubyStruct)) return getRuntime().getFalse(); + if (getMetaClass().getRealClass() != other.getMetaClass().getRealClass()) return getRuntime().getFalse(); + + Ruby runtime = getRuntime(); + RubyStruct otherStruct = (RubyStruct)other; + for (int i = 0; i < values.length; i++) { + if (!equalInternal(context, values[i], otherStruct.values[i])) return runtime.getFalse(); + } + return runtime.getTrue(); + } + + @JRubyMethod(name = "eql?", required = 1) + public IRubyObject eql_p(ThreadContext context, IRubyObject other) { + if (this == other) return getRuntime().getTrue(); + if (!(other instanceof RubyStruct)) return getRuntime().getFalse(); + if (getMetaClass() != other.getMetaClass()) return getRuntime().getFalse(); + + Ruby runtime = getRuntime(); + RubyStruct otherStruct = (RubyStruct)other; + for (int i = 0; i < values.length; i++) { + if (!eqlInternal(context, values[i], otherStruct.values[i])) return runtime.getFalse(); + } + return runtime.getTrue(); + } + + /** inspect_struct + * + */ + private IRubyObject inspectStruct(final ThreadContext context) { + RubyArray member = (RubyArray) getInternalVariable(classOf(), "__member__"); + + assert !member.isNil() : "uninitialized struct"; + + ByteList buffer = new ByteList("#<struct ".getBytes()); + buffer.append(getMetaClass().getRealClass().getRealClass().getName().getBytes()); + buffer.append(' '); + + for (int i = 0,k=member.getLength(); i < k; i++) { + if (i > 0) buffer.append(',').append(' '); + // FIXME: MRI has special case for constants here + buffer.append(RubyString.objAsString(context, member.eltInternal(i)).getByteList()); + buffer.append('='); + buffer.append(inspect(context, values[i]).getByteList()); + } + + buffer.append('>'); + return getRuntime().newString(buffer); // OBJ_INFECT + } + + @JRubyMethod(name = {"inspect", "to_s"}) + public IRubyObject inspect(ThreadContext context) { + if (getRuntime().isInspecting(this)) return getRuntime().newString("#<struct " + getMetaClass().getRealClass().getName() + ":...>"); + + try { + getRuntime().registerInspecting(this); + return inspectStruct(context); + } finally { + getRuntime().unregisterInspecting(this); + } + } + + @JRubyMethod(name = {"to_a", "values"}) + public RubyArray to_a() { + return getRuntime().newArray(values); + } + + @JRubyMethod(name = {"size", "length"} ) + public RubyFixnum size() { + return getRuntime().newFixnum(values.length); + } + + @JRubyMethod(name = "each", backtrace = true) + public IRubyObject each(ThreadContext context, Block block) { + for (int i = 0; i < values.length; i++) { + block.yield(context, values[i]); + } + + return this; + } + + @JRubyMethod(frame = true) + public IRubyObject each_pair(ThreadContext context, Block block) { + RubyArray member = (RubyArray) getInternalVariable(classOf(), "__member__"); + + assert !member.isNil() : "uninitialized struct"; + + for (int i = 0; i < values.length; i++) { + block.yield(context, getRuntime().newArrayNoCopy(new IRubyObject[]{member.eltInternal(i), values[i]})); + } + + return this; + } + + @JRubyMethod(name = "[]", required = 1) + public IRubyObject aref(IRubyObject key) { + if (key instanceof RubyString || key instanceof RubySymbol) { + return getByName(key.asJavaString()); + } + + int idx = RubyNumeric.fix2int(key); + + idx = idx < 0 ? values.length + idx : idx; + + if (idx < 0) { + throw getRuntime().newIndexError("offset " + idx + " too large for struct (size:" + values.length + ")"); + } else if (idx >= values.length) { + throw getRuntime().newIndexError("offset " + idx + " too large for struct (size:" + values.length + ")"); + } + + return values[idx]; + } + + @JRubyMethod(name = "[]=", required = 2) + public IRubyObject aset(IRubyObject key, IRubyObject value) { + if (key instanceof RubyString || key instanceof RubySymbol) { + return setByName(key.asJavaString(), value); + } + + int idx = RubyNumeric.fix2int(key); + + idx = idx < 0 ? values.length + idx : idx; + + if (idx < 0) { + throw getRuntime().newIndexError("offset " + idx + " too large for struct (size:" + values.length + ")"); + } else if (idx >= values.length) { + throw getRuntime().newIndexError("offset " + idx + " too large for struct (size:" + values.length + ")"); + } + + modify(); + return values[idx] = value; + } + + // FIXME: This is copied code from RubyArray. Both RE, Struct, and Array should share one impl + // This is also hacky since I construct ruby objects to access ruby arrays through aref instead + // of something lower. + @JRubyMethod(rest = true) + public IRubyObject values_at(IRubyObject[] args) { + long olen = values.length; + RubyArray result = getRuntime().newArray(args.length); + + for (int i = 0; i < args.length; i++) { + if (args[i] instanceof RubyFixnum) { + result.append(aref(args[i])); + continue; + } + + long beglen[]; + if (!(args[i] instanceof RubyRange)) { + } else if ((beglen = ((RubyRange) args[i]).begLen(olen, 0)) == null) { + continue; + } else { + int beg = (int) beglen[0]; + int len = (int) beglen[1]; + int end = len; + for (int j = 0; j < end; j++) { + result.append(aref(getRuntime().newFixnum(j + beg))); + } + continue; + } + result.append(aref(getRuntime().newFixnum(RubyNumeric.num2long(args[i])))); + } + + return result; + } + + public static void marshalTo(RubyStruct struct, MarshalStream output) throws java.io.IOException { + output.registerLinkTarget(struct); + output.dumpDefaultObjectHeader('S', struct.getMetaClass()); + + List members = ((RubyArray) getInternalVariable(struct.classOf(), "__member__")).getList(); + output.writeInt(members.size()); + + for (int i = 0; i < members.size(); i++) { + RubySymbol name = (RubySymbol) members.get(i); + output.dumpObject(name); + output.dumpObject(struct.values[i]); + } + } + + public static RubyStruct unmarshalFrom(UnmarshalStream input) throws java.io.IOException { + Ruby runtime = input.getRuntime(); + + RubySymbol className = (RubySymbol) input.unmarshalObject(); + RubyClass rbClass = pathToClass(runtime, className.asJavaString()); + if (rbClass == null) { + throw runtime.newNameError("uninitialized constant " + className, className.asJavaString()); + } + + RubyArray mem = members(rbClass, Block.NULL_BLOCK); + + int len = input.unmarshalInt(); + IRubyObject[] values = new IRubyObject[len]; + for(int i = 0; i < len; i++) { + values[i] = runtime.getNil(); + } + RubyStruct result = newStruct(rbClass, values, Block.NULL_BLOCK); + input.registerLinkTarget(result); + for(int i = 0; i < len; i++) { + IRubyObject slot = input.unmarshalObject(); + if(!mem.eltInternal(i).toString().equals(slot.toString())) { + throw runtime.newTypeError("struct " + rbClass.getName() + " not compatible (:" + slot + " for :" + mem.eltInternal(i) + ")"); + } + result.aset(runtime.newFixnum(i), input.unmarshalObject()); + } + return result; + } + + private static RubyClass pathToClass(Ruby runtime, String path) { + // FIXME: Throw the right ArgumentError's if the class is missing + // or if it's a module. + return (RubyClass) runtime.getClassFromPath(path); + } + + private static ObjectAllocator STRUCT_INSTANCE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + RubyStruct instance = new RubyStruct(runtime, klass); + + instance.setMetaClass(klass); + + return instance; + } + }; + + @Override + @JRubyMethod(required = 1) + public IRubyObject initialize_copy(IRubyObject arg) { + if (this == arg) return this; + RubyStruct original = (RubyStruct) arg; + + values = new IRubyObject[original.values.length]; + System.arraycopy(original.values, 0, values, 0, original.values.length); + + return this; + } + +} +/* + ***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Alan Moore <alan_moore@gmx.net> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Joey Gibson <joey@joeygibson.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Derek Berner <derek.berner@state.nm.us> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * Copyright (C) 2007 William N Dortch <bill.dortch@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.util.concurrent.locks.ReentrantLock; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Block; +import org.jruby.runtime.BlockCallback; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.marshal.UnmarshalStream; +import org.jruby.util.ByteList; + +/** + * Represents a Ruby symbol (e.g. :bar) + */ +@JRubyClass(name="Symbol") +public class RubySymbol extends RubyObject { + private final String symbol; + private final int id; + private final ByteList symbolBytes; + + /** + * + * @param runtime + * @param internedSymbol the String value of the new Symbol. This <em>must</em> + * have been previously interned + */ + private RubySymbol(Ruby runtime, String internedSymbol) { + super(runtime, runtime.getSymbol(), false); + // symbol string *must* be interned + + assert internedSymbol == internedSymbol.intern() : internedSymbol + " is not interned"; + + this.symbol = internedSymbol; + this.symbolBytes = ByteList.create(symbol); + + this.id = runtime.allocSymbolId(); + } + + public static RubyClass createSymbolClass(Ruby runtime) { + RubyClass symbolClass = runtime.defineClass("Symbol", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setSymbol(symbolClass); + RubyClass symbolMetaClass = symbolClass.getMetaClass(); + symbolClass.index = ClassIndex.SYMBOL; + symbolClass.kindOf = new RubyModule.KindOf() { + public boolean isKindOf(IRubyObject obj, RubyModule type) { + return obj instanceof RubySymbol; + } + }; + + symbolClass.defineAnnotatedMethods(RubySymbol.class); + symbolMetaClass.undefineMethod("new"); + + return symbolClass; + } + + @Override + public int getNativeTypeIndex() { + return ClassIndex.SYMBOL; + } + + /** rb_to_id + * + * @return a String representation of the symbol + */ + @Override + public String asJavaString() { + return symbol; + } + + /** short circuit for Symbol key comparison + * + */ + @Override + public final boolean eql(IRubyObject other) { + return other == this; + } + + @Override + public boolean isImmediate() { + return true; + } + + @Override + public RubyClass getSingletonClass() { + throw getRuntime().newTypeError("can't define singleton"); + } + + public static RubySymbol getSymbolLong(Ruby runtime, long id) { + return runtime.getSymbolTable().lookup(id); + } + + /* Symbol class methods. + * + */ + + public static RubySymbol newSymbol(Ruby runtime, String name) { + return runtime.getSymbolTable().getSymbol(name); + } + + @JRubyMethod(name = "to_i") + public RubyFixnum to_i() { + return getRuntime().newFixnum(id); + } + + @JRubyMethod(name = "to_int") + public RubyFixnum to_int() { + if (getRuntime().getVerbose().isTrue()) { + getRuntime().getWarnings().warn(ID.SYMBOL_AS_INTEGER, "treating Symbol as an integer"); + } + return to_i(); + } + + @JRubyMethod(name = "inspect") + @Override + public IRubyObject inspect() { + Ruby runtime = getRuntime(); + return runtime.newString(":" + + (isSymbolName(symbol) ? symbol : RubyString.newStringShared(runtime, symbolBytes).dump().toString())); + } + + @JRubyMethod(name = "to_s") + @Override + public IRubyObject to_s() { + return RubyString.newStringShared(getRuntime(), symbolBytes); + } + + @JRubyMethod(name = "id2name") + public IRubyObject id2name() { + return to_s(); + } + + @JRubyMethod(name = "===", required = 1) + @Override + public IRubyObject op_eqq(ThreadContext context, IRubyObject other) { + return super.op_equal(context, other); + } + + @Override + public RubyFixnum hash() { + return getRuntime().newFixnum(hashCode()); + } + + @Override + public int hashCode() { + return id; + } + + public int getId() { + return id; + } + + @Override + public boolean equals(Object other) { + return other == this; + } + + @JRubyMethod(name = "to_sym") + public IRubyObject to_sym() { + return this; + } + + @Override + public IRubyObject freeze(ThreadContext context) { + return this; + } + + @Override + public IRubyObject taint(ThreadContext context) { + return this; + } + + private static class ToProcCallback implements BlockCallback { + private RubySymbol symbol; + public ToProcCallback(RubySymbol symbol) { + this.symbol = symbol; + } + + public IRubyObject call(ThreadContext ctx, IRubyObject[] args, Block blk) { + IRubyObject[] currentArgs = args; + switch(currentArgs.length) { + case 0: throw symbol.getRuntime().newArgumentError("no receiver given"); + case 1: { + if((currentArgs[0] instanceof RubyArray) && ((RubyArray)currentArgs[0]).getLength() != 0) { + // This is needed to unpack stuff + currentArgs = ((RubyArray)currentArgs[0]).toJavaArrayMaybeUnsafe(); + IRubyObject[] args2 = new IRubyObject[currentArgs.length-1]; + System.arraycopy(currentArgs, 1, args2, 0, args2.length); + return RuntimeHelpers.invoke(ctx, currentArgs[0], symbol.symbol, args2); + } else { + return RuntimeHelpers.invoke(ctx, currentArgs[0], symbol.symbol); + } + } + default: { + IRubyObject[] args2 = new IRubyObject[currentArgs.length-1]; + System.arraycopy(currentArgs, 1, args2, 0, args2.length); + return RuntimeHelpers.invoke(ctx, currentArgs[0], symbol.symbol, args2); + } + } + } + } + /* + @JRubyMethod + public IRubyObject to_proc() { + return RubyProc.newProc(getRuntime(), + CallBlock.newCallClosure(this, getRuntime().getSymbol(), Arity.noArguments(), new ToProcCallback(this), getRuntime().getCurrentContext()), + Block.Type.PROC); + } + */ + private static boolean isIdentStart(char c) { + return ((c >= 'a' && c <= 'z')|| (c >= 'A' && c <= 'Z') + || c == '_'); + } + private static boolean isIdentChar(char c) { + return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') + || c == '_'); + } + + private static boolean isIdentifier(String s) { + if (s == null || s.length() <= 0) { + return false; + } + + if (!isIdentStart(s.charAt(0))) { + return false; + } + for (int i = 1; i < s.length(); i++) { + if (!isIdentChar(s.charAt(i))) { + return false; + } + } + + return true; + } + + /** + * is_special_global_name from parse.c. + * @param s + * @return + */ + private static boolean isSpecialGlobalName(String s) { + if (s == null || s.length() <= 0) { + return false; + } + + int length = s.length(); + + switch (s.charAt(0)) { + case '~': case '*': case '$': case '?': case '!': case '@': case '/': case '\\': + case ';': case ',': case '.': case '=': case ':': case '<': case '>': case '\"': + case '&': case '`': case '\'': case '+': case '0': + return length == 1; + case '-': + return (length == 1 || (length == 2 && isIdentChar(s.charAt(1)))); + + default: + // we already confirmed above that length > 0 + for (int i = 0; i < length; i++) { + if (!Character.isDigit(s.charAt(i))) { + return false; + } + } + } + return true; + } + + private static boolean isSymbolName(String s) { + if (s == null || s.length() < 1) { + return false; + } + + int length = s.length(); + + char c = s.charAt(0); + switch (c) { + case '$': + if (length > 1 && isSpecialGlobalName(s.substring(1))) { + return true; + } + return isIdentifier(s.substring(1)); + case '@': + int offset = 1; + if (length >= 2 && s.charAt(1) == '@') { + offset++; + } + + return isIdentifier(s.substring(offset)); + case '<': + return (length == 1 || (length == 2 && (s.equals("<<") || s.equals("<="))) || + (length == 3 && s.equals("<=>"))); + case '>': + return (length == 1) || (length == 2 && (s.equals(">>") || s.equals(">="))); + case '=': + return ((length == 2 && (s.equals("==") || s.equals("=~"))) || + (length == 3 && s.equals("==="))); + case '*': + return (length == 1 || (length == 2 && s.equals("**"))); + case '+': + return (length == 1 || (length == 2 && s.equals("+@"))); + case '-': + return (length == 1 || (length == 2 && s.equals("-@"))); + case '|': case '^': case '&': case '/': case '%': case '~': case '`': + return length == 1; + case '[': + return s.equals("[]") || s.equals("[]="); + } + + if (!isIdentStart(c)) { + return false; + } + + boolean localID = (c >= 'a' && c <= 'z'); + int last = 1; + + for (; last < length; last++) { + char d = s.charAt(last); + + if (!isIdentChar(d)) { + break; + } + } + + if (last == length) { + return true; + } else if (localID && last == length - 1) { + char d = s.charAt(last); + + return d == '!' || d == '?' || d == '='; + } + + return false; + } + + @JRubyMethod(name = "all_symbols", meta = true) + public static IRubyObject all_symbols(IRubyObject recv) { + return recv.getRuntime().getSymbolTable().all_symbols(); + } + + public static RubySymbol unmarshalFrom(UnmarshalStream input) throws java.io.IOException { + RubySymbol result = newSymbol(input.getRuntime(), RubyString.byteListToString(input.unmarshalString())); + input.registerLinkTarget(result); + return result; + } + + public static class SymbolTable { + static final int DEFAULT_INITIAL_CAPACITY = 2048; // *must* be power of 2! + static final int MAXIMUM_CAPACITY = 1 << 30; + static final float DEFAULT_LOAD_FACTOR = 0.75f; + + private final ReentrantLock tableLock = new ReentrantLock(); + private volatile SymbolEntry[] symbolTable; + private int size; + private int threshold; + private final float loadFactor; + private final Ruby runtime; + + public SymbolTable(Ruby runtime) { + this.runtime = runtime; + this.loadFactor = DEFAULT_LOAD_FACTOR; + this.threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); + this.symbolTable = new SymbolEntry[DEFAULT_INITIAL_CAPACITY]; + } + + // note all fields are final -- rehash creates new entries when necessary. + // as documented in java.util.concurrent.ConcurrentHashMap.java, that will + // statistically affect only a small percentage (< 20%) of entries for a given rehash. + static class SymbolEntry { + final int hash; + final String name; + final RubySymbol symbol; + final SymbolEntry next; + + SymbolEntry(int hash, String name, RubySymbol symbol, SymbolEntry next) { + this.hash = hash; + this.name = name; + this.symbol = symbol; + this.next = next; + } + } + + public RubySymbol getSymbol(String name) { + int hash = name.hashCode(); + SymbolEntry[] table; + for (SymbolEntry e = (table = symbolTable)[hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + return e.symbol; + } + } + ReentrantLock lock; + (lock = tableLock).lock(); + try { + int potentialNewSize; + if ((potentialNewSize = size + 1) > threshold) { + table = rehash(); + } else { + table = symbolTable; + } + int index; + // try lookup again under lock + for (SymbolEntry e = table[index = hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + return e.symbol; + } + } + String internedName; + RubySymbol symbol = new RubySymbol(runtime, internedName = name.intern()); + table[index] = new SymbolEntry(hash, internedName, symbol, table[index]); + size = potentialNewSize; + // write-volatile + symbolTable = table; + return symbol; + } finally { + lock.unlock(); + } + } + + public RubySymbol fastGetSymbol(String internedName) { + assert internedName == internedName.intern() : internedName + " is not interned"; + SymbolEntry[] table; + for (SymbolEntry e = (table = symbolTable)[internedName.hashCode() & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + return e.symbol; + } + } + ReentrantLock lock; + (lock = tableLock).lock(); + try { + int potentialNewSize; + if ((potentialNewSize = size + 1) > threshold) { + table = rehash(); + } else { + table = symbolTable; + } + int index; + int hash; + // try lookup again under lock + for (SymbolEntry e = table[index = (hash = internedName.hashCode()) & (table.length - 1)]; e != null; e = e.next) { + if (internedName == e.name) { + return e.symbol; + } + } + RubySymbol symbol = new RubySymbol(runtime, internedName); + table[index] = new SymbolEntry(hash, internedName, symbol, table[index]); + size = potentialNewSize; + // write-volatile + symbolTable = table; + return symbol; + } finally { + lock.unlock(); + } + } + + // backwards-compatibility, but threadsafe now + public RubySymbol lookup(String name) { + int hash = name.hashCode(); + SymbolEntry[] table; + for (SymbolEntry e = (table = symbolTable)[hash & (table.length - 1)]; e != null; e = e.next) { + if (hash == e.hash && name.equals(e.name)) { + return e.symbol; + } + } + return null; + } + + public RubySymbol lookup(long id) { + SymbolEntry[] table = symbolTable; + for (int i = table.length; --i >= 0; ) { + for (SymbolEntry e = table[i]; e != null; e = e.next) { + if (id == e.symbol.id) { + return e.symbol; + } + } + } + return null; + } + + public RubyArray all_symbols() { + SymbolEntry[] table = this.symbolTable; + RubyArray array = runtime.newArray(this.size); + for (int i = table.length; --i >= 0; ) { + for (SymbolEntry e = table[i]; e != null; e = e.next) { + array.append(e.symbol); + } + } + return array; + } + + // not so backwards-compatible here, but no one should have been + // calling this anyway. + @Deprecated + public void store(RubySymbol symbol) { + throw new UnsupportedOperationException(); + } + + private SymbolEntry[] rehash() { + SymbolEntry[] oldTable = symbolTable; + int oldCapacity; + if ((oldCapacity = oldTable.length) >= MAXIMUM_CAPACITY) { + return oldTable; + } + + int newCapacity = oldCapacity << 1; + SymbolEntry[] newTable = new SymbolEntry[newCapacity]; + threshold = (int)(newCapacity * loadFactor); + int sizeMask = newCapacity - 1; + SymbolEntry e; + for (int i = oldCapacity; --i >= 0; ) { + // We need to guarantee that any existing reads of old Map can + // proceed. So we cannot yet null out each bin. + e = oldTable[i]; + + if (e != null) { + SymbolEntry next = e.next; + int idx = e.hash & sizeMask; + + // Single node on list + if (next == null) + newTable[idx] = e; + + else { + // Reuse trailing consecutive sequence at same slot + SymbolEntry lastRun = e; + int lastIdx = idx; + for (SymbolEntry last = next; + last != null; + last = last.next) { + int k = last.hash & sizeMask; + if (k != lastIdx) { + lastIdx = k; + lastRun = last; + } + } + newTable[lastIdx] = lastRun; + + // Clone all remaining nodes + for (SymbolEntry p = e; p != lastRun; p = p.next) { + int k = p.hash & sizeMask; + SymbolEntry n = newTable[k]; + newTable[k] = new SymbolEntry(p.hash, p.name, p.symbol, n); + } + } + } + } + symbolTable = newTable; + return newTable; + } + + } +} +package org.jruby; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.HashMap; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ObjectMarshal; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.builtin.Variable; +import org.jruby.runtime.component.VariableEntry; +import org.jruby.runtime.marshal.MarshalStream; +import org.jruby.runtime.marshal.UnmarshalStream; + +@JRubyClass(name="SystemCallError", parent="StandardError") +public class RubySystemCallError extends RubyException { + private IRubyObject errno = getRuntime().getNil(); + + private final static Map<String, String> defaultMessages = new HashMap<String, String>(); + static { + defaultMessages.put("Errno::EPERM", "Operation not permitted"); + defaultMessages.put("Errno::ENOENT", "No such file or directory"); + defaultMessages.put("Errno::ESRCH", "No such process"); + defaultMessages.put("Errno::EINTR", "Interrupted system call"); + defaultMessages.put("Errno::EIO", "Input/output error"); + defaultMessages.put("Errno::ENXIO", "Device not configured"); + defaultMessages.put("Errno::E2BIG", "Argument list too long"); + defaultMessages.put("Errno::ENOEXEC", "Exec format error"); + defaultMessages.put("Errno::EBADF", "Bad file descriptor"); + defaultMessages.put("Errno::ECHILD", "No child processes"); + defaultMessages.put("Errno::EDEADLK", "Resource deadlock avoided"); + defaultMessages.put("Errno::ENOMEM", "Cannot allocate memory"); + defaultMessages.put("Errno::EACCES", "Permission denied"); + defaultMessages.put("Errno::EFAULT", "Bad address"); + defaultMessages.put("Errno::ENOTBLK", "Block device required"); + defaultMessages.put("Errno::EBUSY", "Resource busy"); + defaultMessages.put("Errno::EEXIST", "File exists"); + defaultMessages.put("Errno::EXDEV", "Cross-device link"); + defaultMessages.put("Errno::ENODEV", "Operation not supported by device"); + defaultMessages.put("Errno::ENOTDIR", "Not a directory"); + defaultMessages.put("Errno::EISDIR", "Is a directory"); + defaultMessages.put("Errno::EINVAL", "Invalid argument"); + defaultMessages.put("Errno::ENFILE", "Too many open files in system"); + defaultMessages.put("Errno::EMFILE", "Too many open files"); + defaultMessages.put("Errno::ENOTTY", "Inappropriate ioctl for device"); + defaultMessages.put("Errno::ETXTBSY", "Text file busy"); + defaultMessages.put("Errno::EFBIG", "File too large"); + defaultMessages.put("Errno::ENOSPC", "No space left on device"); + defaultMessages.put("Errno::ESPIPE", "Illegal seek"); + defaultMessages.put("Errno::EROFS", "Read-only file system"); + defaultMessages.put("Errno::EMLINK", "Too many links"); + defaultMessages.put("Errno::EPIPE", "Broken pipe"); + defaultMessages.put("Errno::EDOM", "Numerical argument out of domain"); + defaultMessages.put("Errno::ERANGE", "Result too large"); + defaultMessages.put("Errno::EAGAIN", "Resource temporarily unavailable"); + defaultMessages.put("Errno::EWOULDBLOCK", "Resource temporarily unavailable"); + defaultMessages.put("Errno::EINPROGRESS", "Operation now in progress"); + defaultMessages.put("Errno::EALREADY", "Operation already in progress"); + defaultMessages.put("Errno::ENOTSOCK", "Socket operation on non-socket"); + defaultMessages.put("Errno::EDESTADDRREQ", "Destination address required"); + defaultMessages.put("Errno::EMSGSIZE", "Message too long"); + defaultMessages.put("Errno::EPROTOTYPE", "Protocol wrong type for socket"); + defaultMessages.put("Errno::ENOPROTOOPT", "Protocol not available"); + defaultMessages.put("Errno::EPROTONOSUPPORT", "Protocol not supported"); + defaultMessages.put("Errno::ESOCKTNOSUPPORT", "Socket type not supported"); + defaultMessages.put("Errno::EPFNOSUPPORT", "Protocol family not supported"); + defaultMessages.put("Errno::EAFNOSUPPORT", "Address family not supported by protocol family"); + defaultMessages.put("Errno::EADDRINUSE", "Address already in use"); + defaultMessages.put("Errno::EADDRNOTAVAIL", "Can't assign requested address"); + defaultMessages.put("Errno::ENETDOWN", "Network is down"); + defaultMessages.put("Errno::ENETUNREACH", "Network is unreachable"); + defaultMessages.put("Errno::ENETRESET", "Network dropped connection on reset"); + defaultMessages.put("Errno::ECONNABORTED", "Software caused connection abort"); + defaultMessages.put("Errno::ECONNRESET", "Connection reset by peer"); + defaultMessages.put("Errno::ENOBUFS", "No buffer space available"); + defaultMessages.put("Errno::EISCONN", "Socket is already connected"); + defaultMessages.put("Errno::ENOTCONN", "Socket is not connected"); + defaultMessages.put("Errno::ESHUTDOWN", "Can't send after socket shutdown"); + defaultMessages.put("Errno::ETOOMANYREFS", "Too many references: can't splice"); + defaultMessages.put("Errno::ETIMEDOUT", "Operation timed out"); + defaultMessages.put("Errno::ECONNREFUSED", "Connection refused"); + defaultMessages.put("Errno::ELOOP", "Too many levels of symbolic links"); + defaultMessages.put("Errno::ENAMETOOLONG", "File name too long"); + defaultMessages.put("Errno::EHOSTDOWN", "Host is down"); + defaultMessages.put("Errno::EHOSTUNREACH", "No route to host"); + defaultMessages.put("Errno::ENOTEMPTY", "Directory not empty"); + defaultMessages.put("Errno::EUSERS", "Too many users"); + defaultMessages.put("Errno::EDQUOT", "Disc quota exceeded"); + defaultMessages.put("Errno::ESTALE", "Stale NFS file handle"); + defaultMessages.put("Errno::EREMOTE", "Too many levels of remote in path"); + defaultMessages.put("Errno::ENOLCK", "No locks available"); + defaultMessages.put("Errno::ENOSYS", "Function not implemented"); + defaultMessages.put("Errno::EOVERFLOW", "Value too large to be stored in data type"); + defaultMessages.put("Errno::EIDRM", "Identifier removed"); + defaultMessages.put("Errno::ENOMSG", "No message of desired type"); + defaultMessages.put("Errno::EILSEQ", "Illegal byte sequence"); + defaultMessages.put("Errno::EBADMSG", "Bad message"); + defaultMessages.put("Errno::EMULTIHOP", "EMULTIHOP (Reserved)"); + defaultMessages.put("Errno::ENODATA", "No message available on STREAM"); + defaultMessages.put("Errno::ENOLINK", "ENOLINK (Reserved)"); + defaultMessages.put("Errno::ENOSR", "No STREAM resources"); + defaultMessages.put("Errno::ENOSTR", "Not a STREAM"); + defaultMessages.put("Errno::EPROTO", "Protocol error"); + defaultMessages.put("Errno::ETIME", "STREAM ioctl timeout"); + defaultMessages.put("Errno::EOPNOTSUPP", "Operation not supported"); + defaultMessages.put("Errno::EOPNOTSUPP_DARWIN", "Operation not supported"); + } + + protected RubySystemCallError(Ruby runtime, RubyClass rubyClass) { + super(runtime, rubyClass, null); + } + + public RubySystemCallError(Ruby runtime, RubyClass rubyClass, String message, int errno) { + super(runtime, rubyClass, message); + this.errno = runtime.newFixnum(errno); + } + + private static ObjectAllocator SYSTEM_CALL_ERROR_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + RubyException instance = new RubySystemCallError(runtime, klass); + + instance.setMetaClass(klass); + + return instance; + } + }; + + private static final ObjectMarshal SYSTEM_CALL_ERROR_MARSHAL = new ObjectMarshal() { + public void marshalTo(Ruby runtime, Object obj, RubyClass type, + MarshalStream marshalStream) throws IOException { + RubySystemCallError exc = (RubySystemCallError) obj; + marshalStream.registerLinkTarget(exc); + + List<Variable<IRubyObject>> attrs = exc.getVariableList(); + attrs.add(new VariableEntry<IRubyObject>( + "mesg", exc.message == null ? runtime.getNil() : exc.message)); + attrs.add(new VariableEntry<IRubyObject>("errno", exc.errno)); + attrs.add(new VariableEntry<IRubyObject>("bt", exc.getBacktrace())); + marshalStream.dumpVariables(attrs); + } + + public Object unmarshalFrom(Ruby runtime, RubyClass type, + UnmarshalStream unmarshalStream) throws IOException { + RubySystemCallError exc = (RubySystemCallError) type.allocate(); + + unmarshalStream.registerLinkTarget(exc); + unmarshalStream.defaultVariablesUnmarshal(exc); + + exc.message = exc.removeInternalVariable("mesg"); + exc.errno = exc.removeInternalVariable("errno"); + exc.set_backtrace(exc.removeInternalVariable("bt")); + + return exc; + } + }; + + public static RubyClass createSystemCallErrorClass(Ruby runtime, RubyClass standardError) { + RubyClass exceptionClass = runtime.defineClass("SystemCallError", standardError, SYSTEM_CALL_ERROR_ALLOCATOR); + + exceptionClass.setMarshal(SYSTEM_CALL_ERROR_MARSHAL); + + runtime.callbackFactory(RubyClass.class); + exceptionClass.defineAnnotatedMethods(RubySystemCallError.class); + + return exceptionClass; + } + + @JRubyMethod(optional = 2, required=0, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, Block block) { + RubyClass sCallErorrClass = getRuntime().getSystemCallError(); + RubyClass klass = getMetaClass().getRealClass(); + + IRubyObject msg = getRuntime().getNil(); + IRubyObject err = getRuntime().getNil(); + + boolean isErrnoClass = !klass.equals(sCallErorrClass); + + if (!isErrnoClass) { + // one optional, one required args + Arity.checkArgumentCount(getRuntime(), args, 1, 2); + msg = args[0]; + if (args.length == 2) { + err = args[1]; + } + if (args.length == 1 && (msg instanceof RubyFixnum)) { + err = msg; + msg = getRuntime().getNil(); + } + } else { + // one optional and no required args + Arity.checkArgumentCount(getRuntime(), args, 0, 1); + if (args.length == 1) { + msg = args[0]; + } + // try to get errno out of the class + err = klass.fastGetConstant("Errno"); + } + + if (!err.isNil()) { + errno = err.convertToInteger(); + } + + String val = defaultMessages.get(klass.getName()); + if (val == null) { + val = "Unknown error"; + } + + // MRI behavior: we don't print errno for actual Errno errors + if (!errno.isNil() && !isErrnoClass) { + val += " " + errno.toString(); + } + + if (!msg.isNil()) { + val += " - " + msg.convertToString(); + } + + message = getRuntime().newString(val); + return this; + } + + @JRubyMethod + public IRubyObject errno() { + return errno; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ + +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +@JRubyClass(name="SystemExit", parent="Exception") +public class RubySystemExit extends RubyException { + IRubyObject status; + + private static ObjectAllocator SYSTEMEXIT_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubySystemExit(runtime, klass); + } + }; + + public static RubyClass createSystemExitClass(Ruby runtime, RubyClass exceptionClass) { + RubyClass systemExitClass = runtime.defineClass("SystemExit", exceptionClass, SYSTEMEXIT_ALLOCATOR); + + systemExitClass.defineAnnotatedMethods(RubySystemExit.class); + + return systemExitClass; + } + + public static RubySystemExit newInstance(Ruby runtime, int status) { + RubyClass exc = runtime.getSystemExit(); + IRubyObject[] exArgs = new IRubyObject[] { + runtime.newFixnum(status), + runtime.newString("exit") }; + return (RubySystemExit) exc.newInstance(runtime.getCurrentContext(), exArgs, Block.NULL_BLOCK); + } + + protected RubySystemExit(Ruby runtime, RubyClass exceptionClass) { + super(runtime, exceptionClass); + status = runtime.getNil(); + } + + @JRubyMethod(name = "initialize", optional = 2, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[]args, Block block) { + status = RubyFixnum.zero(getRuntime()); + if (args.length > 0 && args[0] instanceof RubyFixnum) { + status = args[0]; + IRubyObject[]tmpArgs = new IRubyObject[args.length - 1]; + System.arraycopy(args, 1, tmpArgs, 0, tmpArgs.length); + args = tmpArgs; + } + super.initialize(args, block); + return this; + } + + @JRubyMethod(name = "status") + public IRubyObject status() { + return status; + } + + @JRubyMethod(name = "success?") + public IRubyObject success_p() { + if (status.isNil()) return getRuntime().getTrue(); + if (status.equals(RubyFixnum.zero(getRuntime()))) return getRuntime().getTrue(); + return getRuntime().getFalse(); + } + +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002 Jason Voegele <jason@jvoegele.com> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004-2005 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; +import java.nio.channels.Channel; +import java.nio.channels.SelectableChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.util.HashMap; +import java.util.Map; + +import java.util.Set; +import org.jruby.common.IRubyWarnings.ID; +import org.jruby.exceptions.RaiseException; +import org.jruby.exceptions.ThreadKill; +import org.jruby.internal.runtime.FutureThread; +import org.jruby.internal.runtime.NativeThread; +import org.jruby.internal.runtime.RubyRunnable; +import org.jruby.internal.runtime.ThreadLike; +import org.jruby.internal.runtime.ThreadService; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.locks.ReentrantLock; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.runtime.ObjectMarshal; +import org.jruby.runtime.Visibility; + +/** + * Implementation of Ruby's <code>Thread</code> class. Each Ruby thread is + * mapped to an underlying Java Virtual Machine thread. + * <p> + * Thread encapsulates the behavior of a thread of execution, including the main + * thread of the Ruby script. In the descriptions that follow, the parameter + * <code>aSymbol</code> refers to a symbol, which is either a quoted string or a + * <code>Symbol</code> (such as <code>:name</code>). + * + * Note: For CVS history, see ThreadClass.java. + */ +@JRubyClass(name="Thread") +public class RubyThread extends RubyObject { + private ThreadLike threadImpl; + private RubyFixnum priority; + private transient Map<IRubyObject, IRubyObject> threadLocalVariables; + private boolean abortOnException; + private IRubyObject finalResult; + private RaiseException exitingException; + private IRubyObject receivedException; + private RubyThreadGroup threadGroup; + + private final ThreadService threadService; + private volatile boolean isStopped = false; + private volatile boolean isDead = false; + public Object stopLock = new Object(); + + private volatile boolean killed = false; + public Object killLock = new Object(); + + public final ReentrantLock lock = new ReentrantLock(); + + private static final boolean DEBUG = false; + + protected RubyThread(Ruby runtime, RubyClass type) { + super(runtime, type); + this.threadService = runtime.getThreadService(); + finalResult = runtime.getNil(); + } + + /** + * Dispose of the current thread by removing it from its parent ThreadGroup. + */ + public void dispose() { + threadGroup.remove(this); + } + + public static RubyClass createThreadClass(Ruby runtime) { + // FIXME: In order for Thread to play well with the standard 'new' behavior, + // it must provide an allocator that can create empty object instances which + // initialize then fills with appropriate data. + RubyClass threadClass = runtime.defineClass("Thread", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setThread(threadClass); + + threadClass.defineAnnotatedMethods(RubyThread.class); + + RubyThread rubyThread = new RubyThread(runtime, threadClass); + // TODO: need to isolate the "current" thread from class creation + rubyThread.threadImpl = new NativeThread(rubyThread, Thread.currentThread()); + runtime.getThreadService().setMainThread(Thread.currentThread(), rubyThread); + + // set to default thread group + runtime.getDefaultThreadGroup().addDirectly(rubyThread); + + threadClass.setMarshal(ObjectMarshal.NOT_MARSHALABLE_MARSHAL); + + return threadClass; + } + + /** + * <code>Thread.new</code> + * <p> + * Thread.new( <i>[ arg ]*</i> ) {| args | block } -> aThread + * <p> + * Creates a new thread to execute the instructions given in block, and + * begins running it. Any arguments passed to Thread.new are passed into the + * block. + * <pre> + * x = Thread.new { sleep .1; print "x"; print "y"; print "z" } + * a = Thread.new { print "a"; print "b"; sleep .2; print "c" } + * x.join # Let the threads finish before + * a.join # main thread exits... + * </pre> + * <i>produces:</i> abxyzc + */ + @JRubyMethod(name = {"new", "fork"}, rest = true, frame = true, meta = true) + public static IRubyObject newInstance(IRubyObject recv, IRubyObject[] args, Block block) { + return startThread(recv, args, true, block); + } + + /** + * Basically the same as Thread.new . However, if class Thread is + * subclassed, then calling start in that subclass will not invoke the + * subclass's initialize method. + */ + @JRubyMethod(name = "start", rest = true, frame = true, meta = true) + public static RubyThread start(IRubyObject recv, IRubyObject[] args, Block block) { + return startThread(recv, args, false, block); + } + + public static RubyThread adopt(IRubyObject recv, Thread t) { + return adoptThread(recv, t, Block.NULL_BLOCK); + } + + private static RubyThread adoptThread(final IRubyObject recv, Thread t, Block block) { + final Ruby runtime = recv.getRuntime(); + final RubyThread rubyThread = new RubyThread(runtime, (RubyClass) recv); + + rubyThread.threadImpl = new NativeThread(rubyThread, t); + ThreadContext context = runtime.getThreadService().registerNewThread(rubyThread); + + context.preAdoptThread(); + + // set to default thread group + runtime.getDefaultThreadGroup().addDirectly(rubyThread); + + return rubyThread; + } + + @JRubyMethod(name = "initialize", rest = true, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject[] args, Block block) { + Ruby runtime = getRuntime(); + if (!block.isGiven()) throw runtime.newThreadError("must be called with a block"); + + RubyRunnable runnable = new RubyRunnable(this, args, block); + if (RubyInstanceConfig.POOLING_ENABLED) { + threadImpl = new FutureThread(this, runnable); + } else { + Thread thread = new Thread(runnable); + thread.setDaemon(true); + threadImpl = new NativeThread(this, thread); + } + + // set to default thread group + runtime.getDefaultThreadGroup().addDirectly(this); + + threadImpl.start(); + + // We yield here to hopefully permit the target thread to schedule + // MRI immediately schedules it, so this is close but not exact + Thread.yield(); + + return this; + } + + private static RubyThread startThread(final IRubyObject recv, final IRubyObject[] args, boolean callInit, Block block) { + RubyThread rubyThread = new RubyThread(recv.getRuntime(), (RubyClass) recv); + + if (callInit) { + rubyThread.callInit(args, block); + } else { + // for Thread::start, which does not call the subclass's initialize + rubyThread.initialize(args, block); + } + + return rubyThread; + } + + private void ensureNotCurrent() { + if (this == getRuntime().getCurrentContext().getThread()) { + throw new RuntimeException("internal thread method called from another thread"); + } + } + + public synchronized void cleanTerminate(IRubyObject result) { + finalResult = result; + isStopped = true; + isDead = true; + } + + public void pollThreadEvents() { + pollThreadEvents(getRuntime().getCurrentContext()); + } + + public void pollThreadEvents(ThreadContext context) { + // check for criticalization *before* locking ourselves + threadService.waitForCritical(); + + if (killed) throwThreadKill(); + if (receivedException != null) receivedAnException(context); + } + + private void throwThreadKill() { + throw new ThreadKill(); + } + + /** + * Returns the status of the global ``abort on exception'' condition. The + * default is false. When set to true, will cause all threads to abort (the + * process will exit(0)) if an exception is raised in any thread. See also + * Thread.abort_on_exception= . + */ + @JRubyMethod(name = "abort_on_exception", meta = true) + public static RubyBoolean abort_on_exception_x(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + return runtime.isGlobalAbortOnExceptionEnabled() ? runtime.getTrue() : runtime.getFalse(); + } + + @JRubyMethod(name = "abort_on_exception=", required = 1, meta = true) + public static IRubyObject abort_on_exception_set_x(IRubyObject recv, IRubyObject value) { + recv.getRuntime().setGlobalAbortOnExceptionEnabled(value.isTrue()); + return value; + } + + @JRubyMethod(name = "current", meta = true) + public static RubyThread current(IRubyObject recv) { + return recv.getRuntime().getCurrentContext().getThread(); + } + + @JRubyMethod(name = "main", meta = true) + public static RubyThread main(IRubyObject recv) { + return recv.getRuntime().getThreadService().getMainThread(); + } + + @JRubyMethod(name = "pass", meta = true) + public static IRubyObject pass(IRubyObject recv) { + Ruby runtime = recv.getRuntime(); + ThreadService ts = runtime.getThreadService(); + boolean critical = ts.getCritical(); + + ts.setCritical(false); + + Thread.yield(); + + ts.setCritical(critical); + + return recv.getRuntime().getNil(); + } + + @JRubyMethod(name = "list", meta = true) + public static RubyArray list(IRubyObject recv) { + RubyThread[] activeThreads = recv.getRuntime().getThreadService().getActiveRubyThreads(); + + return recv.getRuntime().newArrayNoCopy(activeThreads); + } + + private IRubyObject getSymbolKey(IRubyObject originalKey) { + if (originalKey instanceof RubySymbol) { + return originalKey; + } else if (originalKey instanceof RubyString) { + return getRuntime().newSymbol(originalKey.asJavaString()); + } else if (originalKey instanceof RubyFixnum) { + getRuntime().getWarnings().warn(ID.FIXNUMS_NOT_SYMBOLS, "Do not use Fixnums as Symbols"); + throw getRuntime().newArgumentError(originalKey + " is not a symbol"); + } else { + throw getRuntime().newTypeError(originalKey + " is not a symbol"); + } + } + + private synchronized Map<IRubyObject, IRubyObject> getThreadLocals() { + if (threadLocalVariables == null) { + threadLocalVariables = new HashMap<IRubyObject, IRubyObject>(); + } + return threadLocalVariables; + } + + @JRubyMethod(name = "[]", required = 1) + public IRubyObject op_aref(IRubyObject key) { + IRubyObject value; + if ((value = getThreadLocals().get(getSymbolKey(key))) != null) { + return value; + } + return getRuntime().getNil(); + } + + @JRubyMethod(name = "[]=", required = 2) + public IRubyObject op_aset(IRubyObject key, IRubyObject value) { + key = getSymbolKey(key); + + getThreadLocals().put(key, value); + return value; + } + + @JRubyMethod(name = "abort_on_exception") + public RubyBoolean abort_on_exception() { + return abortOnException ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "abort_on_exception=", required = 1) + public IRubyObject abort_on_exception_set(IRubyObject val) { + abortOnException = val.isTrue(); + return val; + } + + @JRubyMethod(name = "alive?") + public RubyBoolean alive_p() { + return !isDead && threadImpl.isAlive() ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "join", optional = 1, backtrace = true) + public IRubyObject join(IRubyObject[] args) { + long timeoutMillis = Long.MAX_VALUE; + if (args.length > 0) { + if (args.length > 1) { + throw getRuntime().newArgumentError(args.length,1); + } + // MRI behavior: value given in seconds; converted to Float; less + // than or equal to zero returns immediately; returns nil + timeoutMillis = (long)(1000.0D * args[0].convertToFloat().getValue()); + if (timeoutMillis <= 0) { + // TODO: not sure that we should skip calling join() altogether. + // Thread.join() has some implications for Java Memory Model, etc. + if (threadImpl.isAlive()) { + return getRuntime().getNil(); + } else { + return this; + } + } + } + if (isCurrent()) { + throw getRuntime().newThreadError("thread tried to join itself"); + } + try { + if (threadService.getCritical()) { + // If the target thread is sleeping or stopped, wake it + synchronized (stopLock) { + stopLock.notify(); + } + + // interrupt the target thread in case it's blocking or waiting + // WARNING: We no longer interrupt the target thread, since this usually means + // interrupting IO and with NIO that means the channel is no longer usable. + // We either need a new way to handle waking a target thread that's waiting + // on IO, or we need to accept that we can't wake such threads and must wait + // for them to complete their operation. + //threadImpl.interrupt(); + } + + RubyThread currentThread = getRuntime().getCurrentContext().getThread(); + final long timeToWait = Math.min(timeoutMillis, 200); + + // We need this loop in order to be able to "unblock" the + // join call without actually calling interrupt. + long start = System.currentTimeMillis(); + while(true) { + currentThread.pollThreadEvents(); + threadImpl.join(timeToWait); + if (!threadImpl.isAlive()) { + break; + } + if (System.currentTimeMillis() - start > timeoutMillis) { + break; + } + } + } catch (InterruptedException ie) { + ie.printStackTrace(); + assert false : ie; + } catch (ExecutionException ie) { + ie.printStackTrace(); + assert false : ie; + } + + if (exitingException != null) { + throw exitingException; + } + + if (threadImpl.isAlive()) { + return getRuntime().getNil(); + } else { + return this; + } + } + + @JRubyMethod(name = "value") + public IRubyObject value() { + join(new IRubyObject[0]); + synchronized (this) { + return finalResult; + } + } + + @JRubyMethod(name = "group") + public IRubyObject group() { + if (threadGroup == null) { + return getRuntime().getNil(); + } + + return threadGroup; + } + + void setThreadGroup(RubyThreadGroup rubyThreadGroup) { + threadGroup = rubyThreadGroup; + } + + @JRubyMethod(name = "inspect") + @Override + public IRubyObject inspect() { + // FIXME: There's some code duplication here with RubyObject#inspect + StringBuilder part = new StringBuilder(); + String cname = getMetaClass().getRealClass().getName(); + part.append("#<").append(cname).append(":0x"); + part.append(Integer.toHexString(System.identityHashCode(this))); + + if (threadImpl.isAlive()) { + if (isStopped) { + part.append(getRuntime().newString(" sleep")); + } else if (killed) { + part.append(getRuntime().newString(" aborting")); + } else { + part.append(getRuntime().newString(" run")); + } + } else { + part.append(" dead"); + } + + part.append(">"); + return getRuntime().newString(part.toString()); + } + + @JRubyMethod(name = "key?", required = 1) + public RubyBoolean key_p(IRubyObject key) { + key = getSymbolKey(key); + + return getRuntime().newBoolean(getThreadLocals().containsKey(key)); + } + + @JRubyMethod(name = "keys") + public RubyArray keys() { + IRubyObject[] keys = new IRubyObject[getThreadLocals().size()]; + + return RubyArray.newArrayNoCopy(getRuntime(), getThreadLocals().keySet().toArray(keys)); + } + + @JRubyMethod(name = "critical=", required = 1, meta = true) + public static IRubyObject critical_set(IRubyObject receiver, IRubyObject value) { + receiver.getRuntime().getThreadService().setCritical(value.isTrue()); + + return value; + } + + @JRubyMethod(name = "critical", meta = true) + public static IRubyObject critical(IRubyObject receiver) { + return receiver.getRuntime().newBoolean(receiver.getRuntime().getThreadService().getCritical()); + } + + @JRubyMethod(name = "stop", meta = true) + public static IRubyObject stop(IRubyObject receiver) { + RubyThread rubyThread = receiver.getRuntime().getThreadService().getCurrentContext().getThread(); + Object stopLock = rubyThread.stopLock; + + synchronized (stopLock) { + rubyThread.pollThreadEvents(); + try { + rubyThread.isStopped = true; + // attempt to decriticalize all if we're the critical thread + receiver.getRuntime().getThreadService().setCritical(false); + + stopLock.wait(); + } catch (InterruptedException ie) { + rubyThread.pollThreadEvents(); + } + rubyThread.isStopped = false; + } + + return receiver.getRuntime().getNil(); + } + + @JRubyMethod(name = "kill", required = 1, frame = true, meta = true) + public static IRubyObject kill(IRubyObject receiver, IRubyObject rubyThread, Block block) { + if (!(rubyThread instanceof RubyThread)) throw receiver.getRuntime().newTypeError(rubyThread, receiver.getRuntime().getThread()); + return ((RubyThread)rubyThread).kill(); + } + + @JRubyMethod(name = "exit", frame = true, meta = true) + public static IRubyObject s_exit(IRubyObject receiver, Block block) { + RubyThread rubyThread = receiver.getRuntime().getThreadService().getCurrentContext().getThread(); + + rubyThread.killed = true; + // attempt to decriticalize all if we're the critical thread + receiver.getRuntime().getThreadService().setCritical(false); + + throw new ThreadKill(); + } + + @JRubyMethod(name = "stop?") + public RubyBoolean stop_p() { + // not valid for "dead" state + return getRuntime().newBoolean(isStopped); + } + + @JRubyMethod(name = "wakeup") + public RubyThread wakeup() { + synchronized (stopLock) { + stopLock.notifyAll(); + } + + return this; + } + + @JRubyMethod(name = "priority") + public RubyFixnum priority() { + return priority; + } + + @JRubyMethod(name = "priority=", required = 1) + public IRubyObject priority_set(IRubyObject priority) { + // FIXME: This should probably do some translation from Ruby priority levels to Java priority levels (until we have green threads) + int iPriority = RubyNumeric.fix2int(priority); + + if (iPriority < Thread.MIN_PRIORITY) { + iPriority = Thread.MIN_PRIORITY; + } else if (iPriority > Thread.MAX_PRIORITY) { + iPriority = Thread.MAX_PRIORITY; + } + + this.priority = RubyFixnum.newFixnum(getRuntime(), iPriority); + + if (threadImpl.isAlive()) { + threadImpl.setPriority(iPriority); + } + return this.priority; + } + + @JRubyMethod(name = "raise", optional = 2, frame = true) + public IRubyObject raise(IRubyObject[] args, Block block) { + ensureNotCurrent(); + Ruby runtime = getRuntime(); + + if (DEBUG) System.out.println("thread " + Thread.currentThread() + " before raising"); + RubyThread currentThread = getRuntime().getCurrentContext().getThread(); + try { + while (!(currentThread.lock.tryLock() && this.lock.tryLock())) { + if (currentThread.lock.isHeldByCurrentThread()) currentThread.lock.unlock(); + } + + currentThread.pollThreadEvents(); + if (DEBUG) System.out.println("thread " + Thread.currentThread() + " raising"); + receivedException = prepareRaiseException(runtime, args, block); + + // If the target thread is sleeping or stopped, wake it + synchronized (stopLock) { + stopLock.notify(); + } + + // interrupt the target thread in case it's blocking or waiting + // WARNING: We no longer interrupt the target thread, since this usually means + // interrupting IO and with NIO that means the channel is no longer usable. + // We either need a new way to handle waking a target thread that's waiting + // on IO, or we need to accept that we can't wake such threads and must wait + // for them to complete their operation. + //threadImpl.interrupt(); + + // new interrupt, to hopefully wake it out of any blocking IO + this.interrupt(); + } finally { + if (currentThread.lock.isHeldByCurrentThread()) currentThread.lock.unlock(); + if (this.lock.isHeldByCurrentThread()) this.lock.unlock(); + } + + return this; + } + + private IRubyObject prepareRaiseException(Ruby runtime, IRubyObject[] args, Block block) { + if(args.length == 0) { + IRubyObject lastException = runtime.getGlobalVariables().get("$!"); + if(lastException.isNil()) { + return new RaiseException(runtime, runtime.getRuntimeError(), "", false).getException(); + } + return lastException; + } + + IRubyObject exception; + ThreadContext context = getRuntime().getCurrentContext(); + + if(args.length == 1) { + if(args[0] instanceof RubyString) { + return runtime.getRuntimeError().newInstance(context, args, block); + } + + if(!args[0].respondsTo("exception")) { + return runtime.newTypeError("exception class/object expected").getException(); + } + exception = args[0].callMethod(context, "exception"); + } else { + if (!args[0].respondsTo("exception")) { + return runtime.newTypeError("exception class/object expected").getException(); + } + + exception = args[0].callMethod(context, "exception", args[1]); + } + + if (!runtime.getException().isInstance(exception)) { + return runtime.newTypeError("exception object expected").getException(); + } + + if (args.length == 3) { + ((RubyException) exception).set_backtrace(args[2]); + } + + return exception; + } + + @JRubyMethod(name = "run") + public IRubyObject run() { + // if stopped, unstop + synchronized (stopLock) { + if (isStopped) { + isStopped = false; + stopLock.notifyAll(); + } + } + + return this; + } + + public void sleep(long millis) throws InterruptedException { + assert this == getRuntime().getCurrentContext().getThread(); + synchronized (stopLock) { + pollThreadEvents(); + try { + isStopped = true; + stopLock.wait(millis); + } finally { + isStopped = false; + pollThreadEvents(); + } + } + } + + @JRubyMethod(name = "status") + public IRubyObject status() { + if (threadImpl.isAlive()) { + if (isStopped || currentSelector != null && currentSelector.isOpen()) { + return getRuntime().newString("sleep"); + } else if (killed) { + return getRuntime().newString("aborting"); + } + + return getRuntime().newString("run"); + } else if (exitingException != null) { + return getRuntime().getNil(); + } else { + return getRuntime().getFalse(); + } + } + + @JRubyMethod(name = {"kill", "exit", "terminate"}) + public IRubyObject kill() { + // need to reexamine this + RubyThread currentThread = getRuntime().getCurrentContext().getThread(); + + // If the killee thread is the same as the killer thread, just die + if (currentThread == this) throwThreadKill(); + + try { + if (DEBUG) System.out.println("thread " + Thread.currentThread() + " trying to kill"); + while (!(currentThread.lock.tryLock() && this.lock.tryLock())) { + if (currentThread.lock.isHeldByCurrentThread()) currentThread.lock.unlock(); + } + + currentThread.pollThreadEvents(); + + if (DEBUG) System.out.println("thread " + Thread.currentThread() + " succeeded with kill"); + killed = true; + + // If the target thread is sleeping or stopped, wake it + synchronized (stopLock) { + stopLock.notify(); + } + + // interrupt the target thread in case it's blocking or waiting + // WARNING: We no longer interrupt the target thread, since this usually means + // interrupting IO and with NIO that means the channel is no longer usable. + // We either need a new way to handle waking a target thread that's waiting + // on IO, or we need to accept that we can't wake such threads and must wait + // for them to complete their operation. + //threadImpl.interrupt(); + + // new interrupt, to hopefully wake it out of any blocking IO + this.interrupt(); + } finally { + if (currentThread.lock.isHeldByCurrentThread()) currentThread.lock.unlock(); + if (this.lock.isHeldByCurrentThread()) this.lock.unlock(); + } + + try { + threadImpl.join(); + } catch (InterruptedException ie) { + // we were interrupted, check thread events again + currentThread.pollThreadEvents(); + } catch (ExecutionException ie) { + // we were interrupted, check thread events again + currentThread.pollThreadEvents(); + } + + return this; + } + + @JRubyMethod(name = {"kill!", "exit!", "terminate!"}) + public IRubyObject kill_bang() { + throw getRuntime().newNotImplementedError("Thread#kill!, exit!, and terminate! are not safe and not supported"); + } + + @JRubyMethod(name = "safe_level") + public IRubyObject safe_level() { + throw getRuntime().newNotImplementedError("Thread-specific SAFE levels are not supported"); + } + + private boolean isCurrent() { + return threadImpl.isCurrent(); + } + + public void exceptionRaised(RaiseException exception) { + assert isCurrent(); + + RubyException rubyException = exception.getException(); + Ruby runtime = rubyException.getRuntime(); + if (runtime.getSystemExit().isInstance(rubyException)) { + threadService.getMainThread().raise(new IRubyObject[] {rubyException}, Block.NULL_BLOCK); + } else if (abortOnException(runtime)) { + runtime.printError(rubyException); + RubyException systemExit = RubySystemExit.newInstance(runtime, 1); + systemExit.message = rubyException.message; + systemExit.set_backtrace(rubyException.backtrace()); + threadService.getMainThread().raise(new IRubyObject[] {systemExit}, Block.NULL_BLOCK); + return; + } else if (runtime.getDebug().isTrue()) { + runtime.printError(exception.getException()); + } + exitingException = exception; + } + + private boolean abortOnException(Ruby runtime) { + return (runtime.isGlobalAbortOnExceptionEnabled() || abortOnException); + } + + public static RubyThread mainThread(IRubyObject receiver) { + return receiver.getRuntime().getThreadService().getMainThread(); + } + + private Selector currentSelector; + + @Deprecated + public boolean selectForAccept(RubyIO io) { + return select(io, SelectionKey.OP_ACCEPT); + } + + public boolean select(RubyIO io, int ops) { + Channel channel = io.getChannel(); + + if (channel instanceof SelectableChannel) { + SelectableChannel selectable = (SelectableChannel)channel; + + synchronized (selectable.blockingLock()) { + boolean oldBlocking = selectable.isBlocking(); + + try { + selectable.configureBlocking(false); + + io.addBlockingThread(this); + currentSelector = selectable.provider().openSelector(); + + SelectionKey key = selectable.register(currentSelector, ops); + + int result = currentSelector.select(); + + // check for thread events, in case we've been woken up to die + pollThreadEvents(); + + if (result == 1) { + Set<SelectionKey> keySet = currentSelector.selectedKeys(); + + if (keySet.iterator().next() == key) { + return true; + } + } + + return false; + } catch (IOException ioe) { + throw io.getRuntime().newRuntimeError("Error with selector: " + ioe); + } finally { + if (currentSelector != null) { + try { + currentSelector.close(); + } catch (IOException ioe) { + throw io.getRuntime().newRuntimeError("Could not close selector"); + } + } + currentSelector = null; + io.removeBlockingThread(this); + try { + selectable.configureBlocking(oldBlocking); + } catch (IOException ioe) { + // ignore; I don't like doing it, but it seems like we + // really just need to make all channels non-blocking by + // default and use select when implementing blocking ops, + // so if this remains set non-blocking, perhaps it's not + // such a big deal... + } + } + } + } else { + // can't select, just have to do a blocking call + return true; + } + } + + public void interrupt() { + if (currentSelector != null) { + currentSelector.wakeup(); + } + } + + public void beforeBlockingCall() { + isStopped = true; + } + + public void afterBlockingCall() { + isStopped = false; + } + + private void receivedAnException(ThreadContext context) { + // clear this so we don't keep re-throwing + IRubyObject raiseException = receivedException; + receivedException = null; + RubyModule kernelModule = getRuntime().getKernel(); + if (DEBUG) { + System.out.println("thread " + Thread.currentThread() + " before propagating exception: " + killed); + } + kernelModule.callMethod(context, "raise", raiseException); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.util.HashMap; +import java.util.Map; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; + +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * Implementation of Ruby's <code>ThreadGroup</code> class. This is currently + * just a stub. + * <p> + * + * @author Charles O Nutter (headius@headius.com) + */ +@JRubyClass(name="ThreadGroup") +public class RubyThreadGroup extends RubyObject { + private Map<Integer, IRubyObject> rubyThreadList = new HashMap<Integer, IRubyObject>(); + private boolean enclosed = false; + + // ENEBO: Can these be fast? + public static RubyClass createThreadGroupClass(Ruby runtime) { + RubyClass threadGroupClass = runtime.defineClass("ThreadGroup", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setThreadGroup(threadGroupClass); + + threadGroupClass.defineAnnotatedMethods(RubyThreadGroup.class); + + // create the default thread group + RubyThreadGroup defaultThreadGroup = new RubyThreadGroup(runtime, threadGroupClass); + runtime.setDefaultThreadGroup(defaultThreadGroup); + threadGroupClass.defineConstant("Default", defaultThreadGroup); + + return threadGroupClass; + } + + @JRubyMethod(name = "new", frame = true, meta = true) + public static IRubyObject newInstance(IRubyObject recv, Block block) { + return new RubyThreadGroup(recv.getRuntime(), (RubyClass)recv); + } + + @JRubyMethod(name = "add", required = 1, frame = true) + public synchronized IRubyObject add(IRubyObject rubyThread, Block block) { + if (!(rubyThread instanceof RubyThread)) throw getRuntime().newTypeError(rubyThread, getRuntime().getThread()); + + // synchronize on the RubyThread for threadgroup updates + if (isFrozen()) { + throw getRuntime().newTypeError("can't add to frozen ThreadGroup"); + } + + RubyThread thread = (RubyThread)rubyThread; + + // we only add live threads + if (thread.alive_p().isTrue()) { + addDirectly(thread); + } + + return this; + } + + void addDirectly(RubyThread rubyThread) { + synchronized (rubyThread) { + IRubyObject oldGroup = rubyThread.group(); + if (oldGroup != getRuntime().getNil()) { + RubyThreadGroup threadGroup = (RubyThreadGroup) oldGroup; + threadGroup.rubyThreadList.remove(System.identityHashCode(rubyThread)); + } + + rubyThread.setThreadGroup(this); + rubyThreadList.put(System.identityHashCode(rubyThread), rubyThread); + } + } + + public synchronized void remove(RubyThread rubyThread) { + rubyThread.setThreadGroup(null); + rubyThreadList.remove(System.identityHashCode(rubyThread)); + } + + @JRubyMethod(name = "enclose", frame = true) + public IRubyObject enclose(Block block) { + enclosed = true; + + return this; + } + + @JRubyMethod(name = "enclosed?", frame = true) + public IRubyObject enclosed_p(Block block) { + return new RubyBoolean(getRuntime(), enclosed); + } + + @JRubyMethod(name = "list", frame = true) + public synchronized IRubyObject list(Block block) { + return getRuntime().newArrayNoCopy((IRubyObject[]) rubyThreadList.values().toArray(new IRubyObject[rubyThreadList.size()])); + } + + private RubyThreadGroup(Ruby runtime, RubyClass type) { + super(runtime, type); + } + +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2001 Chad Fowler <chadfowler@chadfowler.com> + * Copyright (C) 2001-2004 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002 Benoit Cerrina <b.cerrina@wanadoo.fr> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Joey Gibson <joey@joeygibson.com> + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * Copyright (C) 2006 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2006 Ola Bini <ola.bini@ki.se> + * Copyright (C) 2006 Miguel Covarrubias <mlcovarrubias@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.lang.ref.SoftReference; +import java.util.Date; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.ClassIndex; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.util.ByteList; +import org.jruby.util.RubyDateFormat; + +/** The Time class. + * + * @author chadfowler, jpetersen + */ +@JRubyClass(name="Time", include="Comparable") +public class RubyTime extends RubyObject { + public static final String UTC = "UTC"; + private DateTime dt; + private long usec; + + private final static DateTimeFormatter ONE_DAY_CTIME_FORMATTER = DateTimeFormat.forPattern("EEE MMM d HH:mm:ss yyyy").withLocale(Locale.ENGLISH); + private final static DateTimeFormatter TWO_DAY_CTIME_FORMATTER = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss yyyy").withLocale(Locale.ENGLISH); + + private final static DateTimeFormatter TO_S_FORMATTER = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z yyyy").withLocale(Locale.ENGLISH); + private final static DateTimeFormatter TO_S_UTC_FORMATTER = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss 'UTC' yyyy").withLocale(Locale.ENGLISH); + + // There are two different popular TZ formats: legacy (AST+3:00:00, GMT-3), and + // newer one (US/Pacific, America/Los_Angeles). This pattern is to detect + // the legacy TZ format in order to convert it to the newer format + // understood by Java API. + private static final Pattern TZ_PATTERN + = Pattern.compile("(\\D+?)([\\+-]?)(\\d+)(:\\d+)?(:\\d+)?"); + + private static final ByteList TZ_STRING = ByteList.create("TZ"); + + public static DateTimeZone getLocalTimeZone(Ruby runtime) { + RubyString tzVar = runtime.newString(TZ_STRING); + RubyHash h = ((RubyHash)runtime.getObject().fastGetConstant("ENV")); + IRubyObject tz = h.op_aref(runtime.getCurrentContext(), tzVar); + if (tz == null || ! (tz instanceof RubyString)) { + return DateTimeZone.getDefault(); + } else { + String zone = tz.toString(); + DateTimeZone cachedZone = runtime.getLocalTimezoneCache().get(zone); + + if (cachedZone != null) return cachedZone; + + String originalZone = zone; + + // Value of "TZ" property is of a bit different format, + // which confuses the Java's TimeZone.getTimeZone(id) method, + // and so, we need to convert it. + + Matcher tzMatcher = TZ_PATTERN.matcher(zone); + if (tzMatcher.matches()) { + String sign = tzMatcher.group(2); + String hours = tzMatcher.group(3); + String minutes = tzMatcher.group(4); + + // GMT+00:00 --> Etc/GMT, see "MRI behavior" + // comment below. + if (("00".equals(hours) || "0".equals(hours)) + && (minutes == null || ":00".equals(minutes) || ":0".equals(minutes))) { + zone = "Etc/GMT"; + } else { + // Invert the sign, since TZ format and Java format + // use opposite signs, sigh... Also, Java API requires + // the sign to be always present, be it "+" or "-". + sign = ("-".equals(sign)? "+" : "-"); + + // Always use "GMT" since that's required by Java API. + zone = "GMT" + sign + hours; + + if (minutes != null) { + zone += minutes; + } + } + } + + // MRI behavior: With TZ equal to "GMT" or "UTC", Time.now + // is *NOT* considered as a proper GMT/UTC time: + // ENV['TZ']="GMT" + // Time.now.gmt? ==> false + // ENV['TZ']="UTC" + // Time.now.utc? ==> false + // Hence, we need to adjust for that. + if ("GMT".equalsIgnoreCase(zone) || "UTC".equalsIgnoreCase(zone)) { + zone = "Etc/" + zone; + } + + DateTimeZone dtz = DateTimeZone.forTimeZone(TimeZone.getTimeZone(zone)); + runtime.getLocalTimezoneCache().put(originalZone, dtz); + return dtz; + } + } + + public RubyTime(Ruby runtime, RubyClass rubyClass) { + super(runtime, rubyClass); + } + + public RubyTime(Ruby runtime, RubyClass rubyClass, DateTime dt) { + super(runtime, rubyClass); + this.dt = dt; + } + + // We assume that these two time instances + // occurred at the same time. + private static final long BASE_TIME_MILLIS = System.currentTimeMillis(); + private static final long BASE_TIME_NANOS = System.nanoTime(); + + private static ObjectAllocator TIME_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + long usecsPassed = (System.nanoTime() - BASE_TIME_NANOS) / 1000L; + long millisTime = BASE_TIME_MILLIS + usecsPassed / 1000L; + long usecs = usecsPassed % 1000L; + + DateTimeZone dtz = getLocalTimeZone(runtime); + DateTime dt = new DateTime(millisTime, dtz); + RubyTime rt = new RubyTime(runtime, klass, dt); + rt.setUSec(usecs); + + return rt; + } + }; + + public static RubyClass createTimeClass(Ruby runtime) { + RubyClass timeClass = runtime.defineClass("Time", runtime.getObject(), TIME_ALLOCATOR); + timeClass.index = ClassIndex.TIME; + runtime.setTime(timeClass); + + timeClass.includeModule(runtime.getComparable()); + + timeClass.defineAnnotatedMethods(RubyTime.class); + + return timeClass; + } + + public void setUSec(long usec) { + this.usec = usec; + } + + public long getUSec() { + return usec; + } + + public void updateCal(DateTime dt) { + this.dt = dt; + } + + protected long getTimeInMillis() { + return dt.getMillis(); // For JDK 1.4 we can use "cal.getTimeInMillis()" + } + + public static RubyTime newTime(Ruby runtime, long milliseconds) { + return newTime(runtime, new DateTime(milliseconds)); + } + + public static RubyTime newTime(Ruby runtime, DateTime dt) { + return new RubyTime(runtime, runtime.getTime(), dt); + } + + public static RubyTime newTime(Ruby runtime, DateTime dt, long usec) { + RubyTime t = new RubyTime(runtime, runtime.getTime(), dt); + t.setUSec(usec); + return t; + } + + @Override + public Class<?> getJavaClass() { + return Date.class; + } + + @JRubyMethod(name = "initialize_copy", required = 1) + @Override + public IRubyObject initialize_copy(IRubyObject original) { + if (!(original instanceof RubyTime)) { + throw getRuntime().newTypeError("Expecting an instance of class Time"); + } + + RubyTime originalTime = (RubyTime) original; + + // We can just use dt, since it is immutable + dt = originalTime.dt; + usec = originalTime.usec; + + return this; + } + + @JRubyMethod(name = "succ") + public RubyTime succ() { + return newTime(getRuntime(),dt.plusSeconds(1)); + } + + @JRubyMethod(name = {"gmtime", "utc"}) + public RubyTime gmtime() { + dt = dt.withZone(DateTimeZone.UTC); + return this; + } + + @JRubyMethod(name = "localtime") + public RubyTime localtime() { + dt = dt.withZone(getLocalTimeZone(getRuntime())); + return this; + } + + @JRubyMethod(name = {"gmt?", "utc?", "gmtime?"}) + public RubyBoolean gmt() { + return getRuntime().newBoolean(dt.getZone().getID().equals("UTC")); + } + + @JRubyMethod(name = {"getgm", "getutc"}) + public RubyTime getgm() { + return newTime(getRuntime(), dt.withZone(DateTimeZone.UTC), getUSec()); + } + + @JRubyMethod(name = "getlocal") + public RubyTime getlocal() { + return newTime(getRuntime(), dt.withZone(getLocalTimeZone(getRuntime())), getUSec()); + } + + @JRubyMethod(name = "strftime", required = 1) + public RubyString strftime(IRubyObject format) { + final RubyDateFormat rubyDateFormat = new RubyDateFormat("-", Locale.US); + rubyDateFormat.applyPattern(format.toString()); + rubyDateFormat.setDateTime(dt); + String result = rubyDateFormat.format(null); + return getRuntime().newString(result); + } + + @JRubyMethod(name = ">=", required = 1) + public IRubyObject op_ge(ThreadContext context, IRubyObject other) { + if (other instanceof RubyTime) { + return getRuntime().newBoolean(cmp((RubyTime) other) >= 0); + } + + return RubyComparable.op_ge(context, this, other); + } + + @JRubyMethod(name = ">", required = 1) + public IRubyObject op_gt(ThreadContext context, IRubyObject other) { + if (other instanceof RubyTime) { + return getRuntime().newBoolean(cmp((RubyTime) other) > 0); + } + + return RubyComparable.op_gt(context, this, other); + } + + @JRubyMethod(name = "<=", required = 1) + public IRubyObject op_le(ThreadContext context, IRubyObject other) { + if (other instanceof RubyTime) { + return getRuntime().newBoolean(cmp((RubyTime) other) <= 0); + } + + return RubyComparable.op_le(context, this, other); + } + + @JRubyMethod(name = "<", required = 1) + public IRubyObject op_lt(ThreadContext context, IRubyObject other) { + if (other instanceof RubyTime) { + return getRuntime().newBoolean(cmp((RubyTime) other) < 0); + } + + return RubyComparable.op_lt(context, this, other); + } + + private int cmp(RubyTime other) { + long millis = getTimeInMillis(); + long millis_other = other.getTimeInMillis(); + long usec_other = other.usec; + + if (millis > millis_other || (millis == millis_other && usec > usec_other)) { + return 1; + } else if (millis < millis_other || (millis == millis_other && usec < usec_other)) { + return -1; + } + + return 0; + } + + @JRubyMethod(name = "+", required = 1) + public IRubyObject op_plus(IRubyObject other) { + long time = getTimeInMillis(); + + if (other instanceof RubyTime) { + throw getRuntime().newTypeError("time + time ?"); + } + long adjustment = (long) (RubyNumeric.num2dbl(other) * 1000000); + int micro = (int) (adjustment % 1000); + adjustment = adjustment / 1000; + + time += adjustment; + + RubyTime newTime = new RubyTime(getRuntime(), getMetaClass()); + newTime.dt = new DateTime(time).withZone(dt.getZone()); + newTime.setUSec(micro); + + return newTime; + } + + private IRubyObject opMinus(RubyTime other) { + long time = getTimeInMillis() * 1000 + getUSec(); + + time -= other.getTimeInMillis() * 1000 + other.getUSec(); + + return RubyFloat.newFloat(getRuntime(), time / 1000000.0); // float number of seconds + } + + @JRubyMethod(name = "-", required = 1) + public IRubyObject op_minus(IRubyObject other) { + if (other instanceof RubyTime) return opMinus((RubyTime) other); + + long time = getTimeInMillis(); + long adjustment = (long) (RubyNumeric.num2dbl(other) * 1000000); + int micro = (int) (adjustment % 1000); + adjustment = adjustment / 1000; + + time -= adjustment; + + RubyTime newTime = new RubyTime(getRuntime(), getMetaClass()); + newTime.dt = new DateTime(time).withZone(dt.getZone()); + newTime.setUSec(micro); + + return newTime; + } + + @JRubyMethod(name = "===", required = 1) + @Override + public IRubyObject op_eqq(ThreadContext context, IRubyObject other) { + return (RubyNumeric.fix2int(callMethod(context, MethodIndex.OP_SPACESHIP, "<=>", other)) == 0) ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "<=>", required = 1) + public IRubyObject op_cmp(ThreadContext context, IRubyObject other) { + if (other instanceof RubyTime) { + return context.getRuntime().newFixnum(cmp((RubyTime) other)); + } + + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "eql?", required = 1) + @Override + public IRubyObject eql_p(IRubyObject other) { + if (other instanceof RubyTime) { + RubyTime otherTime = (RubyTime)other; + return (usec == otherTime.usec && getTimeInMillis() == otherTime.getTimeInMillis()) ? getRuntime().getTrue() : getRuntime().getFalse(); + } + return getRuntime().getFalse(); + } + + @JRubyMethod(name = {"asctime", "ctime"}) + public RubyString asctime() { + DateTimeFormatter simpleDateFormat; + + if (dt.getDayOfMonth() < 10) { + simpleDateFormat = ONE_DAY_CTIME_FORMATTER; + } else { + simpleDateFormat = TWO_DAY_CTIME_FORMATTER; + } + String result = simpleDateFormat.print(dt); + return getRuntime().newString(result); + } + + @JRubyMethod(name = {"to_s", "inspect"}) + @Override + public IRubyObject to_s() { + DateTimeFormatter simpleDateFormat; + if (dt.getZone() == DateTimeZone.UTC) { + simpleDateFormat = TO_S_UTC_FORMATTER; + } else { + simpleDateFormat = TO_S_FORMATTER; + } + + String result = simpleDateFormat.print(dt); + + return getRuntime().newString(result); + } + + @JRubyMethod(name = "to_a") + @Override + public RubyArray to_a() { + return getRuntime().newArrayNoCopy(new IRubyObject[] { sec(), min(), hour(), mday(), month(), + year(), wday(), yday(), isdst(), zone() }); + } + + @JRubyMethod(name = "to_f") + public RubyFloat to_f() { + long time = getTimeInMillis(); + time = time * 1000 + usec; + return RubyFloat.newFloat(getRuntime(), time / 1000000.0); + } + + @JRubyMethod(name = {"to_i", "tv_sec"}) + public RubyInteger to_i() { + return getRuntime().newFixnum(getTimeInMillis() / 1000); + } + + @JRubyMethod(name = {"usec", "tv_usec"}) + public RubyInteger usec() { + return getRuntime().newFixnum(dt.getMillisOfSecond() * 1000 + getUSec()); + } + + public void setMicroseconds(long mic) { + long millis = getTimeInMillis() % 1000; + long withoutMillis = getTimeInMillis() - millis; + withoutMillis += (mic / 1000); + dt = dt.withMillis(withoutMillis); + usec = mic % 1000; + } + + public long microseconds() { + return getTimeInMillis() % 1000 * 1000 + usec; + } + + @JRubyMethod(name = "sec") + public RubyInteger sec() { + return getRuntime().newFixnum(dt.getSecondOfMinute()); + } + + @JRubyMethod(name = "min") + public RubyInteger min() { + return getRuntime().newFixnum(dt.getMinuteOfHour()); + } + + @JRubyMethod(name = "hour") + public RubyInteger hour() { + return getRuntime().newFixnum(dt.getHourOfDay()); + } + + @JRubyMethod(name = {"mday", "day"}) + public RubyInteger mday() { + return getRuntime().newFixnum(dt.getDayOfMonth()); + } + + @JRubyMethod(name = {"month", "mon"}) + public RubyInteger month() { + return getRuntime().newFixnum(dt.getMonthOfYear()); + } + + @JRubyMethod(name = "year") + public RubyInteger year() { + return getRuntime().newFixnum(dt.getYear()); + } + + @JRubyMethod(name = "wday") + public RubyInteger wday() { + return getRuntime().newFixnum((dt.getDayOfWeek()%7)); + } + + @JRubyMethod(name = "yday") + public RubyInteger yday() { + return getRuntime().newFixnum(dt.getDayOfYear()); + } + + @JRubyMethod(name = {"gmt_offset", "gmtoff", "utc_offset"}) + public RubyInteger gmt_offset() { + int offset = dt.getZone().getOffsetFromLocal(dt.getMillis()); + + return getRuntime().newFixnum((int)(offset/1000)); + } + + @JRubyMethod(name = {"isdst", "dst?"}) + public RubyBoolean isdst() { + return getRuntime().newBoolean(!dt.getZone().isStandardOffset(dt.getMillis())); + } + + @JRubyMethod(name = "zone") + public RubyString zone() { + String zone = dt.getZone().getShortName(dt.getMillis()); + if(zone.equals("+00:00")) { + zone = "GMT"; + } + return getRuntime().newString(zone); + } + + public void setDateTime(DateTime dt) { + this.dt = dt; + } + + public DateTime getDateTime() { + return this.dt; + } + + public Date getJavaDate() { + return this.dt.toDate(); + } + + @JRubyMethod(name = "hash") + @Override + public RubyFixnum hash() { + // modified to match how hash is calculated in 1.8.2 + return getRuntime().newFixnum((int)(((dt.getMillis() / 1000) ^ microseconds()) << 1) >> 1); + } + + @JRubyMethod(name = "_dump", optional = 1, frame = true) + public RubyString dump(IRubyObject[] args, Block unusedBlock) { + RubyString str = (RubyString) mdump(new IRubyObject[] { this }); + str.syncVariables(this.getVariableList()); + return str; + } + + public RubyObject mdump(final IRubyObject[] args) { + RubyTime obj = (RubyTime)args[0]; + DateTime dateTime = obj.dt.withZone(DateTimeZone.UTC); + byte dumpValue[] = new byte[8]; + int pe = + 0x1 << 31 | + (dateTime.getYear()-1900) << 14 | + (dateTime.getMonthOfYear()-1) << 10 | + dateTime.getDayOfMonth() << 5 | + dateTime.getHourOfDay(); + int se = + dateTime.getMinuteOfHour() << 26 | + dateTime.getSecondOfMinute() << 20 | + (dateTime.getMillisOfSecond() * 1000 + (int)usec); // dump usec, not msec + + for(int i = 0; i < 4; i++) { + dumpValue[i] = (byte)(pe & 0xFF); + pe >>>= 8; + } + for(int i = 4; i < 8 ;i++) { + dumpValue[i] = (byte)(se & 0xFF); + se >>>= 8; + } + return RubyString.newString(obj.getRuntime(), new ByteList(dumpValue,false)); + } + + @JRubyMethod(name = "initialize", frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(Block block) { + return this; + } + + /* Time class methods */ + + public static IRubyObject s_new(IRubyObject recv, IRubyObject[] args, Block block) { + Ruby runtime = recv.getRuntime(); + RubyTime time = new RubyTime(runtime, (RubyClass) recv, new DateTime(getLocalTimeZone(runtime))); + time.callInit(args,block); + return time; + } + + /** + * @deprecated Use {@link #newInstance(ThreadContext, IRubyObject)} + */ + @Deprecated + public static IRubyObject newInstance(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) { + return newInstance(context, recv); + } + + @JRubyMethod(name = "now", backtrace = true, meta = true) + public static IRubyObject newInstance(ThreadContext context, IRubyObject recv) { + IRubyObject obj = ((RubyClass) recv).allocate(); + obj.getMetaClass().getBaseCallSites()[RubyClass.CS_IDX_INITIALIZE].call(context, obj); + return obj; + } + + @JRubyMethod(name = "at", meta = true) + public static IRubyObject at(ThreadContext context, IRubyObject recv, IRubyObject arg) { + Ruby runtime = context.getRuntime(); + final RubyTime time; + + if (arg instanceof RubyTime) { + RubyTime other = (RubyTime) arg; + time = new RubyTime(runtime, (RubyClass) recv, other.dt); + time.setUSec(other.getUSec()); + } else { + time = new RubyTime(runtime, (RubyClass) recv, + new DateTime(0L, getLocalTimeZone(runtime))); + + long seconds = RubyNumeric.num2long(arg); + long millisecs = 0; + long microsecs = 0; + + // In the case of two arguments, MRI will discard the portion of + // the first argument after a decimal point (i.e., "floor"). + // However in the case of a single argument, any portion after + // the decimal point is honored. + if (arg instanceof RubyFloat) { + double dbl = ((RubyFloat) arg).getDoubleValue(); + long micro = (long) ((dbl - seconds) * 1000000); + millisecs = micro / 1000; + microsecs = micro % 1000; + } + time.setUSec(microsecs); + time.dt = time.dt.withMillis(seconds * 1000 + millisecs); + } + + time.getMetaClass().getBaseCallSites()[RubyClass.CS_IDX_INITIALIZE].call(context, time); + + return time; + } + + @JRubyMethod(name = "at", meta = true) + public static IRubyObject at(ThreadContext context, IRubyObject recv, IRubyObject arg1, IRubyObject arg2) { + Ruby runtime = context.getRuntime(); + + RubyTime time = new RubyTime(runtime, (RubyClass) recv, + new DateTime(0L, getLocalTimeZone(runtime))); + + long seconds = RubyNumeric.num2long(arg1); + long millisecs = 0; + long microsecs = 0; + + long tmp = RubyNumeric.num2long(arg2); + millisecs = tmp / 1000; + microsecs = tmp % 1000; + + time.setUSec(microsecs); + time.dt = time.dt.withMillis(seconds * 1000 + millisecs); + + time.getMetaClass().getBaseCallSites()[RubyClass.CS_IDX_INITIALIZE].call(context, time); + + return time; + } + + @JRubyMethod(name = {"local", "mktime"}, required = 1, optional = 9, meta = true) + public static RubyTime new_local(IRubyObject recv, IRubyObject[] args) { + return createTime(recv, args, false); + } + + @JRubyMethod(name = {"utc", "gm"}, required = 1, optional = 9, meta = true) + public static RubyTime new_utc(IRubyObject recv, IRubyObject[] args) { + return createTime(recv, args, true); + } + + @JRubyMethod(name = "_load", required = 1, frame = true, meta = true) + public static RubyTime load(IRubyObject recv, IRubyObject from, Block block) { + return s_mload(recv, (RubyTime)(((RubyClass)recv).allocate()), from); + } + + protected static RubyTime s_mload(IRubyObject recv, RubyTime time, IRubyObject from) { + Ruby runtime = recv.getRuntime(); + + DateTime dt = new DateTime(DateTimeZone.UTC); + + byte[] fromAsBytes = null; + fromAsBytes = from.convertToString().getBytes(); + if(fromAsBytes.length != 8) { + throw runtime.newTypeError("marshaled time format differ"); + } + int p=0; + int s=0; + for (int i = 0; i < 4; i++) { + p |= ((int)fromAsBytes[i] & 0xFF) << (8 * i); + } + for (int i = 4; i < 8; i++) { + s |= ((int)fromAsBytes[i] & 0xFF) << (8 * (i - 4)); + } + if ((p & (1<<31)) == 0) { + dt = dt.withMillis(p * 1000L + s); + } else { + p &= ~(1<<31); + dt = dt.withYear(((p >>> 14) & 0xFFFF) + 1900); + dt = dt.withMonthOfYear(((p >>> 10) & 0xF) + 1); + dt = dt.withDayOfMonth(((p >>> 5) & 0x1F)); + dt = dt.withHourOfDay((p & 0x1F)); + dt = dt.withMinuteOfHour(((s >>> 26) & 0x3F)); + dt = dt.withSecondOfMinute(((s >>> 20) & 0x3F)); + // marsaling dumps usec, not msec + dt = dt.withMillisOfSecond((s & 0xFFFFF) / 1000); + dt = dt.withZone(getLocalTimeZone(runtime)); + time.setUSec((s & 0xFFFFF) % 1000); + } + time.setDateTime(dt); + return time; + } + + private static final String[] MONTHS = {"jan", "feb", "mar", "apr", "may", "jun", + "jul", "aug", "sep", "oct", "nov", "dec"}; + + private static final Map<String, Integer> MONTHS_MAP = new HashMap<String, Integer>(); + static { + for (int i = 0; i < MONTHS.length; i++) { + MONTHS_MAP.put(MONTHS[i], i + 1); + } + } + + private static final int[] time_min = {1, 0, 0, 0, Integer.MIN_VALUE}; + private static final int[] time_max = {31, 23, 59, 60, Integer.MAX_VALUE}; + + private static final int ARG_SIZE = 7; + + private static RubyTime createTime(IRubyObject recv, IRubyObject[] args, boolean gmt) { + Ruby runtime = recv.getRuntime(); + int len = ARG_SIZE; + + if (args.length == 10) { + args = new IRubyObject[] { args[5], args[4], args[3], args[2], args[1], args[0], runtime.getNil() }; + } else { + // MRI accepts additional wday argument which appears to be ignored. + len = args.length; + + if (len < ARG_SIZE) { + IRubyObject[] newArgs = new IRubyObject[ARG_SIZE]; + System.arraycopy(args, 0, newArgs, 0, args.length); + for (int i = len; i < ARG_SIZE; i++) { + newArgs[i] = runtime.getNil(); + } + args = newArgs; + len = ARG_SIZE; + } + } + + if (args[0] instanceof RubyString) { + args[0] = RubyNumeric.str2inum(runtime, (RubyString) args[0], 10, false); + } + + int year = (int) RubyNumeric.num2long(args[0]); + int month = 1; + + if (len > 1) { + if (!args[1].isNil()) { + IRubyObject tmp = args[1].checkStringType(); + if (!tmp.isNil()) { + String monthString = tmp.toString().toLowerCase(); + Integer monthInt = MONTHS_MAP.get(monthString); + + if (monthInt != null) { + month = monthInt; + } else { + try { + month = Integer.parseInt(monthString); + } catch (NumberFormatException nfExcptn) { + throw runtime.newArgumentError("Argument out of range."); + } + } + } else { + month = (int) RubyNumeric.num2long(args[1]); + } + } + if (1 > month || month > 12) { + throw runtime.newArgumentError("Argument out of range: for month: " + month); + } + } + + int[] int_args = { 1, 0, 0, 0, 0, 0 }; + + for (int i = 0; int_args.length >= i + 2; i++) { + if (!args[i + 2].isNil()) { + if (!(args[i + 2] instanceof RubyNumeric)) { + args[i + 2] = args[i + 2].callMethod( + runtime.getCurrentContext(), "to_i"); + } + + long value = RubyNumeric.num2long(args[i + 2]); + if (time_min[i] > value || value > time_max[i]) { + throw runtime.newArgumentError("argument out of range."); + } + int_args[i] = (int) value; + } + } + + if (0 <= year && year < 39) { + year += 2000; + } else if (69 <= year && year < 139) { + year += 1900; + } + + DateTimeZone dtz; + if (gmt) { + dtz = DateTimeZone.UTC; + } else { + dtz = getLocalTimeZone(runtime); + } + + DateTime dt; + // set up with min values and then add to allow rolling over + try { + dt = new DateTime(year, 1, 1, 0, 0 , 0, 0, dtz); + + dt = dt.plusMonths(month - 1) + .plusDays(int_args[0] - 1) + .plusHours(int_args[1]) + .plusMinutes(int_args[2]) + .plusSeconds(int_args[3]); + } catch (org.joda.time.IllegalFieldValueException e) { + throw runtime.newArgumentError("time out of range"); + } + + RubyTime time = new RubyTime(runtime, (RubyClass) recv, dt); + // Ignores usec if 8 args (for compatibility with parsedate) or if not supplied. + if (args.length != 8 && !args[6].isNil()) { + int usec = int_args[4] % 1000; + int msec = int_args[4] / 1000; + + if (int_args[4] < 0) { + msec -= 1; + usec += 1000; + } + time.dt = dt.withMillis(dt.getMillis() + msec); + time.setUSec(usec); + } + + time.callInit(IRubyObject.NULL_ARRAY, Block.NULL_BLOCK); + return time; + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2004 Charles O Nutter <headius@headius.com> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.internal.runtime.methods.DynamicMethod; +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +/** + * + * Note: This was renamed from UnboundMethod.java + * + * @author jpetersen + */ +@JRubyClass(name="UnboundMethod", parent="Method") +public class RubyUnboundMethod extends RubyMethod { + protected RubyUnboundMethod(Ruby runtime) { + super(runtime, runtime.getUnboundMethod()); + } + + public static RubyUnboundMethod newUnboundMethod( + RubyModule implementationModule, + String methodName, + RubyModule originModule, + String originName, + DynamicMethod method) { + RubyUnboundMethod newMethod = new RubyUnboundMethod(implementationModule.getRuntime()); + + newMethod.implementationModule = implementationModule; + newMethod.methodName = methodName; + newMethod.originModule = originModule; + newMethod.originName = originName; + newMethod.method = method; + + return newMethod; + } + + public static RubyClass defineUnboundMethodClass(Ruby runtime) { + // TODO: NOT_ALLOCATABLE_ALLOCATOR is probably ok here. Confirm. JRUBY-415 + RubyClass newClass = + runtime.defineClass("UnboundMethod", runtime.getMethod(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + runtime.setUnboundMethod(newClass); + + newClass.defineAnnotatedMethods(RubyUnboundMethod.class); + + return newClass; + } + + /** + * @see org.jruby.RubyMethod#call(IRubyObject[]) + */ + @JRubyMethod(name = {"call", "[]"}, rest = true, frame = true) + @Override + public IRubyObject call(ThreadContext context, IRubyObject[] args, Block block) { + throw context.getRuntime().newTypeError("you cannot call unbound method; bind first"); + } + + /** + * @see org.jruby.RubyMethod#unbind() + */ + @JRubyMethod(name = "unbind", frame = true) + @Override + public RubyUnboundMethod unbind(Block block) { + return this; + } + + @JRubyMethod(name = "bind", required = 1, frame = true) + public RubyMethod bind(ThreadContext context, IRubyObject aReceiver, Block block) { + RubyClass receiverClass = aReceiver.getMetaClass(); + + if (!originModule.isInstance(aReceiver)) { + if (originModule instanceof MetaClass) { + throw context.getRuntime().newTypeError("singleton method called for a different object"); + } else if (receiverClass instanceof MetaClass && receiverClass.getMethods().containsKey(originName)) { + throw context.getRuntime().newTypeError("method `" + originName + "' overridden"); + } else if ( + !(originModule.isModule() ? originModule.isInstance(aReceiver) : aReceiver.getType() == originModule)) { + // FIX replace type() == ... with isInstanceOf(...) + throw context.getRuntime().newTypeError("bind argument must be an instance of " + originModule.getName()); + } + } + return RubyMethod.newMethod(implementationModule, methodName, receiverClass, originName, method, aReceiver); + } + + @JRubyMethod(name = "clone") + @Override + public RubyMethod rbClone() { + return newUnboundMethod(implementationModule, methodName, originModule, originName, method); + } + + @JRubyMethod(name = "to_proc", frame = true) + @Override + public IRubyObject to_proc(ThreadContext context, Block unusedBlock) { + return super.to_proc(context, unusedBlock); + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2007 Ola Bini <ola.bini@gmail.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.IOException; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import java.util.regex.Pattern; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyModule; + +import org.jruby.runtime.Block; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.builtin.IRubyObject; + +import org.jruby.javasupport.JavaEmbedUtils; + +import org.jruby.javasupport.JavaUtil; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.MethodIndex; +import org.jruby.runtime.Visibility; + +import org.jruby.yaml.JRubyRepresenter; +import org.jruby.yaml.JRubyConstructor; +import org.jruby.yaml.JRubySerializer; +import org.jruby.util.IOInputStream; +import org.jruby.util.IOOutputStream; + +import org.jvyamlb.Representer; +import org.jvyamlb.Constructor; +import org.jvyamlb.ParserImpl; +import org.jvyamlb.PositioningParserImpl; +import org.jvyamlb.Scanner; +import org.jvyamlb.ScannerImpl; +import org.jvyamlb.Composer; +import org.jvyamlb.ComposerImpl; +import org.jvyamlb.PositioningScannerImpl; +import org.jvyamlb.PositioningComposerImpl; +import org.jvyamlb.Serializer; +import org.jvyamlb.ResolverImpl; +import org.jvyamlb.EmitterImpl; +import org.jvyamlb.exceptions.YAMLException; +import org.jvyamlb.YAMLConfig; +import org.jvyamlb.YAML; +import org.jvyamlb.PositioningScanner; +import org.jvyamlb.Positionable; +import org.jvyamlb.Position; + +/** + * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a> + */ +@JRubyModule(name="YAML") +public class RubyYAML { + public static RubyModule createYAMLModule(Ruby runtime) { + RubyModule result = runtime.defineModule("YAML"); + + runtime.getKernel().callMethod(runtime.getCurrentContext(),"require", runtime.newString("stringio")); + + result.defineAnnotatedMethods(RubyYAML.class); + + RubyClass obj = runtime.getObject(); + RubyClass clazz = runtime.getClassClass(); + RubyClass hash = runtime.getHash(); + RubyClass array = runtime.getArray(); + RubyClass struct = runtime.getStructClass(); + RubyClass exception = runtime.getException(); + RubyClass string = runtime.getString(); + RubyClass symbol = runtime.getSymbol(); + RubyClass range = runtime.getRange(); + RubyClass regexp = runtime.getRegexp(); + RubyClass time = runtime.getTime(); + RubyClass date = runtime.fastGetClass("Date"); + RubyClass fixnum = runtime.getFixnum(); + RubyClass bignum = runtime.getBignum(); + RubyClass flt = runtime.getFloat(); + RubyClass trueClass = runtime.getTrueClass(); + RubyClass falseClass = runtime.getFalseClass(); + RubyClass nilClass = runtime.getNilClass(); + + clazz.defineAnnotatedMethods(YAMLClassMethods.class); + + obj.defineAnnotatedMethods(YAMLObjectMethods.class); + + hash.defineAnnotatedMethods(YAMLHashMethods.class); + + array.defineAnnotatedMethods(YAMLArrayMethods.class); + + struct.defineAnnotatedMethods(YAMLStructMethods.class); + + exception.defineAnnotatedMethods(YAMLExceptionMethods.class); + + string.defineAnnotatedMethods(YAMLStringMethods.class); + + symbol.defineAnnotatedMethods(YAMLSymbolMethods.class); + + range.defineAnnotatedMethods(YAMLRangeMethods.class); + + regexp.defineAnnotatedMethods(YAMLRegexpMethods.class); + + time.defineAnnotatedMethods(YAMLTimeMethods.class); + + date.defineAnnotatedMethods(YAMLDateMethods.class); + + bignum.defineAnnotatedMethods(YAMLNumericMethods.class); + + fixnum.defineAnnotatedMethods(YAMLNumericMethods.class); + + flt.defineAnnotatedMethods(YAMLNumericMethods.class); + + trueClass.defineAnnotatedMethods(YAMLTrueMethods.class); + + falseClass.defineAnnotatedMethods(YAMLFalseMethods.class); + + nilClass.defineAnnotatedMethods(YAMLNilMethods.class); + + runtime.setObjectToYamlMethod(runtime.getObject().searchMethod("to_yaml")); + + return result; + } + + @JRubyMethod(name = "dump", required = 1, optional = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject dump(IRubyObject self, IRubyObject[] args) { + IRubyObject obj = args[0]; + Ruby runtime = self.getRuntime(); + IRubyObject val = runtime.newArray(obj); + if(args.length>1) { + return RuntimeHelpers.invoke(runtime.getCurrentContext(), self,"dump_all", val, args[1]); + } else { + return self.callMethod(runtime.getCurrentContext(),"dump_all", val); + } + } + + @JRubyMethod(name = "dump_all", required = 1, optional = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject dump_all(IRubyObject self, IRubyObject[] args) { + ThreadContext context = self.getRuntime().getCurrentContext(); + RubyArray objs = (RubyArray)args[0]; + IRubyObject io = null; + IRubyObject io2 = null; + if(args.length == 2 && args[1] != null && !args[1].isNil()) { + io = args[1]; + } + YAMLConfig cfg = YAML.config().version("1.0"); + IOOutputStream iox = null; + if(null == io) { + io2 = self.getRuntime().fastGetClass("StringIO").callMethod(context, "new"); + iox = new IOOutputStream(io2); + } else { + iox = new IOOutputStream(io); + } + Serializer ser = new JRubySerializer(new EmitterImpl(iox,cfg),new ResolverImpl(),cfg); + try { + ser.open(); + Representer r = new JRubyRepresenter(ser, cfg); + for(Iterator iter = objs.getList().iterator();iter.hasNext();) { + r.represent(iter.next()); + } + ser.close(); + } catch(IOException e) { + throw self.getRuntime().newIOErrorFromException(e); + } + if(null == io) { + io2.callMethod(context, "rewind"); + return io2.callMethod(context, "read"); + } else { + return io; + } + } + + @JRubyMethod(name = "_parse_internal", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject parse_internal(IRubyObject self, IRubyObject arg) { + boolean debug = self.getRuntime().getDebug().isTrue(); + IRubyObject io = check_yaml_port(arg); + Scanner scn = null; + try { + if(io instanceof RubyString) { + scn = debug ? new PositioningScannerImpl(((RubyString)io).getByteList()) : new ScannerImpl(((RubyString)io).getByteList()); + } else { + scn = debug ? new PositioningScannerImpl(new IOInputStream(io)) : new ScannerImpl(new IOInputStream(io)); + } + Composer ctor = + debug ? + new PositioningComposerImpl(new PositioningParserImpl((PositioningScanner)scn,YAML.config().version("1.0")),new ResolverImpl()) : + new ComposerImpl(new ParserImpl(scn,YAML.config().version("1.0")),new ResolverImpl()) + ; + if(ctor.checkNode()) { + return JavaEmbedUtils.javaToRuby(self.getRuntime(),ctor.getNode()); + } + return self.getRuntime().getNil(); + } catch(YAMLException e) { + if(self.getRuntime().getDebug().isTrue()) { + Position.Range range = ((Positionable)e).getRange(); + throw self.getRuntime().newArgumentError("syntax error on " + range.start + ":" + range.end + ": " + e.getMessage()); + } else { + throw self.getRuntime().newArgumentError("syntax error:" + e.getMessage()); + } + } + } + + @JRubyMethod(name = "load", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject load(IRubyObject self, IRubyObject arg) { + boolean debug = self.getRuntime().getDebug().isTrue(); + IRubyObject io = check_yaml_port(arg); + Scanner scn = null; + try { + if(io instanceof RubyString) { + scn = debug ? new PositioningScannerImpl(((RubyString)io).getByteList()) : new ScannerImpl(((RubyString)io).getByteList()); + } else { + scn = debug ? new PositioningScannerImpl(new IOInputStream(io)) : new ScannerImpl(new IOInputStream(io)); + } + Constructor ctor = + debug ? + new JRubyConstructor(self, new PositioningComposerImpl(new PositioningParserImpl((PositioningScanner)scn,YAML.config().version("1.0")),new ResolverImpl())) : + new JRubyConstructor(self, new ComposerImpl(new ParserImpl(scn,YAML.config().version("1.0")),new ResolverImpl())) + ; + if(ctor.checkData()) { + return JavaEmbedUtils.javaToRuby(self.getRuntime(),ctor.getData()); + } + return self.getRuntime().getNil(); + } catch(YAMLException e) { + if(self.getRuntime().getDebug().isTrue()) { + Position.Range range = ((Positionable)e).getRange(); + throw self.getRuntime().newArgumentError("syntax error on " + range.start + ":" + range.end + ": " + e.getMessage()); + } else { + throw self.getRuntime().newArgumentError("syntax error:" + e.getMessage()); + } + } + } + + @JRubyMethod(name = "load_file", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject load_file(IRubyObject self, IRubyObject arg) { + Ruby runtime = self.getRuntime(); + ThreadContext context = runtime.getCurrentContext(); + IRubyObject io = RuntimeHelpers.invoke(context, runtime.getFile(),"open", arg, runtime.newString("r")); + IRubyObject val = self.callMethod(context,"load", io); + io.callMethod(context, "close"); + return val; + } + + @JRubyMethod(name = "each_document", required = 1, frame = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject each_document(IRubyObject self, IRubyObject arg, Block block) { + boolean debug = self.getRuntime().getDebug().isTrue(); + ThreadContext context = self.getRuntime().getCurrentContext(); + IRubyObject io = arg; + Scanner scn = null; + try { + if(io instanceof RubyString) { + scn = debug ? new PositioningScannerImpl(((RubyString)io).getByteList()) : new ScannerImpl(((RubyString)io).getByteList()); + } else { + scn = debug ? new PositioningScannerImpl(new IOInputStream(io)) : new ScannerImpl(new IOInputStream(io)); + } + Constructor ctor = + debug ? + new JRubyConstructor(self, new PositioningComposerImpl(new PositioningParserImpl((PositioningScanner)scn,YAML.config().version("1.0")),new ResolverImpl())) : + new JRubyConstructor(self, new ComposerImpl(new ParserImpl(scn,YAML.config().version("1.0")),new ResolverImpl())) + ; + while(ctor.checkData()) { + block.yield(context, JavaEmbedUtils.javaToRuby(self.getRuntime(),ctor.getData())); + } + return self.getRuntime().getNil(); + } catch(YAMLException e) { + if(self.getRuntime().getDebug().isTrue()) { + Position.Range range = ((Positionable)e).getRange(); + throw self.getRuntime().newArgumentError("syntax error on " + range.start + ":" + range.end + ": " + e.getMessage()); + } else { + throw self.getRuntime().newArgumentError("syntax error:" + e.getMessage()); + } + } + } + + @JRubyMethod(name = "load_documents", required = 1, frame = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject load_documents(IRubyObject self, IRubyObject arg, Block block) { + boolean debug = self.getRuntime().getDebug().isTrue(); + ThreadContext context = self.getRuntime().getCurrentContext(); + IRubyObject io = check_yaml_port(arg); + Scanner scn = null; + try { + if(io instanceof RubyString) { + scn = debug ? new PositioningScannerImpl(((RubyString)io).getByteList()) : new ScannerImpl(((RubyString)io).getByteList()); + } else { + scn = debug ? new PositioningScannerImpl(new IOInputStream(io)) : new ScannerImpl(new IOInputStream(io)); + } + Constructor ctor = + debug ? + new JRubyConstructor(self, new PositioningComposerImpl(new PositioningParserImpl((PositioningScanner)scn,YAML.config().version("1.0")),new ResolverImpl())) : + new JRubyConstructor(self, new ComposerImpl(new ParserImpl(scn,YAML.config().version("1.0")),new ResolverImpl())) + ; + while(ctor.checkData()) { + block.yield(context, JavaEmbedUtils.javaToRuby(self.getRuntime(),ctor.getData())); + } + return self.getRuntime().getNil(); + } catch(YAMLException e) { + if(self.getRuntime().getDebug().isTrue()) { + Position.Range range = ((Positionable)e).getRange(); + throw self.getRuntime().newArgumentError("syntax error on " + range.start + ":" + range.end + ": " + e.getMessage()); + } else { + throw self.getRuntime().newArgumentError("syntax error:" + e.getMessage()); + } + } + } + + @JRubyMethod(name = "load_stream", required = 1, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject load_stream(IRubyObject self, IRubyObject arg) { + boolean debug = self.getRuntime().getDebug().isTrue(); + ThreadContext context = self.getRuntime().getCurrentContext(); + IRubyObject d = self.getRuntime().getNil(); + IRubyObject io = arg; + Scanner scn = null; + try { + if(io instanceof RubyString) { + scn = debug ? new PositioningScannerImpl(((RubyString)io).getByteList()) : new ScannerImpl(((RubyString)io).getByteList()); + } else { + scn = debug ? new PositioningScannerImpl(new IOInputStream(io)) : new ScannerImpl(new IOInputStream(io)); + } + Constructor ctor = + debug ? + new JRubyConstructor(self, new PositioningComposerImpl(new PositioningParserImpl((PositioningScanner)scn,YAML.config().version("1.0")),new ResolverImpl())) : + new JRubyConstructor(self, new ComposerImpl(new ParserImpl(scn,YAML.config().version("1.0")),new ResolverImpl())) + ; + while(ctor.checkData()) { + if(d.isNil()) { + d = self.getRuntime().fastGetModule("YAML").fastGetClass("Stream").callMethod(context,"new", d); + } + d.callMethod(context,"add", JavaEmbedUtils.javaToRuby(self.getRuntime(),ctor.getData())); + } + return d; + } catch(YAMLException e) { + if(self.getRuntime().getDebug().isTrue()) { + Position.Range range = ((Positionable)e).getRange(); + throw self.getRuntime().newArgumentError("syntax error on " + range.start + ":" + range.end + ": " + e.getMessage()); + } else { + throw self.getRuntime().newArgumentError("syntax error:" + e.getMessage()); + } + } + } + + @JRubyMethod(name = "dump_stream", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject dump_stream(IRubyObject self, IRubyObject[] args) { + ThreadContext context = self.getRuntime().getCurrentContext(); + IRubyObject stream = self.getRuntime().fastGetModule("YAML").fastGetClass("Stream").callMethod(context, "new"); + for(int i=0,j=args.length;i<j;i++) { + stream.callMethod(context,"add", args[i]); + } + return stream.callMethod(context, "emit"); + } + + @JRubyMethod(name = "quick_emit_node", required = 1, rest = true, frame = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject quick_emit_node(IRubyObject self, IRubyObject[] args, Block block) { + return block.yield(self.getRuntime().getCurrentContext(), args[0]); + } + +// @JRubyMethod(name = "quick_emit_node", rest = true, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject quick_emit(IRubyObject self, IRubyObject[] args) { + return self.getRuntime().getNil(); + } + + // prepares IO port type for load (ported from ext/syck/rubyext.c) + private static IRubyObject check_yaml_port(IRubyObject port) { + if (port instanceof RubyString) { + // OK + } + else if (port.respondsTo("read")) { + if (port.respondsTo("binmode")) { + ThreadContext context = port.getRuntime().getCurrentContext(); + port.callMethod(context, "binmode"); + } + } + else { + throw port.getRuntime().newTypeError("instance of IO needed"); + } + return port; + } + + @JRubyClass(name="Hash") + public static class YAMLHashMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject hash_to_yaml_node(IRubyObject self, IRubyObject arg) { + Ruby runtime = self.getRuntime(); + ThreadContext context = runtime.getCurrentContext(); + return RuntimeHelpers.invoke(context, arg, "map", self.callMethod(context, "taguri"), self, self.callMethod(context, "to_yaml_style")); + } + } + + @JRubyClass(name="Object") + public static class YAMLObjectMethods { + @JRubyMethod(name = "to_yaml_properties") + public static IRubyObject obj_to_yaml_properties(IRubyObject self) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return self.callMethod(context, "instance_variables").callMethod(context, "sort"); + } + @JRubyMethod(name = "to_yaml_style") + public static IRubyObject obj_to_yaml_style(IRubyObject self) { + return self.getRuntime().getNil(); + } + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject obj_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + Map mep = (Map)(new RubyHash(self.getRuntime())); + RubyArray props = (RubyArray)self.callMethod(context, "to_yaml_properties"); + for(Iterator iter = props.getList().iterator(); iter.hasNext();) { + String m = iter.next().toString(); + mep.put(self.getRuntime().newString(m.substring(1)), self.callMethod(context,"instance_variable_get", self.getRuntime().newString(m))); + } + return RuntimeHelpers.invoke(context, arg, "map", self.callMethod(context, "taguri"), (IRubyObject)mep, self.callMethod(context, "to_yaml_style")); + } + @JRubyMethod(name = "to_yaml", rest = true) + public static IRubyObject obj_to_yaml(IRubyObject self, IRubyObject[] args) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return self.getRuntime().fastGetModule("YAML").callMethod(context,"dump", self); + } + @JRubyMethod(name = "taguri") + public static IRubyObject obj_taguri(IRubyObject self) { + return self.getRuntime().newString("!ruby/object:" + self.getType().getName()); + } + } + + @JRubyClass(name="Class") + public static class YAMLClassMethods { + @JRubyMethod(name = "to_yaml", rest = true) + public static IRubyObject class_to_yaml(IRubyObject self, IRubyObject[] args) { + throw self.getRuntime().newTypeError("can't dump anonymous class " + self.getType().getName()); + } + } + + @JRubyClass(name="Array") + public static class YAMLArrayMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject array_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return RuntimeHelpers.invoke(context, arg, "seq", self.callMethod(context, "taguri"), self, self.callMethod(context, "to_yaml_style")); + } + } + + @JRubyClass(name="Struct") + public static class YAMLStructMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject struct_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + Map mep = (Map)(new RubyHash(self.getRuntime())); + for(Iterator iter = ((RubyArray)self.callMethod(context, "members")).getList().iterator();iter.hasNext();) { + IRubyObject key = self.getRuntime().newString(iter.next().toString()); + mep.put(key,self.callMethod(context,MethodIndex.AREF, "[]", key)); + } + for(Iterator iter = ((RubyArray)self.callMethod(context, "to_yaml_properties")).getList().iterator(); iter.hasNext();) { + String m = iter.next().toString(); + mep.put(self.getRuntime().newString(m.substring(1)), self.callMethod(context,"instance_variable_get", self.getRuntime().newString(m))); + } + return RuntimeHelpers.invoke(context, arg, "map", self.callMethod(context, "taguri"), (IRubyObject)mep, self.callMethod(context, "to_yaml_style")); + } + @JRubyMethod(name = "taguri") + public static IRubyObject struct_taguri(IRubyObject self) { + return self.getRuntime().newString("!ruby/struct:" + self.getType().getName()); + } + } + + @JRubyClass(name="Exception") + public static class YAMLExceptionMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject exception_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + Map mep = (Map)(new RubyHash(self.getRuntime())); + mep.put(self.getRuntime().newString("message"),self.callMethod(context, "message")); + for(Iterator iter = ((RubyArray)self.callMethod(context, "to_yaml_properties")).getList().iterator(); iter.hasNext();) { + String m = iter.next().toString(); + mep.put(self.getRuntime().newString(m.substring(1)), self.callMethod(context,"instance_variable_get", self.getRuntime().newString(m))); + } + return RuntimeHelpers.invoke(context, arg,"map", self.callMethod(context, "taguri"), (IRubyObject)mep, self.callMethod(context, "to_yaml_style")); + } + @JRubyMethod(name = "taguri") + public static IRubyObject exception_taguri(IRubyObject self) { + return self.getRuntime().newString("!ruby/exception:" + self.getType().getName()); + } + } + + private static final Pattern AFTER_NEWLINE = Pattern.compile("\n.+", Pattern.DOTALL); + @JRubyClass(name="String") + public static class YAMLStringMethods { + @JRubyMethod(name = "is_complex_yaml?") + public static IRubyObject string_is_complex(IRubyObject self) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return (self.callMethod(context, "to_yaml_style").isTrue() || + ((List)self.callMethod(context, "to_yaml_properties")).isEmpty() || + AFTER_NEWLINE.matcher(self.toString()).find()) ? self.getRuntime().getTrue() : self.getRuntime().getFalse(); + } + @JRubyMethod(name = "is_binary_data?") + public static IRubyObject string_is_binary(IRubyObject self) { + ThreadContext context = self.getRuntime().getCurrentContext(); + if(self.callMethod(context, MethodIndex.EMPTY_P, "empty?").isTrue()) { + return self.getRuntime().getNil(); + } + return self.toString().indexOf('\0') != -1 ? self.getRuntime().getTrue() : self.getRuntime().getFalse(); + } + private static JRubyRepresenter into(IRubyObject arg) { + IRubyObject jobj = arg.getInstanceVariables().fastGetInstanceVariable("@java_object"); + if(jobj != null) { + return (JRubyRepresenter)(((org.jruby.javasupport.JavaObject)jobj).getValue()); + } + return null; + } + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject string_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + Ruby rt = self.getRuntime(); + if(self.callMethod(context, "is_binary_data?").isTrue()) { + return RuntimeHelpers.invoke(context, arg, "scalar", rt.newString("tag:yaml.org,2002:binary"), rt.newArray(self).callMethod(context, "pack", rt.newString("m")), rt.newString("|")); + } + if(((List)self.callMethod(context, "to_yaml_properties")).isEmpty()) { + JRubyRepresenter rep = into(arg); + if(rep != null) { + try { + return JavaUtil.convertJavaToRuby(rt,rep.scalar(self.callMethod(context, "taguri").toString(),self.convertToString().getByteList(),self.toString().startsWith(":") ? "\"" : self.callMethod(context, "to_yaml_style").toString())); + } catch(IOException e) { + throw rt.newIOErrorFromException(e); + } + } else { + return RuntimeHelpers.invoke(context, arg, "scalar", self.callMethod(context, "taguri"), self, self.toString().startsWith(":") ? rt.newString("\"") : self.callMethod(context, "to_yaml_style")); + } + } + + Map mep = (Map)(new RubyHash(self.getRuntime())); + mep.put(self.getRuntime().newString("str"),rt.newString(self.toString())); + for(Iterator iter = ((RubyArray)self.callMethod(context, "to_yaml_properties")).getList().iterator(); iter.hasNext();) { + String m = iter.next().toString(); + mep.put(self.getRuntime().newString(m), self.callMethod(context,"instance_variable_get", self.getRuntime().newString(m))); + } + return RuntimeHelpers.invoke(context, arg, "map", self.callMethod(context, "taguri"), (IRubyObject)mep, self.callMethod(context, "to_yaml_style")); + } + } + + @JRubyClass(name="Symbol") + public static class YAMLSymbolMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject symbol_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return RuntimeHelpers.invoke(context, arg, "scalar", self.callMethod(context, "taguri"), self.callMethod(context, "inspect"), self.callMethod(context, "to_yaml_style")); + } + @JRubyMethod(name = "taguri") + public static IRubyObject symbol_taguri(IRubyObject self) { + return self.getRuntime().newString("tag:yaml.org,2002:str"); + } + } + + @JRubyClass(name="Numeric") + public static class YAMLNumericMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject numeric_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + String val = self.toString(); + if("Infinity".equals(val)) { + val = ".Inf"; + } else if("-Infinity".equals(val)) { + val = "-.Inf"; + } else if("NaN".equals(val)) { + val = ".NaN"; + } + return RuntimeHelpers.invoke(context, arg,"scalar", self.callMethod(context, "taguri"), self.getRuntime().newString(val), self.callMethod(context, "to_yaml_style")); + } + } + + @JRubyClass(name="Range") + public static class YAMLRangeMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject range_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + Map mep = (Map)(new RubyHash(self.getRuntime())); + mep.put(self.getRuntime().newString("begin"),self.callMethod(context, "begin")); + mep.put(self.getRuntime().newString("end"),self.callMethod(context, "end")); + mep.put(self.getRuntime().newString("excl"),self.callMethod(context, "exclude_end?")); + for(Iterator iter = ((RubyArray)self.callMethod(context, "to_yaml_properties")).getList().iterator(); iter.hasNext();) { + String m = iter.next().toString(); + mep.put(self.getRuntime().newString(m.substring(1)), self.callMethod(context,"instance_variable_get", self.getRuntime().newString(m))); + } + return RuntimeHelpers.invoke(context, arg, "map", self.callMethod(context, "taguri"), (IRubyObject)mep, self.callMethod(context, "to_yaml_style")); + } + } + + @JRubyClass(name="Regexp") + public static class YAMLRegexpMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject regexp_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return RuntimeHelpers.invoke(context, arg, "scalar", self.callMethod(context, "taguri"), self.callMethod(context, "inspect"), self.callMethod(context, "to_yaml_style")); + } + } + + @JRubyClass(name="Time") + public static class YAMLTimeMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject time_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + IRubyObject tz = self.getRuntime().newString("Z"); + IRubyObject difference_sign = self.getRuntime().newString("-"); + self = self.dup(); + if(!self.callMethod(context, "utc?").isTrue()) { + IRubyObject utc_same_instant = self.callMethod(context, "utc"); + IRubyObject utc_same_writing = RuntimeHelpers.invoke(context, self.getRuntime().getTime(), "utc", new IRubyObject[]{ + self.callMethod(context, "year"),self.callMethod(context, "month"),self.callMethod(context, "day"),self.callMethod(context, "hour"), + self.callMethod(context, "min"),self.callMethod(context, "sec"),self.callMethod(context, "usec")}); + IRubyObject difference_to_utc = utc_same_writing.callMethod(context,MethodIndex.OP_MINUS, "-", utc_same_instant); + IRubyObject absolute_difference; + if(difference_to_utc.callMethod(context,MethodIndex.OP_LT, "<", RubyFixnum.zero(self.getRuntime())).isTrue()) { + difference_sign = self.getRuntime().newString("-"); + absolute_difference = RubyFixnum.zero(self.getRuntime()).callMethod(context,MethodIndex.OP_MINUS, "-", difference_to_utc); + } else { + difference_sign = self.getRuntime().newString("+"); + absolute_difference = difference_to_utc; + } + IRubyObject difference_minutes = absolute_difference.callMethod(context,"/", self.getRuntime().newFixnum(60)).callMethod(context, "round"); + tz = self.getRuntime().newString("%s%02d:%02d").callMethod(context,"%", self.getRuntime().newArrayNoCopy(new IRubyObject[]{difference_sign,difference_minutes.callMethod(context,"/", self.getRuntime().newFixnum(60)),difference_minutes.callMethod(context,"%", self.getRuntime().newFixnum(60))})); + } + IRubyObject standard = self.callMethod(context,"strftime", self.getRuntime().newString("%Y-%m-%d %H:%M:%S")); + if(self.callMethod(context, "usec").callMethod(context, "nonzero?").isTrue()) { + standard = standard.callMethod(context, MethodIndex.OP_PLUS, "+", self.getRuntime().newString(".%06d").callMethod(context,"%", self.getRuntime().newArray(self.callMethod(context, "usec")))); + } + standard = standard.callMethod(context,MethodIndex.OP_PLUS, "+", self.getRuntime().newString(" %s").callMethod(context,"%", self.getRuntime().newArray(tz))); + return RuntimeHelpers.invoke(context, arg, "scalar", self.callMethod(context, "taguri"), standard, self.callMethod(context, "to_yaml_style")); + } + } + + @JRubyClass(name="Date") + public static class YAMLDateMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject date_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return RuntimeHelpers.invoke(context, arg, "scalar", self.callMethod(context, "taguri"), self.callMethod(context, MethodIndex.TO_S, "to_s"), self.callMethod(context, "to_yaml_style")); + } + } + + @JRubyClass(name="TrueClass") + public static class YAMLTrueMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject true_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return RuntimeHelpers.invoke(context, arg, "scalar", self.callMethod(context, "taguri"), self.callMethod(context, MethodIndex.TO_S, "to_s"), self.callMethod(context, "to_yaml_style")); + } + @JRubyMethod(name = "taguri") + public static IRubyObject true_taguri(IRubyObject self) { + return self.getRuntime().newString("tag:yaml.org,2002:bool"); + } + } + + @JRubyClass(name="FalseClass") + public static class YAMLFalseMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject false_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return RuntimeHelpers.invoke(context, arg, "scalar", self.callMethod(context, "taguri"), self.callMethod(context, MethodIndex.TO_S, "to_s"), self.callMethod(context, "to_yaml_style")); + } + @JRubyMethod(name = "taguri") + public static IRubyObject false_taguri(IRubyObject self) { + return self.getRuntime().newString("tag:yaml.org,2002:bool"); + } + } + + @JRubyClass(name="NilClass") + public static class YAMLNilMethods { + @JRubyMethod(name = "to_yaml_node", required = 1) + public static IRubyObject nil_to_yaml_node(IRubyObject self, IRubyObject arg) { + ThreadContext context = self.getRuntime().getCurrentContext(); + return RuntimeHelpers.invoke(context, arg,"scalar", self.callMethod(context, "taguri"), self.getRuntime().newString(""), self.callMethod(context, "to_yaml_style")); + } + } +}// RubyYAML +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2006 Ola Bini <ola@ologix.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import java.io.InputStream; +import java.io.IOException; + +import java.util.List; +import java.util.ArrayList; + +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import org.jruby.anno.FrameField; +import org.jruby.anno.JRubyMethod; +import org.jruby.anno.JRubyClass; +import org.jruby.anno.JRubyModule; + +import org.jruby.exceptions.RaiseException; +import org.jruby.javasupport.util.RuntimeHelpers; +import org.jruby.runtime.Arity; + +import org.jruby.runtime.Block; +import org.jruby.runtime.ObjectAllocator; +import org.jruby.runtime.ThreadContext; +import org.jruby.runtime.Visibility; +import org.jruby.runtime.builtin.IRubyObject; + +import org.jruby.util.IOInputStream; +import org.jruby.util.IOOutputStream; +import org.jruby.util.CRC32Ext; +import org.jruby.util.Adler32Ext; +import org.jruby.util.ZlibInflate; +import org.jruby.util.ZlibDeflate; + +import org.jruby.util.ByteList; + +@JRubyModule(name="Zlib") +public class RubyZlib { + /** Create the Zlib module and add it to the Ruby runtime. + * + */ + public static RubyModule createZlibModule(Ruby runtime) { + RubyModule result = runtime.defineModule("Zlib"); + + RubyClass gzfile = result.defineClassUnder("GzipFile", runtime.getObject(), RubyGzipFile.GZIPFILE_ALLOCATOR); + gzfile.defineAnnotatedMethods(RubyGzipFile.class); + + RubyClass gzreader = result.defineClassUnder("GzipReader", gzfile, RubyGzipReader.GZIPREADER_ALLOCATOR); + gzreader.includeModule(runtime.getEnumerable()); + gzreader.defineAnnotatedMethods(RubyGzipReader.class); + + RubyClass standardError = runtime.getStandardError(); + RubyClass zlibError = result.defineClassUnder("Error", standardError, standardError.getAllocator()); + gzreader.defineClassUnder("Error", zlibError, zlibError.getAllocator()); + + RubyClass gzwriter = result.defineClassUnder("GzipWriter", gzfile, RubyGzipWriter.GZIPWRITER_ALLOCATOR); + gzwriter.defineAnnotatedMethods(RubyGzipWriter.class); + + result.defineConstant("ZLIB_VERSION",runtime.newString("1.2.1")); + result.defineConstant("VERSION",runtime.newString("0.6.0")); + + result.defineConstant("BINARY",runtime.newFixnum(0)); + result.defineConstant("ASCII",runtime.newFixnum(1)); + result.defineConstant("UNKNOWN",runtime.newFixnum(2)); + + result.defineConstant("DEF_MEM_LEVEL",runtime.newFixnum(8)); + result.defineConstant("MAX_MEM_LEVEL",runtime.newFixnum(9)); + + result.defineConstant("OS_UNIX",runtime.newFixnum(3)); + result.defineConstant("OS_UNKNOWN",runtime.newFixnum(255)); + result.defineConstant("OS_CODE",runtime.newFixnum(11)); + result.defineConstant("OS_ZSYSTEM",runtime.newFixnum(8)); + result.defineConstant("OS_VMCMS",runtime.newFixnum(4)); + result.defineConstant("OS_VMS",runtime.newFixnum(2)); + result.defineConstant("OS_RISCOS",runtime.newFixnum(13)); + result.defineConstant("OS_MACOS",runtime.newFixnum(7)); + result.defineConstant("OS_OS2",runtime.newFixnum(6)); + result.defineConstant("OS_AMIGA",runtime.newFixnum(1)); + result.defineConstant("OS_QDOS",runtime.newFixnum(12)); + result.defineConstant("OS_WIN32",runtime.newFixnum(11)); + result.defineConstant("OS_ATARI",runtime.newFixnum(5)); + result.defineConstant("OS_MSDOS",runtime.newFixnum(0)); + result.defineConstant("OS_CPM",runtime.newFixnum(9)); + result.defineConstant("OS_TOPS20",runtime.newFixnum(10)); + + result.defineConstant("DEFAULT_STRATEGY",runtime.newFixnum(0)); + result.defineConstant("FILTERED",runtime.newFixnum(1)); + result.defineConstant("HUFFMAN_ONLY",runtime.newFixnum(2)); + + result.defineConstant("NO_FLUSH",runtime.newFixnum(0)); + result.defineConstant("SYNC_FLUSH",runtime.newFixnum(2)); + result.defineConstant("FULL_FLUSH",runtime.newFixnum(3)); + result.defineConstant("FINISH",runtime.newFixnum(4)); + + result.defineConstant("NO_COMPRESSION",runtime.newFixnum(0)); + result.defineConstant("BEST_SPEED",runtime.newFixnum(1)); + result.defineConstant("DEFAULT_COMPRESSION",runtime.newFixnum(-1)); + result.defineConstant("BEST_COMPRESSION",runtime.newFixnum(9)); + + result.defineConstant("MAX_WBITS",runtime.newFixnum(15)); + + result.defineAnnotatedMethods(RubyZlib.class); + + result.defineClassUnder("StreamEnd",zlibError, zlibError.getAllocator()); + result.defineClassUnder("StreamError",zlibError, zlibError.getAllocator()); + result.defineClassUnder("BufError",zlibError, zlibError.getAllocator()); + result.defineClassUnder("NeedDict",zlibError, zlibError.getAllocator()); + result.defineClassUnder("MemError",zlibError, zlibError.getAllocator()); + result.defineClassUnder("VersionError",zlibError, zlibError.getAllocator()); + result.defineClassUnder("DataError",zlibError, zlibError.getAllocator()); + + RubyClass gzError = gzfile.defineClassUnder("Error",zlibError, zlibError.getAllocator()); + gzfile.defineClassUnder("CRCError",gzError, gzError.getAllocator()); + gzfile.defineClassUnder("NoFooter",gzError, gzError.getAllocator()); + gzfile.defineClassUnder("LengthError",gzError, gzError.getAllocator()); + + // ZStream actually *isn't* allocatable + RubyClass zstream = result.defineClassUnder("ZStream", runtime.getObject(), ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR); + zstream.defineAnnotatedMethods(ZStream.class); + zstream.undefineMethod("new"); + + RubyClass infl = result.defineClassUnder("Inflate", zstream, Inflate.INFLATE_ALLOCATOR); + infl.defineAnnotatedMethods(Inflate.class); + + RubyClass defl = result.defineClassUnder("Deflate", zstream, Deflate.DEFLATE_ALLOCATOR); + defl.defineAnnotatedMethods(Deflate.class); + + runtime.getKernel().callMethod(runtime.getCurrentContext(),"require",runtime.newString("stringio")); + + return result; + } + + @JRubyClass(name="Zlib::Error", parent="StandardError") + public static class Error {} + @JRubyClass(name="Zlib::StreamEnd", parent="Zlib::Error") + public static class StreamEnd extends Error {} + @JRubyClass(name="Zlib::StreamError", parent="Zlib::Error") + public static class StreamError extends Error {} + @JRubyClass(name="Zlib::BufError", parent="Zlib::Error") + public static class BufError extends Error {} + @JRubyClass(name="Zlib::NeedDict", parent="Zlib::Error") + public static class NeedDict extends Error {} + @JRubyClass(name="Zlib::MemError", parent="Zlib::Error") + public static class MemError extends Error {} + @JRubyClass(name="Zlib::VersionError", parent="Zlib::Error") + public static class VersionError extends Error {} + @JRubyClass(name="Zlib::DataError", parent="Zlib::Error") + public static class DataError extends Error {} + + @JRubyMethod(name = "zlib_version", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject zlib_version(IRubyObject recv) { + return ((RubyModule)recv).fastGetConstant("ZLIB_VERSION"); + } + + @JRubyMethod(name = "version", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject version(IRubyObject recv) { + return ((RubyModule)recv).fastGetConstant("VERSION"); + } + + @JRubyMethod(name = "crc32", optional = 2, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject crc32(IRubyObject recv, IRubyObject[] args) throws Exception { + args = Arity.scanArgs(recv.getRuntime(),args,0,2); + long crc = 0; + ByteList bytes = null; + + if (!args[0].isNil()) bytes = args[0].convertToString().getByteList(); + if (!args[1].isNil()) crc = RubyNumeric.num2long(args[1]); + + CRC32Ext ext = new CRC32Ext((int)crc); + if (bytes != null) { + ext.update(bytes.unsafeBytes(), bytes.begin(), bytes.length()); + } + + return recv.getRuntime().newFixnum(ext.getValue()); + } + + @JRubyMethod(name = "adler32", optional = 2, module = true, visibility = Visibility.PRIVATE) + public static IRubyObject adler32(IRubyObject recv, IRubyObject[] args) throws Exception { + args = Arity.scanArgs(recv.getRuntime(),args,0,2); + int adler = 1; + ByteList bytes = null; + if (!args[0].isNil()) bytes = args[0].convertToString().getByteList(); + if (!args[1].isNil()) adler = RubyNumeric.fix2int(args[1]); + + Adler32Ext ext = new Adler32Ext(adler); + if (bytes != null) { + ext.update(bytes.unsafeBytes(), bytes.begin(), bytes.length()); // it's safe since adler.update doesn't modify the array + } + return recv.getRuntime().newFixnum(ext.getValue()); + } + + private final static long[] crctab = new long[]{ + 0L, 1996959894L, 3993919788L, 2567524794L, 124634137L, 1886057615L, 3915621685L, 2657392035L, 249268274L, 2044508324L, 3772115230L, 2547177864L, 162941995L, + 2125561021L, 3887607047L, 2428444049L, 498536548L, 1789927666L, 4089016648L, 2227061214L, 450548861L, 1843258603L, 4107580753L, 2211677639L, 325883990L, + 1684777152L, 4251122042L, 2321926636L, 335633487L, 1661365465L, 4195302755L, 2366115317L, 997073096L, 1281953886L, 3579855332L, 2724688242L, 1006888145L, + 1258607687L, 3524101629L, 2768942443L, 901097722L, 1119000684L, 3686517206L, 2898065728L, 853044451L, 1172266101L, 3705015759L, 2882616665L, 651767980L, + 1373503546L, 3369554304L, 3218104598L, 565507253L, 1454621731L, 3485111705L, 3099436303L, 671266974L, 1594198024L, 3322730930L, 2970347812L, 795835527L, + 1483230225L, 3244367275L, 3060149565L, 1994146192L, 31158534L, 2563907772L, 4023717930L, 1907459465L, 112637215L, 2680153253L, 3904427059L, 2013776290L, + 251722036L, 2517215374L, 3775830040L, 2137656763L, 141376813L, 2439277719L, 3865271297L, 1802195444L, 476864866L, 2238001368L, 4066508878L, 1812370925L, + 453092731L, 2181625025L, 4111451223L, 1706088902L, 314042704L, 2344532202L, 4240017532L, 1658658271L, 366619977L, 2362670323L, 4224994405L, 1303535960L, + 984961486L, 2747007092L, 3569037538L, 1256170817L, 1037604311L, 2765210733L, 3554079995L, 1131014506L, 879679996L, 2909243462L, 3663771856L, 1141124467L, + 855842277L, 2852801631L, 3708648649L, 1342533948L, 654459306L, 3188396048L, 3373015174L, 1466479909L, 544179635L, 3110523913L, 3462522015L, 1591671054L, + 702138776L, 2966460450L, 3352799412L, 1504918807L, 783551873L, 3082640443L, 3233442989L, 3988292384L, 2596254646L, 62317068L, 1957810842L, 3939845945L, + 2647816111L, 81470997L, 1943803523L, 3814918930L, 2489596804L, 225274430L, 2053790376L, 3826175755L, 2466906013L, 167816743L, 2097651377L, 4027552580L, + 2265490386L, 503444072L, 1762050814L, 4150417245L, 2154129355L, 426522225L, 1852507879L, 4275313526L, 2312317920L, 282753626L, 1742555852L, 4189708143L, + 2394877945L, 397917763L, 1622183637L, 3604390888L, 2714866558L, 953729732L, 1340076626L, 3518719985L, 2797360999L, 1068828381L, 1219638859L, 3624741850L, + 2936675148L, 906185462L, 1090812512L, 3747672003L, 2825379669L, 829329135L, 1181335161L, 3412177804L, 3160834842L, 628085408L, 1382605366L, 3423369109L, + 3138078467L, 570562233L, 1426400815L, 3317316542L, 2998733608L, 733239954L, 1555261956L, 3268935591L, 3050360625L, 752459403L, 1541320221L, 2607071920L, + 3965973030L, 1969922972L, 40735498L, 2617837225L, 3943577151L, 1913087877L, 83908371L, 2512341634L, 3803740692L, 2075208622L, 213261112L, 2463272603L, + 3855990285L, 2094854071L, 198958881L, 2262029012L, 4057260610L, 1759359992L, 534414190L, 2176718541L, 4139329115L, 1873836001L, 414664567L, 2282248934L, + 4279200368L, 1711684554L, 285281116L, 2405801727L, 4167216745L, 1634467795L, 376229701L, 2685067896L, 3608007406L, 1308918612L, 956543938L, 2808555105L, + 3495958263L, 1231636301L, 1047427035L, 2932959818L, 3654703836L, 1088359270L, 936918000L, 2847714899L, 3736837829L, 1202900863L, 817233897L, 3183342108L, + 3401237130L, 1404277552L, 615818150L, 3134207493L, 3453421203L, 1423857449L, 601450431L, 3009837614L, 3294710456L, 1567103746L, 711928724L, 3020668471L, + 3272380065L, 1510334235L, 755167117}; + + @JRubyMethod(name = "crc_table", module = true, visibility = Visibility.PRIVATE) + public static IRubyObject crc_table(IRubyObject recv) { + List<IRubyObject> ll = new ArrayList<IRubyObject>(crctab.length); + for(int i=0;i<crctab.length;i++) { + ll.add(recv.getRuntime().newFixnum(crctab[i])); + } + return recv.getRuntime().newArray(ll); + } + + + @JRubyClass(name="Zlib::ZStream") + public static abstract class ZStream extends RubyObject { + protected boolean closed = false; + protected boolean ended = false; + protected boolean finished = false; + + protected abstract int internalTotalOut(); + protected abstract boolean internalStreamEndP(); + protected abstract void internalEnd(); + protected abstract void internalReset(); + protected abstract int internalAdler(); + protected abstract IRubyObject internalFinish() throws Exception; + protected abstract int internalTotalIn(); + protected abstract void internalClose(); + + public ZStream(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + @JRubyMethod(name = "initialize", frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(Block unusedBlock) { + return this; + } + + @JRubyMethod(name = "flust_next_out") + public IRubyObject flush_next_out() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "total_out") + public IRubyObject total_out() { + return getRuntime().newFixnum(internalTotalOut()); + } + + @JRubyMethod(name = "stream_end?") + public IRubyObject stream_end_p() { + return internalStreamEndP() ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "data_type") + public IRubyObject data_type() { + return getRuntime().fastGetModule("Zlib").fastGetConstant("UNKNOWN"); + } + + @JRubyMethod(name = "closed?") + public IRubyObject closed_p() { + return closed ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "ended?") + public IRubyObject ended_p() { + return ended ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "end") + public IRubyObject end() { + if(!ended) { + internalEnd(); + ended = true; + } + return getRuntime().getNil(); + } + + @JRubyMethod(name = "reset") + public IRubyObject reset() { + internalReset(); + return getRuntime().getNil(); + } + + @JRubyMethod(name = "avail_out") + public IRubyObject avail_out() { + return RubyFixnum.zero(getRuntime()); + } + + @JRubyMethod(name = "avail_out=", required = 1) + public IRubyObject set_avail_out(IRubyObject p1) { + return p1; + } + + @JRubyMethod(name = "adler") + public IRubyObject adler() { + return getRuntime().newFixnum(internalAdler()); + } + + @JRubyMethod(name = "finish") + public IRubyObject finish() throws Exception { + if(!finished) { + finished = true; + return internalFinish(); + } + return RubyString.newEmptyString(getRuntime()); + } + + @JRubyMethod(name = "avail_in") + public IRubyObject avail_in() { + return RubyFixnum.zero(getRuntime()); + } + + @JRubyMethod(name = "flush_next_in") + public IRubyObject flush_next_in() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "total_in") + public IRubyObject total_in() { + return getRuntime().newFixnum(internalTotalIn()); + } + + @JRubyMethod(name = "finished?") + public IRubyObject finished_p() { + return finished ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "close") + public IRubyObject close() { + if(!closed) { + internalClose(); + closed = true; + } + return getRuntime().getNil(); + } + } + + @JRubyClass(name="Zlib::Inflate", parent="Zlib::ZStream") + public static class Inflate extends ZStream { + protected static final ObjectAllocator INFLATE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new Inflate(runtime, klass); + } + }; + + @JRubyMethod(name = "inflate", required = 1, meta = true) + public static IRubyObject s_inflate(IRubyObject recv, IRubyObject string) throws Exception { + return ZlibInflate.s_inflate(recv,string.convertToString().getByteList()); + } + + public Inflate(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + private ZlibInflate infl; + + @JRubyMethod(name = "initialize", rest = true, visibility = Visibility.PRIVATE) + public IRubyObject _initialize(IRubyObject[] args) throws Exception { + infl = new ZlibInflate(this); + return this; + } + + @JRubyMethod(name = "<<", required = 1) + public IRubyObject append(IRubyObject arg) { + infl.append(arg); + return this; + } + + @JRubyMethod(name = "sync_point?") + public IRubyObject sync_point_p() { + return infl.sync_point(); + } + + @JRubyMethod(name = "set_dictionary", required = 1) + public IRubyObject set_dictionary(IRubyObject arg) throws Exception { + return infl.set_dictionary(arg); + } + + @JRubyMethod(name = "inflate", required = 1) + public IRubyObject inflate(IRubyObject string) throws Exception { + return infl.inflate(string.convertToString().getByteList()); + } + + @JRubyMethod(name = "sync", required = 1) + public IRubyObject sync(IRubyObject string) { + return infl.sync(string); + } + + protected int internalTotalOut() { + return infl.getInflater().getTotalOut(); + } + + protected boolean internalStreamEndP() { + return infl.getInflater().finished(); + } + + protected void internalEnd() { + infl.getInflater().end(); + } + + protected void internalReset() { + infl.getInflater().reset(); + } + + protected int internalAdler() { + return infl.getInflater().getAdler(); + } + + protected IRubyObject internalFinish() throws Exception { + infl.finish(); + return getRuntime().getNil(); + } + + public IRubyObject finished_p() { + return infl.getInflater().finished() ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + protected int internalTotalIn() { + return infl.getInflater().getTotalIn(); + } + + protected void internalClose() { + infl.close(); + } + } + + @JRubyClass(name="Zlib::Deflate", parent="Zlib::ZStream") + public static class Deflate extends ZStream { + protected static final ObjectAllocator DEFLATE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new Deflate(runtime, klass); + } + }; + + @JRubyMethod(name = "deflate", required = 1, optional = 1, meta = true) + public static IRubyObject s_deflate(IRubyObject recv, IRubyObject[] args) throws Exception { + args = Arity.scanArgs(recv.getRuntime(),args,1,1); + int level = -1; + if(!args[1].isNil()) { + level = RubyNumeric.fix2int(args[1]); + } + return ZlibDeflate.s_deflate(recv,args[0].convertToString().getByteList(),level); + } + + public Deflate(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + private ZlibDeflate defl; + + @JRubyMethod(name = "initialize", optional = 4, visibility = Visibility.PRIVATE) + public IRubyObject _initialize(IRubyObject[] args) throws Exception { + args = Arity.scanArgs(getRuntime(),args,0,4); + int level = -1; + int window_bits = 15; + int memlevel = 8; + int strategy = 0; + if(!args[0].isNil()) { + level = RubyNumeric.fix2int(args[0]); + } + if(!args[1].isNil()) { + window_bits = RubyNumeric.fix2int(args[1]); + } + if(!args[2].isNil()) { + memlevel = RubyNumeric.fix2int(args[2]); + } + if(!args[3].isNil()) { + strategy = RubyNumeric.fix2int(args[3]); + } + defl = new ZlibDeflate(this,level,window_bits,memlevel,strategy); + return this; + } + + @JRubyMethod(name = "<<", required = 1) + public IRubyObject append(IRubyObject arg) throws Exception { + defl.append(arg); + return this; + } + + @JRubyMethod(name = "params", required = 2) + public IRubyObject params(IRubyObject level, IRubyObject strategy) { + defl.params(RubyNumeric.fix2int(level),RubyNumeric.fix2int(strategy)); + return getRuntime().getNil(); + } + + @JRubyMethod(name = "set_dictionary", required = 1) + public IRubyObject set_dictionary(IRubyObject arg) throws Exception { + return defl.set_dictionary(arg); + } + + @JRubyMethod(name = "flush", optional = 1) + public IRubyObject flush(IRubyObject[] args) throws Exception { + int flush = 2; // SYNC_FLUSH + if(args.length == 1) { + if(!args[0].isNil()) { + flush = RubyNumeric.fix2int(args[0]); + } + } + return defl.flush(flush); + } + + @JRubyMethod(name = "deflate", required = 1, optional = 1) + public IRubyObject deflate(IRubyObject[] args) throws Exception { + args = Arity.scanArgs(getRuntime(),args,1,1); + int flush = 0; // NO_FLUSH + if(!args[1].isNil()) { + flush = RubyNumeric.fix2int(args[1]); + } + return defl.deflate(args[0].convertToString().getByteList(),flush); + } + + protected int internalTotalOut() { + return defl.getDeflater().getTotalOut(); + } + + protected boolean internalStreamEndP() { + return defl.getDeflater().finished(); + } + + protected void internalEnd() { + defl.getDeflater().end(); + } + + protected void internalReset() { + defl.getDeflater().reset(); + } + + protected int internalAdler() { + return defl.getDeflater().getAdler(); + } + + protected IRubyObject internalFinish() throws Exception { + return defl.finish(); + } + + protected int internalTotalIn() { + return defl.getDeflater().getTotalIn(); + } + + protected void internalClose() { + defl.close(); + } + } + + @JRubyClass(name="Zlib::GzipFile") + public static class RubyGzipFile extends RubyObject { + @JRubyClass(name="Zlib::GzipFile::Error", parent="Zlib::Error") + public static class Error {} + @JRubyClass(name="Zlib::GzipFile::CRCError", parent="Zlib::GzipFile::Error") + public static class CRCError extends Error {} + @JRubyClass(name="Zlib::GzipFile::NoFooter", parent="Zlib::GzipFile::Error") + public static class NoFooter extends Error {} + @JRubyClass(name="Zlib::GzipFile::LengthError", parent="Zlib::GzipFile::Error") + public static class LengthError extends Error {} + + private static IRubyObject wrap(ThreadContext context, RubyGzipFile instance, + IRubyObject io, Block block) throws IOException { + if (block.isGiven()) { + try { + block.yield(context, instance); + + return instance.getRuntime().getNil(); + } finally { + if (!instance.isClosed()) instance.close(); + } + } + + return io; + } + + @JRubyMethod(name = "wrap", required = 1, frame = true, meta = true) + public static IRubyObject wrap(ThreadContext context, IRubyObject recv, IRubyObject io, Block block) throws IOException { + Ruby runtime = recv.getRuntime(); + RubyGzipFile instance; + + // TODO: People extending GzipWriter/reader will break. Find better way here. + if (recv == runtime.getModule("Zlib").getClass("GzipWriter")) { + instance = RubyGzipWriter.newGzipWriter(recv, new IRubyObject[] { io }, block); + } else { + instance = RubyGzipReader.newInstance(recv, new IRubyObject[] { io }, block); + } + + return wrap(context, instance, io, block); + } + + protected static final ObjectAllocator GZIPFILE_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyGzipFile(runtime, klass); + } + }; + + @JRubyMethod(name = "new", frame = true, meta = true) + public static RubyGzipFile newInstance(IRubyObject recv, Block block) { + RubyClass klass = (RubyClass)recv; + + RubyGzipFile result = (RubyGzipFile) klass.allocate(); + + result.callInit(new IRubyObject[0], block); + + return result; + } + + protected boolean closed = false; + protected boolean finished = false; + private int os_code = 255; + private int level = -1; + private String orig_name; + private String comment; + protected IRubyObject realIo; + private IRubyObject mtime; + + public RubyGzipFile(Ruby runtime, RubyClass type) { + super(runtime, type); + mtime = runtime.getNil(); + } + + @JRubyMethod(name = "os_code") + public IRubyObject os_code() { + return getRuntime().newFixnum(os_code); + } + + @JRubyMethod(name = "closed?") + public IRubyObject closed_p() { + return closed ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + protected boolean isClosed() { + return closed; + } + + @JRubyMethod(name = "orig_name") + public IRubyObject orig_name() { + return orig_name == null ? getRuntime().getNil() : getRuntime().newString(orig_name); + } + + @JRubyMethod(name = "to_io") + public IRubyObject to_io() { + return realIo; + } + + @JRubyMethod(name = "comment") + public IRubyObject comment() { + return comment == null ? getRuntime().getNil() : getRuntime().newString(comment); + } + + @JRubyMethod(name = "crc") + public IRubyObject crc() { + return RubyFixnum.zero(getRuntime()); + } + + @JRubyMethod(name = "mtime") + public IRubyObject mtime() { + return mtime; + } + + @JRubyMethod(name = "sync") + public IRubyObject sync() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "finish") + public IRubyObject finish() throws IOException { + if (!finished) { + //io.finish(); + } + finished = true; + return realIo; + } + + @JRubyMethod(name = "close") + public IRubyObject close() throws IOException { + return null; + } + + @JRubyMethod(name = "level") + public IRubyObject level() { + return getRuntime().newFixnum(level); + } + + @JRubyMethod(name = "sync=", required = 1) + public IRubyObject set_sync(IRubyObject ignored) { + return getRuntime().getNil(); + } + } + + @JRubyClass(name="Zlib::GzipReader", parent="Zlib::GzipFile", include="Enumerable") + public static class RubyGzipReader extends RubyGzipFile { + @JRubyClass(name="Zlib::GzipReader::Error", parent="Zlib::GzipReader") + public static class Error {} + protected static final ObjectAllocator GZIPREADER_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyGzipReader(runtime, klass); + } + }; + + @JRubyMethod(name = "new", rest = true, frame = true, meta = true) + public static RubyGzipReader newInstance(IRubyObject recv, IRubyObject[] args, Block block) { + RubyClass klass = (RubyClass)recv; + RubyGzipReader result = (RubyGzipReader)klass.allocate(); + result.callInit(args, block); + return result; + } + + @JRubyMethod(name = "open", required = 1, frame = true, meta = true) + public static IRubyObject open(final ThreadContext context, IRubyObject recv, IRubyObject filename, Block block) throws IOException { + Ruby runtime = recv.getRuntime(); + IRubyObject io = RuntimeHelpers.invoke(context, runtime.getFile(), "open", filename, runtime.newString("rb")); + RubyGzipFile instance = newInstance(recv, new IRubyObject[]{io}, Block.NULL_BLOCK); + + return RubyGzipFile.wrap(context, instance, io, block); + } + + public RubyGzipReader(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + private int line; + private InputStream io; + + @JRubyMethod(name = "initialize", required = 1, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize(IRubyObject io, Block unusedBlock) { + realIo = io; + try { + this.io = new GZIPInputStream(new IOInputStream(io)); + } catch (IOException e) { + Ruby runtime = io.getRuntime(); + RubyClass errorClass = runtime.fastGetModule("Zlib").fastGetClass("GzipReader").fastGetClass("Error"); + throw new RaiseException(RubyException.newException(runtime, errorClass, e.getMessage())); + } + + line = 1; + + return this; + } + + @JRubyMethod(name = "rewind") + public IRubyObject rewind() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "lineno") + public IRubyObject lineno() { + return getRuntime().newFixnum(line); + } + + @JRubyMethod(name = "readline", writes = FrameField.LASTLINE) + public IRubyObject readline(ThreadContext context) throws IOException { + IRubyObject dst = gets(context, new IRubyObject[0]); + if (dst.isNil()) { + throw getRuntime().newEOFError(); + } + return dst; + } + + public IRubyObject internalGets(IRubyObject[] args) throws IOException { + ByteList sep = ((RubyString)getRuntime().getGlobalVariables().get("$/")).getByteList(); + if (args.length > 0) { + sep = args[0].convertToString().getByteList(); + } + return internalSepGets(sep); + } + + private IRubyObject internalSepGets(ByteList sep) throws IOException { + ByteList result = new ByteList(); + int ce = io.read(); + while (ce != -1 && sep.indexOf(ce) == -1) { + result.append((byte)ce); + ce = io.read(); + } + line++; + result.append(sep); + return RubyString.newString(getRuntime(),result); + } + + @JRubyMethod(name = "gets", optional = 1, writes = FrameField.LASTLINE) + public IRubyObject gets(ThreadContext context, IRubyObject[] args) throws IOException { + IRubyObject result = internalGets(args); + if (!result.isNil()) { + context.getCurrentFrame().setLastLine(result); + } + return result; + } + + private final static int BUFF_SIZE = 4096; + + @JRubyMethod(name = "read", optional = 1) + public IRubyObject read(IRubyObject[] args) throws IOException { + if (args.length == 0 || args[0].isNil()) { + ByteList val = new ByteList(10); + byte[] buffer = new byte[BUFF_SIZE]; + int read = io.read(buffer); + while (read != -1) { + val.append(buffer,0,read); + read = io.read(buffer); + } + return RubyString.newString(getRuntime(),val); + } + + int len = RubyNumeric.fix2int(args[0]); + if (len < 0) { + throw getRuntime().newArgumentError("negative length " + len + " given"); + } else if (len > 0) { + byte[] buffer = new byte[len]; + int toRead = len; + int offset = 0; + int read = 0; + while (toRead > 0) { + read = io.read(buffer,offset,toRead); + if (read == -1) { + break; + } + toRead -= read; + offset += read; + } // hmm... + return RubyString.newString(getRuntime(),new ByteList(buffer,0,len-toRead,false)); + } + + return RubyString.newEmptyString(getRuntime()); + } + + @JRubyMethod(name = "lineno=", required = 1) + public IRubyObject set_lineno(IRubyObject lineArg) { + line = RubyNumeric.fix2int(lineArg); + return lineArg; + } + + @JRubyMethod(name = "pos") + public IRubyObject pos() { + return RubyFixnum.zero(getRuntime()); + } + + @JRubyMethod(name = "readchar") + public IRubyObject readchar() throws IOException { + int value = io.read(); + if (value == -1) { + throw getRuntime().newEOFError(); + } + return getRuntime().newFixnum(value); + } + + @JRubyMethod(name = "getc") + public IRubyObject getc() throws IOException { + int value = io.read(); + return value == -1 ? getRuntime().getNil() : getRuntime().newFixnum(value); + } + + private boolean isEof() throws IOException { + return ((GZIPInputStream)io).available() != 1; + } + + @JRubyMethod(name = "close") + public IRubyObject close() throws IOException { + if (!closed) { + io.close(); + } + this.closed = true; + return getRuntime().getNil(); + } + + @JRubyMethod(name = "eof") + public IRubyObject eof() throws IOException { + return isEof() ? getRuntime().getTrue() : getRuntime().getFalse(); + } + + @JRubyMethod(name = "eof?") + public IRubyObject eof_p() throws IOException { + return eof(); + } + + @JRubyMethod(name = "unused") + public IRubyObject unused() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "tell") + public IRubyObject tell() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "each", optional = 1, frame = true) + public IRubyObject each(ThreadContext context, IRubyObject[] args, Block block) throws IOException { + ByteList sep = ((RubyString)getRuntime().getGlobalVariables().get("$/")).getByteList(); + + if (args.length > 0 && !args[0].isNil()) { + sep = args[0].convertToString().getByteList(); + } + + while (!isEof()) { + block.yield(context, internalSepGets(sep)); + } + + return getRuntime().getNil(); + } + + @JRubyMethod(name = "ungetc", required = 1) + public IRubyObject ungetc(IRubyObject arg) { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "readlines", optional = 1) + public IRubyObject readlines(IRubyObject[] args) throws IOException { + List<IRubyObject> array = new ArrayList<IRubyObject>(); + + if (args.length != 0 && args[0].isNil()) { + array.add(read(new IRubyObject[0])); + } else { + ByteList seperator = ((RubyString)getRuntime().getGlobalVariables().get("$/")).getByteList(); + if (args.length > 0) { + seperator = args[0].convertToString().getByteList(); + } + while (!isEof()) { + array.add(internalSepGets(seperator)); + } + } + return getRuntime().newArray(array); + } + + @JRubyMethod(name = "each_byte", frame = true) + public IRubyObject each_byte(ThreadContext context, Block block) throws IOException { + int value = io.read(); + + while (value != -1) { + block.yield(context, getRuntime().newFixnum(value)); + value = io.read(); + } + + return getRuntime().getNil(); + } + } + + @JRubyClass(name="Zlib::GzipWriter", parent="Zlib::GzipFile") + public static class RubyGzipWriter extends RubyGzipFile { + protected static final ObjectAllocator GZIPWRITER_ALLOCATOR = new ObjectAllocator() { + public IRubyObject allocate(Ruby runtime, RubyClass klass) { + return new RubyGzipWriter(runtime, klass); + } + }; + + @JRubyMethod(name = "new", rest = true, frame = true, meta = true) + public static RubyGzipWriter newGzipWriter(IRubyObject recv, IRubyObject[] args, Block block) { + RubyClass klass = (RubyClass)recv; + + RubyGzipWriter result = (RubyGzipWriter)klass.allocate(); + result.callInit(args, block); + return result; + } + + @JRubyMethod(name = "open", required = 1, optional = 2, frame = true, meta = true) + public static IRubyObject open(final ThreadContext context, IRubyObject recv, IRubyObject[] args, Block block) throws IOException { + Ruby runtime = recv.getRuntime(); + IRubyObject level = runtime.getNil(); + IRubyObject strategy = runtime.getNil(); + + if (args.length > 1) { + level = args[1]; + if (args.length > 2) strategy = args[2]; + } + + IRubyObject io = RuntimeHelpers.invoke(context, runtime.getFile(), "open", args[0], runtime.newString("wb")); + RubyGzipFile instance = newGzipWriter(recv, new IRubyObject[]{io, level, strategy}, Block.NULL_BLOCK); + + return RubyGzipFile.wrap(context, instance, io, block); + } + + public RubyGzipWriter(Ruby runtime, RubyClass type) { + super(runtime, type); + } + + private GZIPOutputStream io; + + @JRubyMethod(name = "initialize", required = 1, rest = true, frame = true, visibility = Visibility.PRIVATE) + public IRubyObject initialize2(IRubyObject[] args, Block unusedBlock) throws IOException { + realIo = (RubyObject)args[0]; + this.io = new GZIPOutputStream(new IOOutputStream(args[0])); + + return this; + } + + @JRubyMethod(name = "close") + public IRubyObject close() throws IOException { + if (!closed) { + io.close(); + } + this.closed = true; + + return getRuntime().getNil(); + } + + @JRubyMethod(name = "append", required = 1) + public IRubyObject append(IRubyObject p1) throws IOException { + this.write(p1); + return this; + } + + @JRubyMethod(name = "printf", required = 1, rest = true) + public IRubyObject printf(ThreadContext context, IRubyObject[] args) throws IOException { + write(RubyKernel.sprintf(context, this, args)); + return context.getRuntime().getNil(); + } + + @JRubyMethod(name = "print", rest = true) + public IRubyObject print(IRubyObject[] args) throws IOException { + if (args.length != 0) { + for (int i = 0, j = args.length; i < j; i++) { + write(args[i]); + } + } + + IRubyObject sep = getRuntime().getGlobalVariables().get("$\\"); + if (!sep.isNil()) { + write(sep); + } + + return getRuntime().getNil(); + } + + @JRubyMethod(name = "pos") + public IRubyObject pos() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "orig_name=", required = 1) + public IRubyObject set_orig_name(IRubyObject ignored) { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "comment=", required = 1) + public IRubyObject set_comment(IRubyObject ignored) { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "putc", required = 1) + public IRubyObject putc(IRubyObject p1) throws IOException { + io.write(RubyNumeric.fix2int(p1)); + return p1; + } + + @JRubyMethod(name = "puts", rest = true) + public IRubyObject puts(ThreadContext context, IRubyObject[] args) throws IOException { + RubyStringIO sio = (RubyStringIO)getRuntime().fastGetClass("StringIO").newInstance(context, new IRubyObject[0], Block.NULL_BLOCK); + sio.puts(context, args); + write(sio.string()); + + return getRuntime().getNil(); + } + + public IRubyObject finish() throws IOException { + if (!finished) { + io.finish(); + } + finished = true; + return realIo; + } + + @JRubyMethod(name = "flush", optional = 1) + public IRubyObject flush(IRubyObject[] args) throws IOException { + if (args.length == 0 || args[0].isNil() || RubyNumeric.fix2int(args[0]) != 0) { // Zlib::NO_FLUSH + io.flush(); + } + return getRuntime().getNil(); + } + + @JRubyMethod(name = "mtime=", required = 1) + public IRubyObject set_mtime(IRubyObject ignored) { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "tell") + public IRubyObject tell() { + return getRuntime().getNil(); + } + + @JRubyMethod(name = "write", required = 1) + public IRubyObject write(IRubyObject p1) throws IOException { + ByteList bytes = p1.convertToString().getByteList(); + io.write(bytes.unsafeBytes(), bytes.begin(), bytes.length()); + return getRuntime().newFixnum(bytes.length()); + } + } +} +/***** BEGIN LICENSE BLOCK ***** + * Version: CPL 1.0/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Common Public + * License Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.eclipse.org/legal/cpl-v10.html + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * Copyright (C) 2002 Jan Arne Petersen <jpetersen@uni-bonn.de> + * Copyright (C) 2002-2004 Anders Bengtsson <ndrsbngtssn@yahoo.se> + * Copyright (C) 2004 Thomas E Enebo <enebo@acm.org> + * Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the CPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the CPL, the GPL or the LGPL. + ***** END LICENSE BLOCK *****/ +package org.jruby; + +import org.jruby.runtime.Arity; +import org.jruby.runtime.Block; +import org.jruby.runtime.builtin.IRubyObject; +import org.jruby.runtime.callback.Callback; + +/** + * + * @author jpetersen + */ +public final class TopSelfFactory { + + /** + * Constructor for TopSelfFactory. + */ + private TopSelfFactory() { + super(); + } + + public static IRubyObject createTopSelf(final Ruby runtime) { + IRubyObject topSelf = new RubyObject(runtime, runtime.getObject()); + + topSelf.getSingletonClass().defineFastMethod("to_s", new Callback() { + /** + * @see org.jruby.runtime.callback.Callback#execute(IRubyObject, IRubyObject[]) + */ + public IRubyObject execute(IRubyObject recv, IRubyObject[] args, Block block) { + return runtime.newString("main"); + } + + /** + * @see org.jruby.runtime.callback.Callback#getArity() + */ + public Arity getArity() { + return Arity.noArguments(); + } + }); + + // The following three methods must be defined fast, since they expect to modify the current frame + // (i.e. they expect no frame will be allocated for them). JRUBY-1185. + topSelf.getSingletonClass().defineFastPrivateMethod("include", new Callback() { + /** + * @see org.jruby.runtime.callback.Callback#execute(IRubyObject, IRubyObject[]) + */ + public IRubyObject execute(IRubyObject recv, IRubyObject[] args, Block block) { + runtime.secure(4); + return runtime.getObject().include(args); + } + + /** + * @see org.jruby.runtime.callback.Callback#getArity() + */ + public Arity getArity() { + return Arity.optional(); + } + }); + + topSelf.getSingletonClass().defineFastPrivateMethod("public", new Callback() { + /** + * @see org.jruby.runtime.callback.Callback#execute(IRubyObject, IRubyObject[]) + */ + public IRubyObject execute(IRubyObject recv, IRubyObject[] args, Block unusedBlock) { + return runtime.getObject().rbPublic(recv.getRuntime().getCurrentContext(), args); + } + + /** + * @see org.jruby.runtime.callback.Callback#getArity() + */ + public Arity getArity() { + return Arity.optional(); + } + }); + + topSelf.getSingletonClass().defineFastPrivateMethod("private", new Callback() { + /** + * @see org.jruby.runtime.callback.Callback#execute(IRubyObject, IRubyObject[]) + */ + public IRubyObject execute(IRubyObject recv, IRubyObject[] args, Block unusedBlock) { + return runtime.getObject().rbPrivate(recv.getRuntime().getCurrentContext(), args); + } + + /** + * @see org.jruby.runtime.callback.Callback#getArity() + */ + public Arity getArity() { + return Arity.optional(); + } + }); + + return topSelf; + } +} diff --git a/test/scanners/java/suite.rb b/test/scanners/java/suite.rb new file mode 100644 index 0000000..ffbc815 --- /dev/null +++ b/test/scanners/java/suite.rb @@ -0,0 +1,2 @@ +class Java < CodeRay::TestCase +end diff --git a/test/scanners/javascript/script.aculo.us.expected.raydebug b/test/scanners/javascript/script.aculo.us.expected.raydebug index e30fa6f..2908a45 100644 --- a/test/scanners/javascript/script.aculo.us.expected.raydebug +++ b/test/scanners/javascript/script.aculo.us.expected.raydebug @@ -59,7 +59,7 @@ ident(Autocompleter)operator(.)ident(Base) operator(=) ident(Class)operator(.)id local_variable(this)operator(.)ident(options)operator(.)ident(paramName) operator(=) local_variable(this)operator(.)ident(options)operator(.)ident(paramName) operator(||) local_variable(this)operator(.)ident(element)operator(.)ident(name)operator(;) local_variable(this)operator(.)ident(options)operator(.)ident(tokens) operator(=) local_variable(this)operator(.)ident(options)operator(.)ident(tokens) operator(||) operator([)operator(])operator(;) - local_variable(this)operator(.)ident(options)operator(.)ident(frequency) operator(=) local_variable(this)operator(.)ident(options)operator(.)ident(frequency) operator(||) float(0)float(.4)operator(;) + local_variable(this)operator(.)ident(options)operator(.)ident(frequency) operator(=) local_variable(this)operator(.)ident(options)operator(.)ident(frequency) operator(||) float(0.4)operator(;) local_variable(this)operator(.)ident(options)operator(.)ident(minChars) operator(=) local_variable(this)operator(.)ident(options)operator(.)ident(minChars) operator(||) integer(1)operator(;) local_variable(this)operator(.)ident(options)operator(.)ident(onShow) operator(=) local_variable(this)operator(.)ident(options)operator(.)ident(onShow) operator(||) keyword(function)operator(()ident(element)operator(,) ident(update)operator(\))operator({) @@ -70,10 +70,10 @@ ident(Autocompleter)operator(.)ident(Base) operator(=) ident(Class)operator(.)id key(offsetTop)operator(:) ident(element)operator(.)ident(offsetHeight) operator(}\))operator(;) operator(}) - ident(Effect)operator(.)ident(Appear)operator(()ident(update)operator(,{)key(duration)operator(:)float(0)float(.15)operator(}\))operator(;) + ident(Effect)operator(.)ident(Appear)operator(()ident(update)operator(,{)key(duration)operator(:)float(0.15)operator(}\))operator(;) operator(})operator(;) local_variable(this)operator(.)ident(options)operator(.)ident(onHide) operator(=) local_variable(this)operator(.)ident(options)operator(.)ident(onHide) operator(||) - keyword(function)operator(()ident(element)operator(,) ident(update)operator(\))operator({) keyword(new) ident(Effect)operator(.)ident(Fade)operator(()ident(update)operator(,{)key(duration)operator(:)float(0)float(.15)operator(}\)) operator(})operator(;) + keyword(function)operator(()ident(element)operator(,) ident(update)operator(\))operator({) keyword(new) ident(Effect)operator(.)ident(Fade)operator(()ident(update)operator(,{)key(duration)operator(:)float(0.15)operator(}\)) operator(})operator(;) keyword(if)operator(()keyword(typeof)operator(()local_variable(this)operator(.)ident(options)operator(.)ident(tokens)operator(\)) operator(==) string<delimiter(')content(string)delimiter(')>operator(\)) local_variable(this)operator(.)ident(options)operator(.)ident(tokens) operator(=) keyword(new) ident(Array)operator(()local_variable(this)operator(.)ident(options)operator(.)ident(tokens)operator(\))operator(;) @@ -212,12 +212,12 @@ ident(Autocompleter)operator(.)ident(Base) operator(=) ident(Class)operator(.)id key(markPrevious)operator(:) keyword(function)operator(()operator(\)) operator({) keyword(if)operator(()local_variable(this)operator(.)ident(index) operator(>) integer(0)operator(\)) local_variable(this)operator(.)ident(index)operator(--) - keyword(else) local_variable(this)operator(.)ident(index) operator(=) local_variable(this)operator(.)ident(entryCount)integer(-1)operator(;) + keyword(else) local_variable(this)operator(.)ident(index) operator(=) local_variable(this)operator(.)ident(entryCount)operator(-)integer(1)operator(;) local_variable(this)operator(.)ident(getEntry)operator(()local_variable(this)operator(.)ident(index)operator(\))operator(.)ident(scrollIntoView)operator(()keyword(true)operator(\))operator(;) operator(})operator(,) key(markNext)operator(:) keyword(function)operator(()operator(\)) operator({) - keyword(if)operator(()local_variable(this)operator(.)ident(index) operator(<) local_variable(this)operator(.)ident(entryCount)integer(-1)operator(\)) local_variable(this)operator(.)ident(index)operator(++) + keyword(if)operator(()local_variable(this)operator(.)ident(index) operator(<) local_variable(this)operator(.)ident(entryCount)operator(-)integer(1)operator(\)) local_variable(this)operator(.)ident(index)operator(++) keyword(else) local_variable(this)operator(.)ident(index) operator(=) integer(0)operator(;) local_variable(this)operator(.)ident(getEntry)operator(()local_variable(this)operator(.)ident(index)operator(\))operator(.)ident(scrollIntoView)operator(()keyword(false)operator(\))operator(;) operator(})operator(,) @@ -248,7 +248,7 @@ ident(Autocompleter)operator(.)ident(Base) operator(=) ident(Class)operator(.)id ident(value) operator(=) ident(Element)operator(.)ident(collectTextNodesIgnoreClass)operator(()ident(selectedElement)operator(,) string<delimiter(')content(informal)delimiter(')>operator(\))operator(;) keyword(var) ident(bounds) operator(=) local_variable(this)operator(.)ident(getTokenBounds)operator(()operator(\))operator(;) - keyword(if) operator(()ident(bounds)operator([)integer(0)operator(]) operator(!=) integer(-1)operator(\)) operator({) + keyword(if) operator(()ident(bounds)operator([)integer(0)operator(]) operator(!=) operator(-)integer(1)operator(\)) operator({) keyword(var) ident(newValue) operator(=) local_variable(this)operator(.)ident(element)operator(.)ident(value)operator(.)ident(substr)operator(()integer(0)operator(,) ident(bounds)operator([)integer(0)operator(]\))operator(;) keyword(var) ident(whitespace) operator(=) local_variable(this)operator(.)ident(element)operator(.)ident(value)operator(.)ident(substr)operator(()ident(bounds)operator([)integer(0)operator(]\))operator(.)ident(match)operator(()regexp<delimiter(/)content(^)char(\\s)content(+)delimiter(/)>operator(\))operator(;) keyword(if) operator(()ident(whitespace)operator(\)) @@ -322,7 +322,7 @@ ident(Autocompleter)operator(.)ident(Base) operator(=) ident(Class)operator(.)id keyword(if) operator(()ident(value)operator(.)ident(strip)operator(()operator(\))operator(.)ident(empty)operator(()operator(\)\)) keyword(return) operator([-)integer(1)operator(,) integer(0)operator(])operator(;) keyword(var) ident(diff) operator(=) local_variable(arguments)operator(.)ident(callee)operator(.)ident(getFirstDifferencePos)operator(()ident(value)operator(,) local_variable(this)operator(.)ident(oldElementValue)operator(\))operator(;) keyword(var) ident(offset) operator(=) operator(()ident(diff) operator(==) local_variable(this)operator(.)ident(oldElementValue)operator(.)ident(length) operator(?) integer(1) operator(:) integer(0)operator(\))operator(;) - keyword(var) ident(prevTokenPos) operator(=) integer(-1)operator(,) ident(nextTokenPos) operator(=) ident(value)operator(.)ident(length)operator(;) + keyword(var) ident(prevTokenPos) operator(=) operator(-)integer(1)operator(,) ident(nextTokenPos) operator(=) ident(value)operator(.)ident(length)operator(;) keyword(var) ident(tp)operator(;) keyword(for) operator(()keyword(var) ident(index) operator(=) integer(0)operator(,) ident(l) operator(=) local_variable(this)operator(.)ident(options)operator(.)ident(tokens)operator(.)ident(length)operator(;) ident(index) operator(<) ident(l)operator(;) operator(++)ident(index)operator(\)) operator({) ident(tp) operator(=) ident(value)operator(.)ident(lastIndexOf)operator(()local_variable(this)operator(.)ident(options)operator(.)ident(tokens)operator([)ident(index)operator(])operator(,) ident(diff) operator(+) ident(offset) operator(-) integer(1)operator(\))operator(;) @@ -437,14 +437,14 @@ ident(Autocompleter)operator(.)ident(Local) operator(=) ident(Class)operator(.)i ident(elem)operator(.)ident(toLowerCase)operator(()operator(\))operator(.)ident(indexOf)operator(()ident(entry)operator(.)ident(toLowerCase)operator(()operator(\)\)) operator(:) ident(elem)operator(.)ident(indexOf)operator(()ident(entry)operator(\))operator(;) - keyword(while) operator(()ident(foundPos) operator(!=) integer(-1)operator(\)) operator({) + keyword(while) operator(()ident(foundPos) operator(!=) operator(-)integer(1)operator(\)) operator({) keyword(if) operator(()ident(foundPos) operator(==) integer(0) operator(&&) ident(elem)operator(.)ident(length) operator(!=) ident(entry)operator(.)ident(length)operator(\)) operator({) ident(ret)operator(.)ident(push)operator(()string<delimiter(")content(<li><strong>)delimiter(")> operator(+) ident(elem)operator(.)ident(substr)operator(()integer(0)operator(,) ident(entry)operator(.)ident(length)operator(\)) operator(+) string<delimiter(")content(</strong>)delimiter(")> operator(+) ident(elem)operator(.)ident(substr)operator(()ident(entry)operator(.)ident(length)operator(\)) operator(+) string<delimiter(")content(</li>)delimiter(")>operator(\))operator(;) keyword(break)operator(;) operator(}) keyword(else) keyword(if) operator(()ident(entry)operator(.)ident(length) operator(>=) ident(instance)operator(.)ident(options)operator(.)ident(partialChars) operator(&&) - ident(instance)operator(.)ident(options)operator(.)ident(partialSearch) operator(&&) ident(foundPos) operator(!=) integer(-1)operator(\)) operator({) - keyword(if) operator(()ident(instance)operator(.)ident(options)operator(.)ident(fullSearch) operator(||) regexp<delimiter(/)char(\\s)delimiter(/)>operator(.)ident(test)operator(()ident(elem)operator(.)ident(substr)operator(()ident(foundPos)integer(-1)operator(,)integer(1)operator(\)\)\)) operator({) + ident(instance)operator(.)ident(options)operator(.)ident(partialSearch) operator(&&) ident(foundPos) operator(!=) operator(-)integer(1)operator(\)) operator({) + keyword(if) operator(()ident(instance)operator(.)ident(options)operator(.)ident(fullSearch) operator(||) regexp<delimiter(/)char(\\s)delimiter(/)>operator(.)ident(test)operator(()ident(elem)operator(.)ident(substr)operator(()ident(foundPos)operator(-)integer(1)operator(,)integer(1)operator(\)\)\)) operator({) ident(partial)operator(.)ident(push)operator(()string<delimiter(")content(<li>)delimiter(")> operator(+) ident(elem)operator(.)ident(substr)operator(()integer(0)operator(,) ident(foundPos)operator(\)) operator(+) string<delimiter(")content(<strong>)delimiter(")> operator(+) ident(elem)operator(.)ident(substr)operator(()ident(foundPos)operator(,) ident(entry)operator(.)ident(length)operator(\)) operator(+) string<delimiter(")content(</strong>)delimiter(")> operator(+) ident(elem)operator(.)ident(substr)operator(() ident(foundPos) operator(+) ident(entry)operator(.)ident(length)operator(\)) operator(+) string<delimiter(")content(</li>)delimiter(")>operator(\))operator(;) @@ -945,7 +945,7 @@ comment(// Ideal for live-search fields) ident(Form)operator(.)ident(Element)operator(.)ident(DelayedObserver) operator(=) ident(Class)operator(.)ident(create)operator(({) key(initialize)operator(:) keyword(function)operator(()ident(element)operator(,) ident(delay)operator(,) ident(callback)operator(\)) operator({) - local_variable(this)operator(.)ident(delay) operator(=) ident(delay) operator(||) float(0)float(.5)operator(;) + local_variable(this)operator(.)ident(delay) operator(=) ident(delay) operator(||) float(0.5)operator(;) local_variable(this)operator(.)ident(element) operator(=) predefined($)operator(()ident(element)operator(\))operator(;) local_variable(this)operator(.)ident(callback) operator(=) ident(callback)operator(;) local_variable(this)operator(.)ident(timer) operator(=) keyword(null)operator(;) @@ -1192,14 +1192,14 @@ keyword(var) ident(Draggable) operator(=) ident(Class)operator(.)ident(create)op keyword(var) ident(defaults) operator(=) operator({) key(handle)operator(:) keyword(false)operator(,) key(reverteffect)operator(:) keyword(function)operator(()ident(element)operator(,) ident(top_offset)operator(,) ident(left_offset)operator(\)) operator({) - keyword(var) ident(dur) operator(=) ident(Math)operator(.)ident(sqrt)operator(()ident(Math)operator(.)ident(abs)operator(()ident(top_offset)operator(^)integer(2)operator(\))operator(+)ident(Math)operator(.)ident(abs)operator(()ident(left_offset)operator(^)integer(2)operator(\)\))operator(*)float(0)float(.02)operator(;) + keyword(var) ident(dur) operator(=) ident(Math)operator(.)ident(sqrt)operator(()ident(Math)operator(.)ident(abs)operator(()ident(top_offset)operator(^)integer(2)operator(\))operator(+)ident(Math)operator(.)ident(abs)operator(()ident(left_offset)operator(^)integer(2)operator(\)\))operator(*)float(0.02)operator(;) keyword(new) ident(Effect)operator(.)ident(Move)operator(()ident(element)operator(,) operator({) key(x)operator(:) operator(-)ident(left_offset)operator(,) key(y)operator(:) operator(-)ident(top_offset)operator(,) key(duration)operator(:) ident(dur)operator(,) key(queue)operator(:) operator({)key(scope)operator(:)string<delimiter(')content(_draggable)delimiter(')>operator(,) key(position)operator(:)string<delimiter(')content(end)delimiter(')>operator(}) operator(}\))operator(;) operator(})operator(,) key(endeffect)operator(:) keyword(function)operator(()ident(element)operator(\)) operator({) - keyword(var) ident(toOpacity) operator(=) ident(Object)operator(.)ident(isNumber)operator(()ident(element)operator(.)ident(_opacity)operator(\)) operator(?) ident(element)operator(.)ident(_opacity) operator(:) float(1)float(.0)operator(;) - keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({)key(duration)operator(:)float(0)float(.2)operator(,) key(from)operator(:)float(0)float(.7)operator(,) key(to)operator(:)ident(toOpacity)operator(,) + keyword(var) ident(toOpacity) operator(=) ident(Object)operator(.)ident(isNumber)operator(()ident(element)operator(.)ident(_opacity)operator(\)) operator(?) ident(element)operator(.)ident(_opacity) operator(:) float(1.0)operator(;) + keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({)key(duration)operator(:)float(0.2)operator(,) key(from)operator(:)float(0.7)operator(,) key(to)operator(:)ident(toOpacity)operator(,) key(queue)operator(:) operator({)key(scope)operator(:)string<delimiter(')content(_draggable)delimiter(')>operator(,) key(position)operator(:)string<delimiter(')content(end)delimiter(')>operator(})operator(,) key(afterFinish)operator(:) keyword(function)operator(()operator(\))operator({) ident(Draggable)operator(.)ident(_dragging)operator([)ident(element)operator(]) operator(=) keyword(false) @@ -1221,7 +1221,7 @@ keyword(var) ident(Draggable) operator(=) ident(Class)operator(.)ident(create)op key(starteffect)operator(:) keyword(function)operator(()ident(element)operator(\)) operator({) ident(element)operator(.)ident(_opacity) operator(=) ident(Element)operator(.)ident(getOpacity)operator(()ident(element)operator(\))operator(;) ident(Draggable)operator(.)ident(_dragging)operator([)ident(element)operator(]) operator(=) keyword(true)operator(;) - keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({)key(duration)operator(:)float(0)float(.2)operator(,) key(from)operator(:)ident(element)operator(.)ident(_opacity)operator(,) key(to)operator(:)float(0)float(.7)operator(}\))operator(;) + keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({)key(duration)operator(:)float(0.2)operator(,) key(from)operator(:)ident(element)operator(.)ident(_opacity)operator(,) key(to)operator(:)float(0.7)operator(}\))operator(;) operator(}) operator(}\))operator(;) @@ -1715,9 +1715,9 @@ keyword(var) ident(Sortable) operator(=) operator({) key(onHover)operator(:) keyword(function)operator(()ident(element)operator(,) ident(dropon)operator(,) ident(overlap)operator(\)) operator({) keyword(if)operator(()ident(Element)operator(.)ident(isParent)operator(()ident(dropon)operator(,) ident(element)operator(\)\)) keyword(return)operator(;) - keyword(if)operator(()ident(overlap) operator(>) float(.33) operator(&&) ident(overlap) operator(<) float(.66) operator(&&) ident(Sortable)operator(.)ident(options)operator(()ident(dropon)operator(\))operator(.)ident(tree)operator(\)) operator({) + keyword(if)operator(()ident(overlap) operator(>) error(.)integer(33) operator(&&) ident(overlap) operator(<) error(.)integer(66) operator(&&) ident(Sortable)operator(.)ident(options)operator(()ident(dropon)operator(\))operator(.)ident(tree)operator(\)) operator({) keyword(return)operator(;) - operator(}) keyword(else) keyword(if)operator(()ident(overlap)operator(>)float(0)float(.5)operator(\)) operator({) + operator(}) keyword(else) keyword(if)operator(()ident(overlap)operator(>)float(0.5)operator(\)) operator({) ident(Sortable)operator(.)ident(mark)operator(()ident(dropon)operator(,) string<delimiter(')content(before)delimiter(')>operator(\))operator(;) keyword(if)operator(()ident(dropon)operator(.)ident(previousSibling) operator(!=) ident(element)operator(\)) operator({) keyword(var) ident(oldParentNode) operator(=) ident(element)operator(.)ident(parentNode)operator(;) @@ -1752,7 +1752,7 @@ keyword(var) ident(Sortable) operator(=) operator({) keyword(var) ident(child) operator(=) keyword(null)operator(;) keyword(if)operator(()ident(children)operator(\)) operator({) - keyword(var) ident(offset) operator(=) ident(Element)operator(.)ident(offsetSize)operator(()ident(dropon)operator(,) ident(droponOptions)operator(.)ident(overlap)operator(\)) operator(*) operator(()float(1)float(.0) operator(-) ident(overlap)operator(\))operator(;) + keyword(var) ident(offset) operator(=) ident(Element)operator(.)ident(offsetSize)operator(()ident(dropon)operator(,) ident(droponOptions)operator(.)ident(overlap)operator(\)) operator(*) operator(()float(1.0) operator(-) ident(overlap)operator(\))operator(;) keyword(for) operator(()ident(index) operator(=) integer(0)operator(;) ident(index) operator(<) ident(children)operator(.)ident(length)operator(;) ident(index) operator(+=) integer(1)operator(\)) operator({) keyword(if) operator(()ident(offset) operator(-) ident(Element)operator(.)ident(offsetSize) operator(()ident(children)operator([)ident(index)operator(])operator(,) ident(droponOptions)operator(.)ident(overlap)operator(\)) operator(>=) integer(0)operator(\)) operator({) @@ -1949,7 +1949,7 @@ comment(// returns self (or first argument\) if not convertable ) ident(String)operator(.)ident(prototype)operator(.)ident(parseColor) operator(=) keyword(function)operator(()operator(\)) operator({) keyword(var) ident(color) operator(=) string<delimiter(')content(#)delimiter(')>operator(;) keyword(if) operator(()local_variable(this)operator(.)ident(slice)operator(()integer(0)operator(,)integer(4)operator(\)) operator(==) string<delimiter(')content(rgb()delimiter(')>operator(\)) operator({) - keyword(var) ident(cols) operator(=) local_variable(this)operator(.)ident(slice)operator(()integer(4)operator(,)local_variable(this)operator(.)ident(length)integer(-1)operator(\))operator(.)ident(split)operator(()string<delimiter(')content(,)delimiter(')>operator(\))operator(;) + keyword(var) ident(cols) operator(=) local_variable(this)operator(.)ident(slice)operator(()integer(4)operator(,)local_variable(this)operator(.)ident(length)operator(-)integer(1)operator(\))operator(.)ident(split)operator(()string<delimiter(')content(,)delimiter(')>operator(\))operator(;) keyword(var) ident(i)operator(=)integer(0)operator(;) keyword(do) operator({) ident(color) operator(+=) ident(parseInt)operator(()ident(cols)operator([)ident(i)operator(]\))operator(.)ident(toColorPart)operator(()operator(\)) operator(}) keyword(while) operator((++)ident(i)operator(<)integer(3)operator(\))operator(;) operator(}) keyword(else) operator({) keyword(if) operator(()local_variable(this)operator(.)ident(slice)operator(()integer(0)operator(,)integer(1)operator(\)) operator(==) string<delimiter(')content(#)delimiter(')>operator(\)) operator({) @@ -2007,17 +2007,17 @@ keyword(var) ident(Effect) operator(=) operator({) key(Transitions)operator(:) operator({) key(linear)operator(:) ident(Prototype)operator(.)ident(K)operator(,) key(sinoidal)operator(:) keyword(function)operator(()ident(pos)operator(\)) operator({) - keyword(return) operator((-)ident(Math)operator(.)ident(cos)operator(()ident(pos)operator(*)ident(Math)operator(.)ident(PI)operator(\))operator(/)integer(2)operator(\)) operator(+) float(0)float(.5)operator(;) + keyword(return) operator((-)ident(Math)operator(.)ident(cos)operator(()ident(pos)operator(*)ident(Math)operator(.)ident(PI)operator(\))operator(/)integer(2)operator(\)) operator(+) float(0.5)operator(;) operator(})operator(,) key(reverse)operator(:) keyword(function)operator(()ident(pos)operator(\)) operator({) keyword(return) integer(1)operator(-)ident(pos)operator(;) operator(})operator(,) key(flicker)operator(:) keyword(function)operator(()ident(pos)operator(\)) operator({) - keyword(var) ident(pos) operator(=) operator(((-)ident(Math)operator(.)ident(cos)operator(()ident(pos)operator(*)ident(Math)operator(.)ident(PI)operator(\))operator(/)integer(4)operator(\)) operator(+) float(0)float(.75)operator(\)) operator(+) ident(Math)operator(.)ident(random)operator(()operator(\))operator(/)integer(4)operator(;) + keyword(var) ident(pos) operator(=) operator(((-)ident(Math)operator(.)ident(cos)operator(()ident(pos)operator(*)ident(Math)operator(.)ident(PI)operator(\))operator(/)integer(4)operator(\)) operator(+) float(0.75)operator(\)) operator(+) ident(Math)operator(.)ident(random)operator(()operator(\))operator(/)integer(4)operator(;) keyword(return) ident(pos) operator(>) integer(1) operator(?) integer(1) operator(:) ident(pos)operator(;) operator(})operator(,) key(wobble)operator(:) keyword(function)operator(()ident(pos)operator(\)) operator({) - keyword(return) operator((-)ident(Math)operator(.)ident(cos)operator(()ident(pos)operator(*)ident(Math)operator(.)ident(PI)operator(*()integer(9)operator(*)ident(pos)operator(\)\))operator(/)integer(2)operator(\)) operator(+) float(0)float(.5)operator(;) + keyword(return) operator((-)ident(Math)operator(.)ident(cos)operator(()ident(pos)operator(*)ident(Math)operator(.)ident(PI)operator(*()integer(9)operator(*)ident(pos)operator(\)\))operator(/)integer(2)operator(\)) operator(+) float(0.5)operator(;) operator(})operator(,) key(pulse)operator(:) keyword(function)operator(()ident(pos)operator(,) ident(pulses)operator(\)) operator({) ident(pulses) operator(=) ident(pulses) operator(||) integer(5)operator(;) @@ -2028,7 +2028,7 @@ keyword(var) ident(Effect) operator(=) operator({) operator(\))operator(;) operator(})operator(,) key(spring)operator(:) keyword(function)operator(()ident(pos)operator(\)) operator({) - keyword(return) integer(1) operator(-) operator(()ident(Math)operator(.)ident(cos)operator(()ident(pos) operator(*) float(4)float(.5) operator(*) ident(Math)operator(.)ident(PI)operator(\)) operator(*) ident(Math)operator(.)ident(exp)operator((-)ident(pos) operator(*) integer(6)operator(\)\))operator(;) + keyword(return) integer(1) operator(-) operator(()ident(Math)operator(.)ident(cos)operator(()ident(pos) operator(*) float(4.5) operator(*) ident(Math)operator(.)ident(PI)operator(\)) operator(*) ident(Math)operator(.)ident(exp)operator((-)ident(pos) operator(*) integer(6)operator(\)\))operator(;) operator(})operator(,) key(none)operator(:) keyword(function)operator(()ident(pos)operator(\)) operator({) keyword(return) integer(0)operator(;) @@ -2038,12 +2038,12 @@ keyword(var) ident(Effect) operator(=) operator({) operator(}) operator(})operator(,) key(DefaultOptions)operator(:) operator({) - key(duration)operator(:) float(1)float(.0)operator(,) comment(// seconds) + key(duration)operator(:) float(1.0)operator(,) comment(// seconds) key(fps)operator(:) integer(100)operator(,) comment(// 100= assume 66fps max.) key(sync)operator(:) keyword(false)operator(,) comment(// true for combining) - key(from)operator(:) float(0)float(.0)operator(,) - key(to)operator(:) float(1)float(.0)operator(,) - key(delay)operator(:) float(0)float(.0)operator(,) + key(from)operator(:) float(0.0)operator(,) + key(to)operator(:) float(1.0)operator(,) + key(delay)operator(:) float(0.0)operator(,) key(queue)operator(:) string<delimiter(')content(parallel)delimiter(')> operator(})operator(,) key(tagifyText)operator(:) keyword(function)operator(()ident(element)operator(\)) operator({) @@ -2073,8 +2073,8 @@ keyword(var) ident(Effect) operator(=) operator({) ident(elements) operator(=) predefined($)operator(()ident(element)operator(\))operator(.)ident(childNodes)operator(;) keyword(var) ident(options) operator(=) ident(Object)operator(.)ident(extend)operator(({) - key(speed)operator(:) float(0)float(.1)operator(,) - key(delay)operator(:) float(0)float(.0) + key(speed)operator(:) float(0.1)operator(,) + key(delay)operator(:) float(0.0) operator(})operator(,) local_variable(arguments)operator([)integer(2)operator(]) operator(||) operator({) operator(}\))operator(;) keyword(var) ident(masterDelay) operator(=) ident(options)operator(.)ident(delay)operator(;) @@ -2207,7 +2207,7 @@ ident(Effect)operator(.)ident(Base) operator(=) ident(Class)operator(.)ident(cre key(loop)operator(:) keyword(function)operator(()ident(timePos)operator(\)) operator({) keyword(if) operator(()ident(timePos) operator(>=) local_variable(this)operator(.)ident(startOn)operator(\)) operator({) keyword(if) operator(()ident(timePos) operator(>=) local_variable(this)operator(.)ident(finishOn)operator(\)) operator({) - local_variable(this)operator(.)ident(render)operator(()float(1)float(.0)operator(\))operator(;) + local_variable(this)operator(.)ident(render)operator(()float(1.0)operator(\))operator(;) local_variable(this)operator(.)ident(cancel)operator(()operator(\))operator(;) local_variable(this)operator(.)ident(event)operator(()string<delimiter(')content(beforeFinish)delimiter(')>operator(\))operator(;) keyword(if) operator(()local_variable(this)operator(.)ident(finish)operator(\)) local_variable(this)operator(.)ident(finish)operator(()operator(\))operator(;) @@ -2250,7 +2250,7 @@ ident(Effect)operator(.)ident(Parallel) operator(=) ident(Class)operator(.)ident operator(})operator(,) key(finish)operator(:) keyword(function)operator(()ident(position)operator(\)) operator({) local_variable(this)operator(.)ident(effects)operator(.)ident(each)operator(() keyword(function)operator(()ident(effect)operator(\)) operator({) - ident(effect)operator(.)ident(render)operator(()float(1)float(.0)operator(\))operator(;) + ident(effect)operator(.)ident(render)operator(()float(1.0)operator(\))operator(;) ident(effect)operator(.)ident(cancel)operator(()operator(\))operator(;) ident(effect)operator(.)ident(event)operator(()string<delimiter(')content(beforeFinish)delimiter(')>operator(\))operator(;) keyword(if) operator(()ident(effect)operator(.)ident(finish)operator(\)) ident(effect)operator(.)ident(finish)operator(()ident(position)operator(\))operator(;) @@ -2289,8 +2289,8 @@ ident(Effect)operator(.)ident(Opacity) operator(=) ident(Class)operator(.)ident( keyword(if) operator(()ident(Prototype)operator(.)ident(Browser)operator(.)ident(IE) operator(&&) operator((!)local_variable(this)operator(.)ident(element)operator(.)ident(currentStyle)operator(.)ident(hasLayout)operator(\)\)) local_variable(this)operator(.)ident(element)operator(.)ident(setStyle)operator(({)key(zoom)operator(:) integer(1)operator(}\))operator(;) keyword(var) ident(options) operator(=) ident(Object)operator(.)ident(extend)operator(({) - key(from)operator(:) local_variable(this)operator(.)ident(element)operator(.)ident(getOpacity)operator(()operator(\)) operator(||) float(0)float(.0)operator(,) - key(to)operator(:) float(1)float(.0) + key(from)operator(:) local_variable(this)operator(.)ident(element)operator(.)ident(getOpacity)operator(()operator(\)) operator(||) float(0.0)operator(,) + key(to)operator(:) float(1.0) operator(})operator(,) local_variable(arguments)operator([)integer(1)operator(]) operator(||) operator({) operator(}\))operator(;) local_variable(this)operator(.)ident(start)operator(()ident(options)operator(\))operator(;) operator(})operator(,) @@ -2343,7 +2343,7 @@ ident(Effect)operator(.)ident(Scale) operator(=) ident(Class)operator(.)ident(cr key(scaleContent)operator(:) keyword(true)operator(,) key(scaleFromCenter)operator(:) keyword(false)operator(,) key(scaleMode)operator(:) string<delimiter(')content(box)delimiter(')>operator(,) comment(// 'box' or 'contents' or { } with provided values) - key(scaleFrom)operator(:) integer(10)float(0)float(.0)operator(,) + key(scaleFrom)operator(:) float(100.0)operator(,) key(scaleTo)operator(:) ident(percent) operator(})operator(,) local_variable(arguments)operator([)integer(2)operator(]) operator(||) operator({) operator(}\))operator(;) local_variable(this)operator(.)ident(start)operator(()ident(options)operator(\))operator(;) @@ -2380,7 +2380,7 @@ ident(Effect)operator(.)ident(Scale) operator(=) ident(Class)operator(.)ident(cr local_variable(this)operator(.)ident(options)operator(.)ident(scaleMode)operator(.)ident(originalWidth)operator(])operator(;) operator(})operator(,) key(update)operator(:) keyword(function)operator(()ident(position)operator(\)) operator({) - keyword(var) ident(currentScale) operator(=) operator(()local_variable(this)operator(.)ident(options)operator(.)ident(scaleFrom)operator(/)integer(10)float(0)float(.0)operator(\)) operator(+) operator(()local_variable(this)operator(.)ident(factor) operator(*) ident(position)operator(\))operator(;) + keyword(var) ident(currentScale) operator(=) operator(()local_variable(this)operator(.)ident(options)operator(.)ident(scaleFrom)operator(/)float(100.0)operator(\)) operator(+) operator(()local_variable(this)operator(.)ident(factor) operator(*) ident(position)operator(\))operator(;) keyword(if) operator(()local_variable(this)operator(.)ident(options)operator(.)ident(scaleContent) operator(&&) local_variable(this)operator(.)ident(fontSize)operator(\)) local_variable(this)operator(.)ident(element)operator(.)ident(setStyle)operator(({)key(fontSize)operator(:) local_variable(this)operator(.)ident(fontSize) operator(*) ident(currentScale) operator(+) local_variable(this)operator(.)ident(fontSizeType) operator(}\))operator(;) local_variable(this)operator(.)ident(setDimensions)operator(()local_variable(this)operator(.)ident(dims)operator([)integer(0)operator(]) operator(*) ident(currentScale)operator(,) local_variable(this)operator(.)ident(dims)operator([)integer(1)operator(]) operator(*) ident(currentScale)operator(\))operator(;) @@ -2428,8 +2428,8 @@ ident(Effect)operator(.)ident(Highlight) operator(=) ident(Class)operator(.)iden keyword(if) operator((!)local_variable(this)operator(.)ident(options)operator(.)ident(restorecolor)operator(\)) local_variable(this)operator(.)ident(options)operator(.)ident(restorecolor) operator(=) local_variable(this)operator(.)ident(element)operator(.)ident(getStyle)operator(()string<delimiter(')content(background-color)delimiter(')>operator(\))operator(;) comment(// init color calculations) - local_variable(this)operator(.)ident(_base) operator(=) predefined($R)operator(()integer(0)operator(,)integer(2)operator(\))operator(.)ident(map)operator(()keyword(function)operator(()ident(i)operator(\))operator({) keyword(return) ident(parseInt)operator(()local_variable(this)operator(.)ident(options)operator(.)ident(startcolor)operator(.)ident(slice)operator(()ident(i)operator(*)integer(2)integer(+1)operator(,)ident(i)operator(*)integer(2)integer(+3)operator(\))operator(,)integer(16)operator(\)) operator(})operator(.)ident(bind)operator(()local_variable(this)operator(\)\))operator(;) - local_variable(this)operator(.)ident(_delta) operator(=) predefined($R)operator(()integer(0)operator(,)integer(2)operator(\))operator(.)ident(map)operator(()keyword(function)operator(()ident(i)operator(\))operator({) keyword(return) ident(parseInt)operator(()local_variable(this)operator(.)ident(options)operator(.)ident(endcolor)operator(.)ident(slice)operator(()ident(i)operator(*)integer(2)integer(+1)operator(,)ident(i)operator(*)integer(2)integer(+3)operator(\))operator(,)integer(16)operator(\))operator(-)local_variable(this)operator(.)ident(_base)operator([)ident(i)operator(]) operator(})operator(.)ident(bind)operator(()local_variable(this)operator(\)\))operator(;) + local_variable(this)operator(.)ident(_base) operator(=) predefined($R)operator(()integer(0)operator(,)integer(2)operator(\))operator(.)ident(map)operator(()keyword(function)operator(()ident(i)operator(\))operator({) keyword(return) ident(parseInt)operator(()local_variable(this)operator(.)ident(options)operator(.)ident(startcolor)operator(.)ident(slice)operator(()ident(i)operator(*)integer(2)operator(+)integer(1)operator(,)ident(i)operator(*)integer(2)operator(+)integer(3)operator(\))operator(,)integer(16)operator(\)) operator(})operator(.)ident(bind)operator(()local_variable(this)operator(\)\))operator(;) + local_variable(this)operator(.)ident(_delta) operator(=) predefined($R)operator(()integer(0)operator(,)integer(2)operator(\))operator(.)ident(map)operator(()keyword(function)operator(()ident(i)operator(\))operator({) keyword(return) ident(parseInt)operator(()local_variable(this)operator(.)ident(options)operator(.)ident(endcolor)operator(.)ident(slice)operator(()ident(i)operator(*)integer(2)operator(+)integer(1)operator(,)ident(i)operator(*)integer(2)operator(+)integer(3)operator(\))operator(,)integer(16)operator(\))operator(-)local_variable(this)operator(.)ident(_base)operator([)ident(i)operator(]) operator(})operator(.)ident(bind)operator(()local_variable(this)operator(\)\))operator(;) operator(})operator(,) key(update)operator(:) keyword(function)operator(()ident(position)operator(\)) operator({) local_variable(this)operator(.)ident(element)operator(.)ident(setStyle)operator(({)key(backgroundColor)operator(:) predefined($R)operator(()integer(0)operator(,)integer(2)operator(\))operator(.)ident(inject)operator(()string<delimiter(')content(#)delimiter(')>operator(,)keyword(function)operator(()ident(m)operator(,)ident(v)operator(,)ident(i)operator(\))operator({) @@ -2464,8 +2464,8 @@ ident(Effect)operator(.)ident(Fade) operator(=) keyword(function)operator(()iden ident(element) operator(=) predefined($)operator(()ident(element)operator(\))operator(;) keyword(var) ident(oldOpacity) operator(=) ident(element)operator(.)ident(getInlineOpacity)operator(()operator(\))operator(;) keyword(var) ident(options) operator(=) ident(Object)operator(.)ident(extend)operator(({) - key(from)operator(:) ident(element)operator(.)ident(getOpacity)operator(()operator(\)) operator(||) float(1)float(.0)operator(,) - key(to)operator(:) float(0)float(.0)operator(,) + key(from)operator(:) ident(element)operator(.)ident(getOpacity)operator(()operator(\)) operator(||) float(1.0)operator(,) + key(to)operator(:) float(0.0)operator(,) key(afterFinishInternal)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) keyword(if) operator(()ident(effect)operator(.)ident(options)operator(.)ident(to)operator(!=)integer(0)operator(\)) keyword(return)operator(;) ident(effect)operator(.)ident(element)operator(.)ident(hide)operator(()operator(\))operator(.)ident(setStyle)operator(({)key(opacity)operator(:) ident(oldOpacity)operator(}\))operator(;) @@ -2477,8 +2477,8 @@ operator(})operator(;) ident(Effect)operator(.)ident(Appear) operator(=) keyword(function)operator(()ident(element)operator(\)) operator({) ident(element) operator(=) predefined($)operator(()ident(element)operator(\))operator(;) keyword(var) ident(options) operator(=) ident(Object)operator(.)ident(extend)operator(({) - key(from)operator(:) operator(()ident(element)operator(.)ident(getStyle)operator(()string<delimiter(')content(display)delimiter(')>operator(\)) operator(==) string<delimiter(')content(none)delimiter(')> operator(?) float(0)float(.0) operator(:) ident(element)operator(.)ident(getOpacity)operator(()operator(\)) operator(||) float(0)float(.0)operator(\))operator(,) - key(to)operator(:) float(1)float(.0)operator(,) + key(from)operator(:) operator(()ident(element)operator(.)ident(getStyle)operator(()string<delimiter(')content(display)delimiter(')>operator(\)) operator(==) string<delimiter(')content(none)delimiter(')> operator(?) float(0.0) operator(:) ident(element)operator(.)ident(getOpacity)operator(()operator(\)) operator(||) float(0.0)operator(\))operator(,) + key(to)operator(:) float(1.0)operator(,) comment(// force Safari to render floated elements properly) key(afterFinishInternal)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) ident(effect)operator(.)ident(element)operator(.)ident(forceRerendering)operator(()operator(\))operator(;) @@ -2502,8 +2502,8 @@ ident(Effect)operator(.)ident(Puff) operator(=) keyword(function)operator(()iden keyword(return) keyword(new) ident(Effect)operator(.)ident(Parallel)operator(() operator([) keyword(new) ident(Effect)operator(.)ident(Scale)operator(()ident(element)operator(,) integer(200)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(scaleFromCenter)operator(:) keyword(true)operator(,) key(scaleContent)operator(:) keyword(true)operator(,) key(restoreAfterFinish)operator(:) keyword(true) operator(}\))operator(,) - keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(to)operator(:) float(0)float(.0) operator(}) operator(\)) operator(])operator(,) - ident(Object)operator(.)ident(extend)operator(({) key(duration)operator(:) float(1)float(.0)operator(,) + keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(to)operator(:) float(0.0) operator(}) operator(\)) operator(])operator(,) + ident(Object)operator(.)ident(extend)operator(({) key(duration)operator(:) float(1.0)operator(,) key(beforeSetupInternal)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) ident(Position)operator(.)ident(absolutize)operator(()ident(effect)operator(.)ident(effects)operator([)integer(0)operator(])operator(.)ident(element)operator(\)) operator(})operator(,) @@ -2549,12 +2549,12 @@ ident(Effect)operator(.)ident(SwitchOff) operator(=) keyword(function)operator(( ident(element) operator(=) predefined($)operator(()ident(element)operator(\))operator(;) keyword(var) ident(oldOpacity) operator(=) ident(element)operator(.)ident(getInlineOpacity)operator(()operator(\))operator(;) keyword(return) keyword(new) ident(Effect)operator(.)ident(Appear)operator(()ident(element)operator(,) ident(Object)operator(.)ident(extend)operator(({) - key(duration)operator(:) float(0)float(.4)operator(,) + key(duration)operator(:) float(0.4)operator(,) key(from)operator(:) integer(0)operator(,) key(transition)operator(:) ident(Effect)operator(.)ident(Transitions)operator(.)ident(flicker)operator(,) key(afterFinishInternal)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) keyword(new) ident(Effect)operator(.)ident(Scale)operator(()ident(effect)operator(.)ident(element)operator(,) integer(1)operator(,) operator({) - key(duration)operator(:) float(0)float(.3)operator(,) key(scaleFromCenter)operator(:) keyword(true)operator(,) + key(duration)operator(:) float(0.3)operator(,) key(scaleFromCenter)operator(:) keyword(true)operator(,) key(scaleX)operator(:) keyword(false)operator(,) key(scaleContent)operator(:) keyword(false)operator(,) key(restoreAfterFinish)operator(:) keyword(true)operator(,) key(beforeSetup)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) ident(effect)operator(.)ident(element)operator(.)ident(makePositioned)operator(()operator(\))operator(.)ident(makeClipping)operator(()operator(\))operator(;) @@ -2575,9 +2575,9 @@ ident(Effect)operator(.)ident(DropOut) operator(=) keyword(function)operator(()i key(opacity)operator(:) ident(element)operator(.)ident(getInlineOpacity)operator(()operator(\)) operator(})operator(;) keyword(return) keyword(new) ident(Effect)operator(.)ident(Parallel)operator(() operator([) keyword(new) ident(Effect)operator(.)ident(Move)operator(()ident(element)operator(,) operator({)key(x)operator(:) integer(0)operator(,) key(y)operator(:) integer(100)operator(,) key(sync)operator(:) keyword(true) operator(}\))operator(,) - keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(to)operator(:) float(0)float(.0) operator(}\)) operator(])operator(,) + keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(to)operator(:) float(0.0) operator(}\)) operator(])operator(,) ident(Object)operator(.)ident(extend)operator(() - operator({) key(duration)operator(:) float(0)float(.5)operator(,) + operator({) key(duration)operator(:) float(0.5)operator(,) key(beforeSetup)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) ident(effect)operator(.)ident(effects)operator([)integer(0)operator(])operator(.)ident(element)operator(.)ident(makePositioned)operator(()operator(\))operator(;) operator(})operator(,) @@ -2591,10 +2591,10 @@ ident(Effect)operator(.)ident(Shake) operator(=) keyword(function)operator(()ide ident(element) operator(=) predefined($)operator(()ident(element)operator(\))operator(;) keyword(var) ident(options) operator(=) ident(Object)operator(.)ident(extend)operator(({) key(distance)operator(:) integer(20)operator(,) - key(duration)operator(:) float(0)float(.5) + key(duration)operator(:) float(0.5) operator(})operator(,) local_variable(arguments)operator([)integer(1)operator(]) operator(||) operator({)operator(}\))operator(;) keyword(var) ident(distance) operator(=) ident(parseFloat)operator(()ident(options)operator(.)ident(distance)operator(\))operator(;) - keyword(var) ident(split) operator(=) ident(parseFloat)operator(()ident(options)operator(.)ident(duration)operator(\)) operator(/) integer(1)float(0)float(.0)operator(;) + keyword(var) ident(split) operator(=) ident(parseFloat)operator(()ident(options)operator(.)ident(duration)operator(\)) operator(/) float(10.0)operator(;) keyword(var) ident(oldStyle) operator(=) operator({) key(top)operator(:) ident(element)operator(.)ident(getStyle)operator(()string<delimiter(')content(top)delimiter(')>operator(\))operator(,) key(left)operator(:) ident(element)operator(.)ident(getStyle)operator(()string<delimiter(')content(left)delimiter(')>operator(\)) operator(})operator(;) @@ -2734,13 +2734,13 @@ ident(Effect)operator(.)ident(Grow) operator(=) keyword(function)operator(()iden keyword(return) keyword(new) ident(Effect)operator(.)ident(Move)operator(()ident(element)operator(,) operator({) key(x)operator(:) ident(initialMoveX)operator(,) key(y)operator(:) ident(initialMoveY)operator(,) - key(duration)operator(:) float(0)float(.01)operator(,) + key(duration)operator(:) float(0.01)operator(,) key(beforeSetup)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) ident(effect)operator(.)ident(element)operator(.)ident(hide)operator(()operator(\))operator(.)ident(makeClipping)operator(()operator(\))operator(.)ident(makePositioned)operator(()operator(\))operator(;) operator(})operator(,) key(afterFinishInternal)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) keyword(new) ident(Effect)operator(.)ident(Parallel)operator(() - operator([) keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(effect)operator(.)ident(element)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(to)operator(:) float(1)float(.0)operator(,) key(from)operator(:) float(0)float(.0)operator(,) key(transition)operator(:) ident(options)operator(.)ident(opacityTransition) operator(}\))operator(,) + operator([) keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(effect)operator(.)ident(element)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(to)operator(:) float(1.0)operator(,) key(from)operator(:) float(0.0)operator(,) key(transition)operator(:) ident(options)operator(.)ident(opacityTransition) operator(}\))operator(,) keyword(new) ident(Effect)operator(.)ident(Move)operator(()ident(effect)operator(.)ident(element)operator(,) operator({) key(x)operator(:) ident(moveX)operator(,) key(y)operator(:) ident(moveY)operator(,) key(sync)operator(:) keyword(true)operator(,) key(transition)operator(:) ident(options)operator(.)ident(moveTransition) operator(}\))operator(,) keyword(new) ident(Effect)operator(.)ident(Scale)operator(()ident(effect)operator(.)ident(element)operator(,) integer(100)operator(,) operator({) key(scaleMode)operator(:) operator({) key(originalHeight)operator(:) ident(dims)operator(.)ident(height)operator(,) key(originalWidth)operator(:) ident(dims)operator(.)ident(width) operator(})operator(,) @@ -2799,7 +2799,7 @@ ident(Effect)operator(.)ident(Shrink) operator(=) keyword(function)operator(()id operator(}) keyword(return) keyword(new) ident(Effect)operator(.)ident(Parallel)operator(() - operator([) keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(to)operator(:) float(0)float(.0)operator(,) key(from)operator(:) float(1)float(.0)operator(,) key(transition)operator(:) ident(options)operator(.)ident(opacityTransition) operator(}\))operator(,) + operator([) keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(to)operator(:) float(0.0)operator(,) key(from)operator(:) float(1.0)operator(,) key(transition)operator(:) ident(options)operator(.)ident(opacityTransition) operator(}\))operator(,) keyword(new) ident(Effect)operator(.)ident(Scale)operator(()ident(element)operator(,) ident(window)operator(.)ident(opera) operator(?) integer(1) operator(:) integer(0)operator(,) operator({) key(sync)operator(:) keyword(true)operator(,) key(transition)operator(:) ident(options)operator(.)ident(scaleTransition)operator(,) key(restoreAfterFinish)operator(:) keyword(true)operator(}\))operator(,) keyword(new) ident(Effect)operator(.)ident(Move)operator(()ident(element)operator(,) operator({) key(x)operator(:) ident(moveX)operator(,) key(y)operator(:) ident(moveY)operator(,) key(sync)operator(:) keyword(true)operator(,) key(transition)operator(:) ident(options)operator(.)ident(moveTransition) operator(}\)) operator(])operator(,) ident(Object)operator(.)ident(extend)operator(({) @@ -2820,7 +2820,7 @@ ident(Effect)operator(.)ident(Pulsate) operator(=) keyword(function)operator(()i keyword(var) ident(reverser) operator(=) keyword(function)operator(()ident(pos)operator(\))operator({) keyword(return) ident(transition)operator(()integer(1)operator(-)ident(Effect)operator(.)ident(Transitions)operator(.)ident(pulse)operator(()ident(pos)operator(,) ident(options)operator(.)ident(pulses)operator(\)\)) operator(})operator(;) ident(reverser)operator(.)ident(bind)operator(()ident(transition)operator(\))operator(;) keyword(return) keyword(new) ident(Effect)operator(.)ident(Opacity)operator(()ident(element)operator(,) - ident(Object)operator(.)ident(extend)operator(()ident(Object)operator(.)ident(extend)operator(({) key(duration)operator(:) float(2)float(.0)operator(,) key(from)operator(:) integer(0)operator(,) + ident(Object)operator(.)ident(extend)operator(()ident(Object)operator(.)ident(extend)operator(({) key(duration)operator(:) float(2.0)operator(,) key(from)operator(:) integer(0)operator(,) key(afterFinishInternal)operator(:) keyword(function)operator(()ident(effect)operator(\)) operator({) ident(effect)operator(.)ident(element)operator(.)ident(setStyle)operator(({)key(opacity)operator(:) ident(oldOpacity)operator(}\))operator(;) operator(}) operator(})operator(,) ident(options)operator(\))operator(,) operator({)key(transition)operator(:) ident(reverser)operator(}\)\))operator(;) operator(})operator(;) @@ -2882,7 +2882,7 @@ ident(Effect)operator(.)ident(Morph) operator(=) ident(Class)operator(.)ident(cr keyword(if) operator((!)ident(color) operator(||) operator([)string<delimiter(')content(rgba(0, 0, 0, 0\))delimiter(')>operator(,)string<delimiter(')content(transparent)delimiter(')>operator(])operator(.)ident(include)operator(()ident(color)operator(\)\)) ident(color) operator(=) string<delimiter(')content(#ffffff)delimiter(')>operator(;) ident(color) operator(=) ident(color)operator(.)ident(parseColor)operator(()operator(\))operator(;) keyword(return) predefined($R)operator(()integer(0)operator(,)integer(2)operator(\))operator(.)ident(map)operator(()keyword(function)operator(()ident(i)operator(\))operator({) - keyword(return) ident(parseInt)operator(() ident(color)operator(.)ident(slice)operator(()ident(i)operator(*)integer(2)integer(+1)operator(,)ident(i)operator(*)integer(2)integer(+3)operator(\))operator(,) integer(16) operator(\)) + keyword(return) ident(parseInt)operator(() ident(color)operator(.)ident(slice)operator(()ident(i)operator(*)integer(2)operator(+)integer(1)operator(,)ident(i)operator(*)integer(2)operator(+)integer(3)operator(\))operator(,) integer(16) operator(\)) operator(}\))operator(;) operator(}) local_variable(this)operator(.)ident(transforms) operator(=) local_variable(this)operator(.)ident(style)operator(.)ident(map)operator(()keyword(function)operator(()ident(pair)operator(\))operator({) @@ -3069,8 +3069,8 @@ keyword(var) ident(Prototype) operator(=) operator({) key(Browser)operator(:) operator({) key(IE)operator(:) operator(!!()ident(window)operator(.)ident(attachEvent) operator(&&) operator(!)ident(window)operator(.)ident(opera)operator(\))operator(,) key(Opera)operator(:) operator(!!)ident(window)operator(.)ident(opera)operator(,) - key(WebKit)operator(:) ident(navigator)operator(.)ident(userAgent)operator(.)ident(indexOf)operator(()string<delimiter(')content(AppleWebKit/)delimiter(')>operator(\)) operator(>) integer(-1)operator(,) - key(Gecko)operator(:) ident(navigator)operator(.)ident(userAgent)operator(.)ident(indexOf)operator(()string<delimiter(')content(Gecko)delimiter(')>operator(\)) operator(>) integer(-1) operator(&&) ident(navigator)operator(.)ident(userAgent)operator(.)ident(indexOf)operator(()string<delimiter(')content(KHTML)delimiter(')>operator(\)) operator(==) integer(-1)operator(,) + key(WebKit)operator(:) ident(navigator)operator(.)ident(userAgent)operator(.)ident(indexOf)operator(()string<delimiter(')content(AppleWebKit/)delimiter(')>operator(\)) operator(>) operator(-)integer(1)operator(,) + key(Gecko)operator(:) ident(navigator)operator(.)ident(userAgent)operator(.)ident(indexOf)operator(()string<delimiter(')content(Gecko)delimiter(')>operator(\)) operator(>) operator(-)integer(1) operator(&&) ident(navigator)operator(.)ident(userAgent)operator(.)ident(indexOf)operator(()string<delimiter(')content(KHTML)delimiter(')>operator(\)) operator(==) operator(-)integer(1)operator(,) key(MobileSafari)operator(:) operator(!!)ident(navigator)operator(.)ident(userAgent)operator(.)ident(match)operator(()regexp<delimiter(/)content(Apple.*Mobile.*Safari)delimiter(/)>operator(\)) operator(})operator(,) @@ -3304,7 +3304,7 @@ ident(Object)operator(.)ident(extend)operator(()ident(Function)operator(.)ident( operator(}) operator(}\))operator(;) -ident(Function)operator(.)ident(prototype)operator(.)ident(defer) operator(=) ident(Function)operator(.)ident(prototype)operator(.)ident(delay)operator(.)ident(curry)operator(()float(0)float(.01)operator(\))operator(;) +ident(Function)operator(.)ident(prototype)operator(.)ident(defer) operator(=) ident(Function)operator(.)ident(prototype)operator(.)ident(delay)operator(.)ident(curry)operator(()float(0.01)operator(\))operator(;) ident(Date)operator(.)ident(prototype)operator(.)ident(toJSON) operator(=) keyword(function)operator(()operator(\)) operator({) keyword(return) string<delimiter(')content(")delimiter(')> operator(+) local_variable(this)operator(.)ident(getUTCFullYear)operator(()operator(\)) operator(+) string<delimiter(')content(-)delimiter(')> operator(+) @@ -3556,7 +3556,7 @@ ident(Object)operator(.)ident(extend)operator(()ident(String)operator(.)ident(pr operator(})operator(,) key(include)operator(:) keyword(function)operator(()ident(pattern)operator(\)) operator({) - keyword(return) local_variable(this)operator(.)ident(indexOf)operator(()ident(pattern)operator(\)) operator(>) integer(-1)operator(;) + keyword(return) local_variable(this)operator(.)ident(indexOf)operator(()ident(pattern)operator(\)) operator(>) operator(-)integer(1)operator(;) operator(})operator(,) key(startsWith)operator(:) keyword(function)operator(()ident(pattern)operator(\)) operator({) @@ -3731,7 +3731,7 @@ keyword(var) ident(Enumerable) operator(=) operator({) key(include)operator(:) keyword(function)operator(()ident(object)operator(\)) operator({) keyword(if) operator(()ident(Object)operator(.)ident(isFunction)operator(()local_variable(this)operator(.)ident(indexOf)operator(\)\)) - keyword(if) operator(()local_variable(this)operator(.)ident(indexOf)operator(()ident(object)operator(\)) operator(!=) integer(-1)operator(\)) keyword(return) keyword(true)operator(;) + keyword(if) operator(()local_variable(this)operator(.)ident(indexOf)operator(()ident(object)operator(\)) operator(!=) operator(-)integer(1)operator(\)) keyword(return) keyword(true)operator(;) keyword(var) ident(found) operator(=) keyword(false)operator(;) local_variable(this)operator(.)ident(each)operator(()keyword(function)operator(()ident(value)operator(\)) operator({) @@ -3822,7 +3822,7 @@ keyword(var) ident(Enumerable) operator(=) operator({) keyword(return) operator({)key(value)operator(:) ident(value)operator(,) key(criteria)operator(:) ident(iterator)operator(()ident(value)operator(,) ident(index)operator(\)})operator(;) operator(}\))operator(.)ident(sort)operator(()keyword(function)operator(()ident(left)operator(,) ident(right)operator(\)) operator({) keyword(var) ident(a) operator(=) ident(left)operator(.)ident(criteria)operator(,) ident(b) operator(=) ident(right)operator(.)ident(criteria)operator(;) - keyword(return) ident(a) operator(<) ident(b) operator(?) integer(-1) operator(:) ident(a) operator(>) ident(b) operator(?) integer(1) operator(:) integer(0)operator(;) + keyword(return) ident(a) operator(<) ident(b) operator(?) operator(-)integer(1) operator(:) ident(a) operator(>) ident(b) operator(?) integer(1) operator(:) integer(0)operator(;) operator(}\))operator(.)ident(pluck)operator(()string<delimiter(')content(value)delimiter(')>operator(\))operator(;) operator(})operator(,) @@ -3978,7 +3978,7 @@ keyword(if) operator((!)ident(Array)operator(.)ident(prototype)operator(.)ident( keyword(if) operator(()ident(i) operator(<) integer(0)operator(\)) ident(i) operator(=) ident(length) operator(+) ident(i)operator(;) keyword(for) operator((;) ident(i) operator(<) ident(length)operator(;) ident(i)operator(++)operator(\)) keyword(if) operator(()local_variable(this)operator([)ident(i)operator(]) operator(===) ident(item)operator(\)) keyword(return) ident(i)operator(;) - keyword(return) integer(-1)operator(;) + keyword(return) operator(-)integer(1)operator(;) operator(})operator(;) keyword(if) operator((!)ident(Array)operator(.)ident(prototype)operator(.)ident(lastIndexOf)operator(\)) ident(Array)operator(.)ident(prototype)operator(.)ident(lastIndexOf) operator(=) keyword(function)operator(()ident(item)operator(,) ident(i)operator(\)) operator({) @@ -4320,7 +4320,7 @@ ident(Ajax)operator(.)ident(Request) operator(=) ident(Class)operator(.)ident(cr keyword(if) operator(()ident(Object)operator(.)ident(isFunction)operator(()ident(extras)operator(.)ident(push)operator(\)\)) keyword(for) operator(()keyword(var) ident(i) operator(=) integer(0)operator(,) ident(length) operator(=) ident(extras)operator(.)ident(length)operator(;) ident(i) operator(<) ident(length)operator(;) ident(i) operator(+=) integer(2)operator(\)) - ident(headers)operator([)ident(extras)operator([)ident(i)operator(]]) operator(=) ident(extras)operator([)ident(i)integer(+1)operator(])operator(;) + ident(headers)operator([)ident(extras)operator([)ident(i)operator(]]) operator(=) ident(extras)operator([)ident(i)operator(+)integer(1)operator(])operator(;) keyword(else) predefined($H)operator(()ident(extras)operator(\))operator(.)ident(each)operator(()keyword(function)operator(()ident(pair)operator(\)) operator({) ident(headers)operator([)ident(pair)operator(.)ident(key)operator(]) operator(=) ident(pair)operator(.)ident(value) operator(}\))operator(;) operator(}) @@ -4940,7 +4940,7 @@ ident(Element)operator(.)ident(Methods) operator(=) operator({) keyword(var) ident(css) operator(=) ident(document)operator(.)ident(defaultView)operator(.)ident(getComputedStyle)operator(()ident(element)operator(,) keyword(null)operator(\))operator(;) ident(value) operator(=) ident(css) operator(?) ident(css)operator([)ident(style)operator(]) operator(:) keyword(null)operator(;) operator(}) - keyword(if) operator(()ident(style) operator(==) string<delimiter(')content(opacity)delimiter(')>operator(\)) keyword(return) ident(value) operator(?) ident(parseFloat)operator(()ident(value)operator(\)) operator(:) float(1)float(.0)operator(;) + keyword(if) operator(()ident(style) operator(==) string<delimiter(')content(opacity)delimiter(')>operator(\)) keyword(return) ident(value) operator(?) ident(parseFloat)operator(()ident(value)operator(\)) operator(:) float(1.0)operator(;) keyword(return) ident(value) operator(==) string<delimiter(')content(auto)delimiter(')> operator(?) keyword(null) operator(:) ident(value)operator(;) operator(})operator(,) @@ -4969,7 +4969,7 @@ ident(Element)operator(.)ident(Methods) operator(=) operator({) key(setOpacity)operator(:) keyword(function)operator(()ident(element)operator(,) ident(value)operator(\)) operator({) ident(element) operator(=) predefined($)operator(()ident(element)operator(\))operator(;) ident(element)operator(.)ident(style)operator(.)ident(opacity) operator(=) operator(()ident(value) operator(==) integer(1) operator(||) ident(value) operator(===) string<delimiter(')delimiter(')>operator(\)) operator(?) string<delimiter(')delimiter(')> operator(:) - operator(()ident(value) operator(<) float(0)float(.00001)operator(\)) operator(?) integer(0) operator(:) ident(value)operator(;) + operator(()ident(value) operator(<) float(0.00001)operator(\)) operator(?) integer(0) operator(:) ident(value)operator(;) keyword(return) ident(element)operator(;) operator(})operator(,) @@ -5317,7 +5317,7 @@ keyword(else) keyword(if) operator(()ident(Prototype)operator(.)ident(Browser)op keyword(if) operator(()ident(style) operator(==) string<delimiter(')content(opacity)delimiter(')>operator(\)) operator({) keyword(if) operator(()ident(value) operator(=) operator(()ident(element)operator(.)ident(getStyle)operator(()string<delimiter(')content(filter)delimiter(')>operator(\)) operator(||) string<delimiter(')delimiter(')>operator(\))operator(.)ident(match)operator(()regexp<delimiter(/)content(alpha)content(\\()content(opacity=(.*\))content(\\\))delimiter(/)>operator(\)\)) keyword(if) operator(()ident(value)operator([)integer(1)operator(]\)) keyword(return) ident(parseFloat)operator(()ident(value)operator([)integer(1)operator(]\)) operator(/) integer(100)operator(;) - keyword(return) float(1)float(.0)operator(;) + keyword(return) float(1.0)operator(;) operator(}) keyword(if) operator(()ident(value) operator(==) string<delimiter(')content(auto)delimiter(')>operator(\)) operator({) @@ -5343,7 +5343,7 @@ keyword(else) keyword(if) operator(()ident(Prototype)operator(.)ident(Browser)op operator(()ident(filter) operator(=) ident(stripAlpha)operator(()ident(filter)operator(\)\)) operator(?) ident(style)operator(.)ident(filter) operator(=) ident(filter) operator(:) ident(style)operator(.)ident(removeAttribute)operator(()string<delimiter(')content(filter)delimiter(')>operator(\))operator(;) keyword(return) ident(element)operator(;) - operator(}) keyword(else) keyword(if) operator(()ident(value) operator(<) float(0)float(.00001)operator(\)) ident(value) operator(=) integer(0)operator(;) + operator(}) keyword(else) keyword(if) operator(()ident(value) operator(<) float(0.00001)operator(\)) ident(value) operator(=) integer(0)operator(;) ident(style)operator(.)ident(filter) operator(=) ident(stripAlpha)operator(()ident(filter)operator(\)) operator(+) string<delimiter(')content(alpha(opacity=)delimiter(')> operator(+) operator(()ident(value) operator(*) integer(100)operator(\)) operator(+) string<delimiter(')content(\))delimiter(')>operator(;) keyword(return) ident(element)operator(;) @@ -5365,7 +5365,7 @@ keyword(else) keyword(if) operator(()ident(Prototype)operator(.)ident(Browser)op operator(})operator(,) key(_getEv)operator(:) keyword(function)operator(()ident(element)operator(,) ident(attribute)operator(\)) operator({) ident(attribute) operator(=) ident(element)operator(.)ident(getAttribute)operator(()ident(attribute)operator(\))operator(;) - keyword(return) ident(attribute) operator(?) ident(attribute)operator(.)ident(toString)operator(()operator(\))operator(.)ident(slice)operator(()integer(23)operator(,) integer(-2)operator(\)) operator(:) keyword(null)operator(;) + keyword(return) ident(attribute) operator(?) ident(attribute)operator(.)ident(toString)operator(()operator(\))operator(.)ident(slice)operator(()integer(23)operator(,) operator(-)integer(2)operator(\)) operator(:) keyword(null)operator(;) operator(})operator(,) key(_flag)operator(:) keyword(function)operator(()ident(element)operator(,) ident(attribute)operator(\)) operator({) keyword(return) predefined($)operator(()ident(element)operator(\))operator(.)ident(hasAttribute)operator(()ident(attribute)operator(\)) operator(?) ident(attribute) operator(:) keyword(null)operator(;) @@ -5436,8 +5436,8 @@ operator(}) keyword(else) keyword(if) operator(()ident(Prototype)operator(.)ident(Browser)operator(.)ident(Gecko) operator(&&) regexp<delimiter(/)content(rv:1)content(\\.)content(8)content(\\.)content(0)delimiter(/)>operator(.)ident(test)operator(()ident(navigator)operator(.)ident(userAgent)operator(\)\)) operator({) ident(Element)operator(.)ident(Methods)operator(.)ident(setOpacity) operator(=) keyword(function)operator(()ident(element)operator(,) ident(value)operator(\)) operator({) ident(element) operator(=) predefined($)operator(()ident(element)operator(\))operator(;) - ident(element)operator(.)ident(style)operator(.)ident(opacity) operator(=) operator(()ident(value) operator(==) integer(1)operator(\)) operator(?) float(0)float(.999999) operator(:) - operator(()ident(value) operator(===) string<delimiter(')delimiter(')>operator(\)) operator(?) string<delimiter(')delimiter(')> operator(:) operator(()ident(value) operator(<) float(0)float(.00001)operator(\)) operator(?) integer(0) operator(:) ident(value)operator(;) + ident(element)operator(.)ident(style)operator(.)ident(opacity) operator(=) operator(()ident(value) operator(==) integer(1)operator(\)) operator(?) float(0.999999) operator(:) + operator(()ident(value) operator(===) string<delimiter(')delimiter(')>operator(\)) operator(?) string<delimiter(')delimiter(')> operator(:) operator(()ident(value) operator(<) float(0.00001)operator(\)) operator(?) integer(0) operator(:) ident(value)operator(;) keyword(return) ident(element)operator(;) operator(})operator(;) operator(}) @@ -5446,7 +5446,7 @@ keyword(else) keyword(if) operator(()ident(Prototype)operator(.)ident(Browser)op ident(Element)operator(.)ident(Methods)operator(.)ident(setOpacity) operator(=) keyword(function)operator(()ident(element)operator(,) ident(value)operator(\)) operator({) ident(element) operator(=) predefined($)operator(()ident(element)operator(\))operator(;) ident(element)operator(.)ident(style)operator(.)ident(opacity) operator(=) operator(()ident(value) operator(==) integer(1) operator(||) ident(value) operator(===) string<delimiter(')delimiter(')>operator(\)) operator(?) string<delimiter(')delimiter(')> operator(:) - operator(()ident(value) operator(<) float(0)float(.00001)operator(\)) operator(?) integer(0) operator(:) ident(value)operator(;) + operator(()ident(value) operator(<) float(0.00001)operator(\)) operator(?) integer(0) operator(:) ident(value)operator(;) keyword(if) operator(()ident(value) operator(==) integer(1)operator(\)) keyword(if)operator(()ident(element)operator(.)ident(tagName) operator(==) string<delimiter(')content(IMG)delimiter(')> operator(&&) ident(element)operator(.)ident(width)operator(\)) operator({) @@ -6003,7 +6003,7 @@ ident(Object)operator(.)ident(extend)operator(()ident(Selector)operator(,) opera keyword(if) operator(()ident(mm) operator(=) ident(formula)operator(.)ident(match)operator(()regexp<delimiter(/)content(^()char(\\d)content(+\)$)delimiter(/)>operator(\)\)) comment(// digit only) keyword(return) string<delimiter(')content([)delimiter(')> operator(+) ident(fragment) operator(+) string<delimiter(")content(= )delimiter(")> operator(+) ident(mm)operator([)integer(1)operator(]) operator(+) string<delimiter(')content(])delimiter(')>operator(;) keyword(if) operator(()ident(mm) operator(=) ident(formula)operator(.)ident(match)operator(()regexp<delimiter(/)content(^(-?)char(\\d)content(*\)?n(([+-]\)()char(\\d)content(+\)\)?)delimiter(/)>operator(\)\)) operator({) comment(// an+b) - keyword(if) operator(()ident(mm)operator([)integer(1)operator(]) operator(==) string<delimiter(")content(-)delimiter(")>operator(\)) ident(mm)operator([)integer(1)operator(]) operator(=) integer(-1)operator(;) + keyword(if) operator(()ident(mm)operator([)integer(1)operator(]) operator(==) string<delimiter(")content(-)delimiter(")>operator(\)) ident(mm)operator([)integer(1)operator(]) operator(=) operator(-)integer(1)operator(;) keyword(var) ident(a) operator(=) ident(mm)operator([)integer(1)operator(]) operator(?) ident(Number)operator(()ident(mm)operator([)integer(1)operator(]\)) operator(:) integer(1)operator(;) keyword(var) ident(b) operator(=) ident(mm)operator([)integer(2)operator(]) operator(?) ident(Number)operator(()ident(mm)operator([)integer(2)operator(]\)) operator(:) integer(0)operator(;) ident(predicate) operator(=) string<delimiter(")content([((#{fragment} - #{b}\) mod #{a} = 0\) and )delimiter(")> operator(+) @@ -6329,7 +6329,7 @@ ident(Object)operator(.)ident(extend)operator(()ident(Selector)operator(,) opera keyword(for) operator(()keyword(var) ident(i) operator(=) integer(0)operator(,) ident(node)operator(;) ident(node) operator(=) ident(nodes)operator([)ident(i)operator(])operator(;) ident(i)operator(++)operator(\)) keyword(if) operator(()ident(node)operator(.)ident(nodeIndex) operator(==) ident(formula)operator(\)) ident(results)operator(.)ident(push)operator(()ident(node)operator(\))operator(;) operator(}) keyword(else) keyword(if) operator(()ident(m) operator(=) ident(formula)operator(.)ident(match)operator(()regexp<delimiter(/)content(^(-?)char(\\d)content(*\)?n(([+-]\)()char(\\d)content(+\)\)?)delimiter(/)>operator(\)\)) operator({) comment(// an+b) - keyword(if) operator(()ident(m)operator([)integer(1)operator(]) operator(==) string<delimiter(")content(-)delimiter(")>operator(\)) ident(m)operator([)integer(1)operator(]) operator(=) integer(-1)operator(;) + keyword(if) operator(()ident(m)operator([)integer(1)operator(]) operator(==) string<delimiter(")content(-)delimiter(")>operator(\)) ident(m)operator([)integer(1)operator(]) operator(=) operator(-)integer(1)operator(;) keyword(var) ident(a) operator(=) ident(m)operator([)integer(1)operator(]) operator(?) ident(Number)operator(()ident(m)operator([)integer(1)operator(]\)) operator(:) integer(1)operator(;) keyword(var) ident(b) operator(=) ident(m)operator([)integer(2)operator(]) operator(?) ident(Number)operator(()ident(m)operator([)integer(2)operator(]\)) operator(:) integer(0)operator(;) keyword(var) ident(indices) operator(=) ident(Selector)operator(.)ident(pseudos)operator(.)ident(getIndices)operator(()ident(a)operator(,) ident(b)operator(,) ident(nodes)operator(.)ident(length)operator(\))operator(;) |