Evgenii Stratonikov
984aba3113
compiler: process last instructin in writeJumps
...
It is unlikely that we will emit a script with a JMP in the end,
but `writeJumps` must work correctly even in such case.
2020-08-21 09:43:05 +03:00
Evgenii Stratonikov
cfa62e7051
compiler: emit short jumps where possible
...
Convert long jumps to short ones if the offset
can be represented in a single byte.
Close #805 .
2020-08-21 09:43:05 +03:00
Evgenii Stratonikov
681e81420a
vm: make (*Context).IP() return instruction pointer
...
It is misleading to return +1 in code, and user representation
can always be altered.
2020-08-21 08:44:32 +03:00
Evgenii Stratonikov
181569c2a1
compiler: allow to alias interop packages
...
Fix #397 .
2020-08-19 10:13:36 +03:00
Roman Khimov
40bcd4c0bc
Merge pull request #1231 from nspcc-dev/fix/printops
...
vm: pretty-print remaining opcodes
2020-08-14 14:43:29 +03:00
Evgenii Stratonikov
7854dcfd8f
core: replace interop names with named constants
2020-08-14 14:21:54 +03:00
Evgenii Stratonikov
f3650e20b0
vm: move InteropNameToID to a separate package
2020-08-14 13:54:11 +03:00
Anna Shaleva
9456f729be
compiler: generate methods names with lowercased first letter
...
Methods names from debuginfo should match methods names from manifest.
Original method names are stored in ID field.
2020-08-13 13:28:20 +03:00
Anna Shaleva
3c170271c4
compiler: provide namespace for events names
...
For proper NEO3 debugger work we should provide namespaces for events
names in .debug.json files. But we don't have namespaces in .yml
configuration files and don't need this information for .manifest.json
generation, so let's just keep namespaces empty. This do not prevents
debugger from accepting our .debug.json files.
2020-08-13 10:44:46 +03:00
Anna Shaleva
44aefe76b4
compiler: add events to debuginfo from .yml config
2020-08-12 17:48:03 +03:00
Roman Khimov
c3f7a419a0
Merge pull request #1296 from nspcc-dev/smartcontract/examples
...
examples: update examples
2020-08-11 19:09:13 +03:00
Anna Shaleva
b5494320f9
compiler, cli: support events from .yml config file
...
We currently can't process events in codegen, so we have to provide
them via .yml config file. Do not delete the rest of the code connected
with conversion of MethodDebugInfo.Event into manifest.Event as we have
issue #1038 .
2020-08-11 13:42:06 +03:00
Evgenii Stratonikov
a34ba92d46
compiler: allow to split main package across multiple files
2020-08-11 11:12:55 +03:00
Evgenii Stratonikov
553e57c2c4
compiler: make sequence points on global var/const declarations
2020-08-11 11:12:30 +03:00
Evgenii Stratonikov
128626de5c
compiler: save sequence points for init
function
2020-08-11 11:12:30 +03:00
Evgenii Stratonikov
40fa7c0f6e
compiler: emit all used files in DebugInfo.Documents
2020-08-11 11:12:29 +03:00
Evgenii Stratonikov
057e1c6e3c
compiler: provide filename to Compile()
2020-08-11 11:10:45 +03:00
Roman Khimov
f5131491b7
Merge pull request #1271 from nspcc-dev/core/call_from_native
...
core: contractCall from native contracts
2020-08-07 21:24:50 +03:00
Anna Shaleva
995053f2eb
core: add VM into interop context
2020-08-07 16:15:24 +03:00
Roman Khimov
0e2784cd2c
always wrap errors when creating new ones with fmt.Errorf()
...
It doesn't really change anything in most of the cases, but it's a useful
habit anyway.
Fix #350 .
2020-08-07 12:21:52 +03:00
Roman Khimov
5ef08f60ae
remove github.com/pkg/errors from dependencies
...
It's not needed any more with Go 1.13 as we have wrapping/unwrapping in base
packages. All errors.Wrap calls are replaced with fmt.Errorf, some strings are
improved along the way.
2020-08-07 12:21:52 +03:00
Roman Khimov
e1d3223505
Merge pull request #1247 from nspcc-dev/feature/pointers
...
Support pointers in compiler
2020-08-06 13:53:08 +03:00
Evgenii Stratonikov
f2107bfbc4
compiler: copy structs when passing as arguments
...
In Go structs must be copied when used as arguments.
To do so we must clone struct on VM level.
This is done by appending this struct to an intermediate array.
2020-08-05 13:14:38 +03:00
Evgenii Stratonikov
4488f61777
compiler: compile init
even if there are no globals
...
`init` can be useful even if no globals are present,
e.g. we can use some syscall inside.
2020-08-05 12:59:53 +03:00
Evgenii Stratonikov
439d9ff94d
compiler: initialize packages according to go spec
...
`init()` functions should be called during package initialization,
after global variables were processed.
2020-08-05 11:15:07 +03:00
Evgenii Stratonikov
6f2759be3a
compiler: process packages in deterministic order
2020-08-05 11:00:25 +03:00
Evgenii Stratonikov
b771d2d024
compiler: allow to use init
function
...
Process `init()` functions after global variables has been processed.
It's body is saved into the `_initialize` method where all
initialization is performed.
2020-08-05 11:00:25 +03:00
Roman Khimov
ef53a45e7a
Merge pull request #1264 from nspcc-dev/smartcontract/manifest/supported_standards
...
smartcontract: add list of supported standards to manifest
2020-08-04 22:17:00 +03:00
Anna Shaleva
66ceaa6b75
smartcontract: add list of supported standards to manifest
...
Closes #1204
2020-08-04 17:29:44 +03:00
Roman Khimov
fa5ff8dd95
Merge pull request #1242 from nspcc-dev/fix/json
...
Implement lossless stackitem to json conversion
2020-08-04 12:59:47 +03:00
Evgenii Stratonikov
d54c60ded3
compiler: support pointer dereferencing for structs
...
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-08-04 11:14:07 +03:00
Evgenii Stratonikov
eb047b12a7
compiler: support creating pointers to struct
...
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-08-04 11:14:07 +03:00
Roman Khimov
00671deb8f
Merge pull request #1241 from nspcc-dev/fix/string
...
Ensure strings are valid UTF-8 where appropriate
2020-08-03 18:10:27 +03:00
Evgenii Stratonikov
b53f0257f5
stackitem: change ByteArray type to ByteString
...
Adjust only string representation.
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-07-31 16:07:16 +03:00
Evgenii Stratonikov
a781d299e0
compiler: use fully-qualified names for tracking functions
...
Function name now consists of 3 parts:
1) full package path
2) method receiver type (if any)
3) function name itself .
Fix #1150 .
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-07-31 12:07:06 +03:00
Evgenii Stratonikov
528c184f00
compiler: allow to use exported constants
...
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-07-31 12:06:42 +03:00
Evgenii Stratonikov
6df019913d
compiler: allow to use exported variables
...
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-07-31 12:06:42 +03:00
Evgenii Stratonikov
b8d7e93459
compiler: make ForEachFile
accept a package
...
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-07-31 12:06:42 +03:00
Evgenii Stratonikov
ac040a6f22
compiler: remove unused resolveEntryPoint
...
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-07-31 12:06:42 +03:00
Evgenii Stratonikov
7009417325
compiler: allow to declare global variables in multiple files
...
Traverse and count globals across all used files.
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-07-31 12:06:42 +03:00
Evgenii Stratonikov
f40aba4cd0
vm: convert items to UTF-8 strings
...
Add `stackitem.ToString` for seamless string conversion.
2020-07-30 12:37:31 +03:00
Evgenii Stratonikov
51ae12e4fd
*: move syscall handling out of VM
...
Remove interop-related structures from the `vm` package.
Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2020-07-29 13:41:08 +03:00
Evgenii Stratonikov
685d44dbc1
*: support _initialize
method in contracts
...
Invoke `_initialize` method on every call if present.
In NEO3 there is no entrypoint and methods are invoked by offset,
thus `Main` function is no longer required.
We still have special `Main` method in tests to simplify them.
2020-07-27 13:00:35 +03:00
Evgenii Stratonikov
d2ddf7b7cb
*: support invoking methods by offset
...
Allow to invoke methods by offset:
1. Every invoked contract must have manifest.
2. Check arguments count on invocation.
3. Change AppCall to a regular syscall.
4. Add test suite for `System.Contract.Call`.
2020-07-27 13:00:35 +03:00
Evgenii Stratonikov
e87eba51f9
compiler: emit bytecode for unused exported functions
...
Exported functions should always be present in byte-code.
This will be needed later when arbitrary method calls are allowed.
2020-07-27 13:00:35 +03:00
Evgenii Stratonikov
04bf357fa5
compiler: make DebugInfo.convertToManifest public
...
Allow to generate manifest when using compiler as a library.
2020-07-27 11:08:01 +03:00
Evgenii Stratonikov
a892e3ffa8
manifest: add Offset in method descriptor
2020-07-27 11:08:01 +03:00
Evgenii Stratonikov
e52c39ae7e
manifest: remove EntryPoint from manifest
2020-07-27 11:08:01 +03:00
Roman Khimov
2800179ce0
Merge pull request #1226 from nspcc-dev/fix/pusha
...
vm: make offset in PUSHA relative
2020-07-23 23:40:21 +03:00
Roman Khimov
d8a1c3de46
Merge pull request #1221 from nspcc-dev/neo3/interop/post-preview2_adjustment3
...
interop: post-preview2 adjustment, part 3
2020-07-23 20:35:53 +03:00
Evgenii Stratonikov
b8843a2dfa
vm: make offset in PUSHA relative
...
Follow neo-project/neo-vm#317 .
2020-07-23 13:07:30 +03:00
Roman Khimov
18dcc16553
Merge pull request #1222 from nspcc-dev/fix/rvcount
...
Remove return value count
2020-07-23 10:34:34 +03:00
Anna Shaleva
76acef18ad
core: adjust System.Runtime.Platform interop
...
Part of #1055 .
Added `Platform` method to compiler.
2020-07-23 07:51:24 +03:00
Anna Shaleva
2bbe218547
compiler: move SHA256 from builtins to syscalls
...
Now it can be processed as a normal syscall.
2020-07-22 16:58:32 +03:00
Anna Shaleva
b8d82b49ec
core: add Neo.Crypto.RIPEMD160 interop
...
Closes #1193 .
2020-07-22 16:58:32 +03:00
Anna Shaleva
84bf87df52
core: adjust System.Storage.PutEx interop
...
Part of #1055 .
Added System.Storage.PutEx to compiler. Added StorageFlag in order to
denote whether item is constant or not.
2020-07-22 16:58:23 +03:00
Evgenii Stratonikov
261ff3c655
vm: remove alt.stack
...
It is no longer present in NEO3.
2020-07-22 13:20:31 +03:00
Evgenii Stratonikov
3d7fa9de93
*: make Notify interop accept event name
2020-07-20 13:33:32 +03:00
Anna Shaleva
74d2f437f4
core: add System.Binary.Base64Encode(Decode) interops
...
Part of #1055
2020-07-17 12:36:18 +03:00
Anna Shaleva
f31ce9289d
core: add System.Contract.GetCallFlags interop
...
Part of #1055 .
It returns calling flags of the current context.
2020-07-17 12:35:02 +03:00
Anna Shaleva
fddad0b475
core: adjust System.Contract.Create interop
...
Part of #1055 .
It should check given scripthash against manifest groups and return the
contract state as a struct (not interop interface).
2020-07-17 09:28:52 +03:00
Anna Shaleva
d2ec0fed3d
core: adjust System.Blockchain.GetContract interop
...
Part of #1055 .
It should put on stack an array instead of interop interface.
2020-07-17 09:28:52 +03:00
Anna Shaleva
a1f98f92fe
compiler: add ConvertResultToStruct flag
...
Part of #1055 .
There'll be a lot of interops which result with a struct on stack instead
of interop interface, and sometimes their names are the same, so it's
unrelyable to take into account interop name only and don't pay
attention to it's API (package).
Also sort syscalls by package and name.
2020-07-17 08:19:43 +03:00
Anna Shaleva
063a7f683c
compiler: add CheckMultisig interops
...
Part of #918
2020-07-14 16:21:38 +03:00
Anna Shaleva
a3e306ff78
core: implement Secp256k1 Verify and CheckMultisig interops
...
Closes #918 .
2020-07-14 16:21:34 +03:00
Anna Shaleva
17233e1d8e
core: rename Neo.Crypto.Verify to Neo.Crypto.VerifyWithECDsaSecp256r1
...
Part of #918
2020-07-14 16:19:12 +03:00
Anna Shaleva
c4f7b06974
core, compiler: return struct from GetScriptContainer interop
...
Closes #1173
2020-07-14 06:04:48 +03:00
Roman Khimov
bc1d6791b9
compiler: allow to append multiple elements
2020-07-09 13:59:43 +03:00
Roman Khimov
76925fe3e0
compiler: slices must default to nil
2020-07-09 13:07:21 +03:00
Roman Khimov
eee8ac1655
compiler: fix initialization of struct fields, fix #1164
...
Make `s{}` initializers work. Deduplicate code a bit along the way. The test
added follows bf6aa02dcf
test.
2020-07-09 12:27:21 +03:00
Anna Shaleva
56a5c9db11
compiler: compile appcall with dynamic argument
...
Closes #1160
2020-07-08 19:49:14 +03:00
Roman Khimov
694963d607
compiler: fix binary.* syscalls compilation, fix #1152
...
They were attributed to a wrong package.
2020-07-07 21:57:51 +03:00
Roman Khimov
ebe37d1a46
compiler: check for NULL when calculating len(), fix #1153
2020-07-07 21:49:21 +03:00
Anna Shaleva
2200f7ff71
compiler: lowercase the first letter of methods in manifest
...
In order to be compatable with NEP5 standards and C# node we have to
keep the first letter of each manifest method lowercased.
2020-07-07 13:44:47 +03:00
Anna Shaleva
f37831d173
compiler: convert to manifest only methods from main pkg
...
manifest.json should contain only methods from the package where `Main`
function located.
2020-07-07 13:42:15 +03:00
Anna Shaleva
c2dccb6314
compiler: add ability to emit package to debug info
...
Emit package information into MethodDebugInfo
2020-07-07 13:39:58 +03:00
Anna Shaleva
c3a0998cae
compiler: fix bug in codegen
...
Main function (as far as the others uncknown to codegen at the moment of
`convertFuncDecl`) didn't have package set. Fixed.
2020-07-07 13:28:38 +03:00
Anna Shaleva
7d8a3a7065
compiler: exclude unexported methods from manifest
...
We should be able to invoke exported methods only.
2020-07-07 13:23:01 +03:00
Anna Shaleva
4dfb0eb438
compiler, cli: generate manifest.json and debug.json independently
...
We should be able to generate manifest.json without debug.json and vice
versa.
2020-06-30 14:33:19 +03:00
Roman Khimov
ee0d869815
Merge pull request #1126 from nspcc-dev/fix/variable
...
compiler: support variable shadowing
2020-06-30 11:27:52 +03:00
Evgenii Stratonikov
4f64bf86e5
compiler: add test for argument shadowing
...
Thanks @roman-khimov.
2020-06-30 10:41:48 +03:00
Evgenii Stratonikov
26cfae7c9a
compiler: support shadowing via Block statements
2020-06-30 10:31:52 +03:00
Evgenii Stratonikov
40bacc6775
compiler: support variable shadowing
...
Closes #1131 .
2020-06-30 10:31:52 +03:00
Evgenii Stratonikov
1ee4acbdbc
compiler: manage variables in a separate varScope struct
...
Abstract var scope management from the funcScope.
2020-06-30 10:31:51 +03:00
Roman Khimov
372dd71708
Merge pull request #1108 from nspcc-dev/neo3/compiler/nef
...
compiler: support *.nef and *.manifest.json generation
2020-06-29 20:55:47 +03:00
Anna Shaleva
dc5da4f37e
compiler: fix unhandled error
2020-06-29 20:44:03 +03:00
Anna Shaleva
66b6a27b09
compiler: fix DebugInfo JSON marshalling
...
MethodDebugInfo.Parameters should be marshalled as `params`
MethodDebugInfo.ReturnType --> `return`
EventDebugInfo.Parameters --> `params`
(see https://github.com/ngdseattle/design-notes/blob/master/NDX-DN11%20-%20NEO%20Debug%20Info%20Specification.md#v11-format )
2020-06-29 20:42:03 +03:00
Anna Shaleva
45213dda49
compiler: remove unnecessary structures
2020-06-29 09:15:29 +03:00
Anna Shaleva
2f6065f541
compiler, cli: introduce *.manifest.json
...
Add ability to generate NEO3-compatable *.manifest.json into compiler.
This file represets contract manifest and includes ABI information, so
we don't need to create separate *.abi.json file. NEO3 debugger also
needs *.manifest.json only. So, switched from *.abi.json to
*.manifest.json file.
2020-06-29 09:15:29 +03:00
Anna Shaleva
c7746da023
cli, compiler: switch from .avm to .nef
...
We don't generate clear .avm instructions anymore. Instead, use .nef
files with additional metadata.
2020-06-29 09:15:29 +03:00
Evgenii Stratonikov
057e1e2806
compiler: support ...
variadic calls
2020-06-27 10:42:30 +03:00
Evgenii Stratonikov
a88ac44147
compiler: support variadic function definitions
...
Pack variadic arguments into a slice. This currently doen't work with
byte slices though.
2020-06-26 20:05:10 +03:00
Evgenii Stratonikov
c57d4cfff2
compiler: count current amount of locals correctly
2020-06-26 20:05:10 +03:00
Roman Khimov
9ca87855a6
Merge pull request #1101 from nspcc-dev/feature/convert
...
Support type conversions
2020-06-25 18:30:03 +03:00
Evgenii Stratonikov
6ddaed3927
compiler: allow to omit struct field names in literals
2020-06-24 19:33:58 +03:00
Evgenii Stratonikov
5a615d8178
compiler: allow to omit types for nested slices
2020-06-24 19:25:08 +03:00
Evgenii Stratonikov
2c5ab95b8a
compiler: convert to ByteArray for string variables
...
Convert to ByteArray when converting variable to `string`, because
underlying byte-slice changes should not affect result string.
2020-06-24 18:59:36 +03:00
Evgenii Stratonikov
1d275ceb65
compiler: distinguish between type conversions and function calls
...
RN every identifier in call expression is considered to be lambda.
But it also can be type expression, so we need to distinguish between
these cases.
2020-06-24 18:46:32 +03:00
Roman Khimov
53f2e130c0
Merge pull request #1100 from nspcc-dev/neo3/compiler/dbgjson
...
compiler: update debug.json format
2020-06-24 18:35:08 +03:00
Evgenii Stratonikov
904b2136fc
compiler: emit CONVERT opcode for type assertions
...
Emit CONVERT for converting between different types. NeoVM behavior is
different from that of Go (e.g. assertions of `int` and `uint32` are
equivalent).
2020-06-24 18:00:26 +03:00